Os módulos de back-end fornecem uma infraestrutura para processar grandes volumes de mensagens relacionadas com funcionalidades e interagir com a IU do computador do agente. Este tutorial explica o processo de integração de módulos de back-end com o seu sistema de agente.
Para mais informações sobre os conceitos e a estrutura dos módulos de fundo, consulte a documentação Noções básicas dos módulos de back-end.
Pré-requisitos
- Se não o tiver configurado, instale a CLI Google Cloud.
- Crie um tópico do Cloud Pub/Sub para cada tipo de notificação de evento de que precisa do Dialogflow. Anote o ID do tópico e o nome do tópico para uma implementação de back-end posterior.
- Configure o seu perfil de conversa através da consola do Agent Assist com tópicos do Pub/Sub.
Implementação automatizada
A implementação pode ser automatizada por um Google Cloud script de automatização ou terraform.
Script de automatização
Pode consultar ./deploy.sh para ver mais detalhes.
Aplique alterações do Terraform
Pode automatizar a implementação com um script de automatização da CLI gcloud ou o Terraform. Antes de aplicar as alterações do Terraform, conclua os seguintes passos.
- Conceda as seguintes funções do IAM à sua conta:
Project IAM Admin
(roles/resourcemanager.projectIamAdmin)Service Usage Admin
(roles/serviceusage.serviceUsageAdmin)Service Account Admin
(roles/iam.serviceAccountAdmin)Service Account User
(roles/iam.serviceAccountUser)Pub/Sub Admin
(roles/pubsub.admin)Secret Manager Admin
(roles/secretmanager.admin)Cloud Build Editor
(roles/cloudbuild.builds.editor)Artifact Registry Administrator
(roles/artifactregistry.admin)Storage Admin
(roles/storage.admin)Cloud Run Admin
(roles/run.admin)Cloud Memorystore Redis Admin
(roles/redis.admin)Serverless VPC Access Admin
(roles/vpcaccess.admin)
- Crie imagens para o conetor da IU e para o intercetor do Cloud Pub/Sub e anote o nome da imagem.
- Para o conetor de IU, execute o seguinte comando na pasta
./ui-connector
.$ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/aa-integration-backend/ui-connector
- Para o intercetor do Cloud Pub/Sub, execute o seguinte comando na pasta
./cloud-pubsub-interceptor
.$ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/aa-integration-backend/cloud-pubsub-interceptor
- Para o conetor de IU, execute o seguinte comando na pasta
- Crie um contentor do Cloud Storage para armazenar o estado do Terraform e atualize o valor do contentor de back-end em
/terraform/backend.tf
com o seguinte comando.GCP_PROJECT_ID=$(gcloud config get-value project) # Create the Cloud storage bucket gcloud storage buckets create gs://${GCP_PROJECT_ID}-tfstate # Enable Object Versioning to keep the history of your deployments gcloud storage buckets update gs://${GCP_PROJECT_ID}-tfstate --versioning
- Exporte o valor das variáveis do Terraform obrigatórias
gcp_project_id
,ui_connector_docker_image
ecloud_pubsub_interceptor_docker_image
. Exemplo: export TF_VAR_gcp_project_id='you-gcp-project-id'. Em alternativa, pode preencher os respetivos valores diretamente em/terraform/variables.tf
. - Personalize o método de autenticação modificando o método
auth.check_auth()
em/ui-connector/auth.py
.
Se quiser automatizar estes passos através do Cloud Build, siga esta instrução e use o ficheiro de configuração de compilação ./terraform_cloudbuild.yaml. Para permitir que o Cloud Build implemente os serviços, tem de conceder à conta de serviço do Cloud Build as funções do IAM indicadas no passo 1.
Implementação manual
Os passos seguintes explicam como implementar módulos de back-end manualmente.
Configure variáveis de ambiente
Para simplificar os comandos de implementação, recomendamos que defina as seguintes variáveis de ambiente úteis na sua shell. Pode definir as variáveis através do seguinte comando de exemplo:
$ export GCP_PROJECT_ID='aa-integration-service'
Defina as seguintes variáveis de ambiente:
GCP_PROJECT_ID
: O ID do projeto do seu projeto da Cloud Platform que aloja recursos relacionados. Exemplo:my-project
.SERVICE_REGION
: a localização ou a região dos seus serviços e dos Google Cloud recursos relacionados. Recursos da plataforma. Exemplo:us-central1
.
Configure uma conta administrativa
Recomendamos que use Google Cloud contas separadas para a administração de serviços e a identidade de tempo de execução. A administração de serviços é realizada principalmente por humanos com Contas Google, enquanto a identidade de tempo de execução concede autorizações aos serviços do Cloud Run através de contas de serviço para permitir o acesso aos recursos necessários.
Prepare a conta administrativa humana
Se planeia usar uma conta que já tenha autorizações de Editor ou Proprietário no seu projeto, pode avançar para a secção seguinte.
Para gerir a infraestrutura de back-end, estabeleça uma conta de administrador e conceda-lhe as seguintes funções de gestão de identidade e de acesso (IAM). As respetivas autorizações estão todas incluídas nas funções básicas de editor e proprietário.
roles/secretmanager.admin
(Administrador do Secret Manager): faça a gestão dos segredos armazenados no Secret Manager para a geração e validação de JWTs.roles/run.admin
(Administrador do Cloud Run): implemente e faça a gestão dos serviços do Cloud Run.roles/iam.serviceAccountUser
(Utilizador da conta de serviço): conceda autorizaçõesiam.serviceAccounts.actAs
às contas de serviço de tempo de execução do Cloud Run.roles/cloudbuild.builds.editor
(Editor do Cloud Build): crie imagens Docker para os serviços de integração através do Cloud Build.- Administrador do Artifact Registry: armazene e faça a gestão de imagens Docker criadas para os serviços de integração.
roles/pubsub.editor
(Editor do Cloud Pub/Sub): crie e faça a gestão de tópicos e subscrições do Cloud Pub/Sub.roles/redis.admin
(Administrador do Redis): crie e faça a gestão de recursos do Memorystore for Redis.
Para conceder funções IAM a uma conta humana, use o comando
add-iam-policy-binding
da CLI gcloud. Segue-se um exemplo de comando:
$ gcloud projects add-iam-policy-binding $GCP_PROJECT_ID \ --member='user:test-user@gmail.com' \ --role='roles/pubsub.editor'
Defina a conta administrativa humana no gcloud
Substitua $ADMIN_ACCOUNT
pela conta de administrador que quer usar
(por exemplo: myaccount@gmail.com
) no seguinte exemplo:
$ gcloud config set account $ADMIN_ACCOUNT
Configure contas de serviço
Por predefinição, os serviços ou as tarefas do Cloud Run são executados como a conta de serviço predefinida do Compute Engine. Em vez de deixar a predefinição, recomendamos que atribua a cada serviço do Cloud Run uma identidade dedicada, atribuindo-lhe uma conta de serviço gerida pelo utilizador com o conjunto mínimo necessário de autorizações. Se planeia manter a conta de serviço predefinida, pode avançar para definir variáveis de ambiente.
Crie duas contas de serviço para cada tempo de execução do Cloud Run
Para criar as contas de serviço, substitua o valor de
$CONNECTOR_SERVICE_ACCOUNT_ID
e$INTERCEPTOR_SERVICE_ACCOUNT_ID
, se necessário, e execute os seguintes comandos:$ export CONNECTOR_SERVICE_ACCOUNT_ID='aa-ui-connector' && gcloud iam service-accounts create $CONNECTOR_SERVICE_ACCOUNT_ID \ --description='Agent Assist integration - UI connector service account' \ --display-name='Agent Assist integration - UI connector' $ export INTERCEPTOR_SERVICE_ACCOUNT_ID='aa-pubsub-interceptor' && gcloud iam service-accounts create $INTERCEPTOR_SERVICE_ACCOUNT_ID \ --description='Agent Assist integration - Pubsub interceptor service account' \ --display-name='Agent Assist integration - Pubsub interceptor'
Use o seguinte comando de exemplo para atribuir as seguintes funções às contas de serviço do conetor da IU e do conetor do Cloud Pub/Sub:
$ gcloud projects add-iam-policy-binding $GCP_PROJECT_ID \ --member='serviceAccount:$CONNECTOR_SERVICE_ACCOUNT_ID@$GCP_PROJECT_ID.iam.gserviceaccount.com' \ --role='roles/pubsub.editor'
Conceda as seguintes funções do IAM à conta de serviço do conector da IU:
roles/redis.editor
roles/vpcaccess.user
roles/compute.viewer
roles/secretmanager.secretAccessor
roles/dialogflow.agentAssistClient
Conceda as seguintes funções à conta de serviço do conetor do Cloud Pub/Sub:
roles/redis.editor
roles/vpcaccess.user
roles/compute.viewer
Defina variáveis de ambiente
Defina os valores das seguintes variáveis de ambiente para serem as contas de serviço que acabou de criar ou a conta de serviço predefinida do Compute Engine no seu projeto.
CONNECTOR_SERVICE_ACCOUNT
: a conta de serviço para o tempo de execução do conector da IU. Exemplo:aa-ui-connector@my-project-id.iam.gserviceaccount.com
.INTERCEPTOR_SERVICE_ACCOUNT
: A conta de serviço para o tempo de execução do interceptor do Cloud Pub/Sub. Exemplo:aa-pubsub-interceptor@my-project-id.iam.gserviceaccount.com
.
Personalize o método de autenticação do utilizador
O repositório de código suporta utilizadores de back-end e utilizadores do módulo de front-end para o Genesys Cloud e o Twilio.
- No repositório de código, abra o ficheiro
ui_connector/auth.py
. Especifique o fornecedor de identidade suportado definindo a variável de ambiente
AUTH_OPTION
ou implemente o seu método de autenticação comauth.check_auth
.Por predefinição,
AUTH_OPTION
está vazio e nenhum utilizador pode registar JWT com o serviço UI Connector. Valores suportados:Salesforce
: valide o token de autorização através do Salesforce OpenID Connect. Variável de ambiente obrigatória: SALESFORCE_ORGANIZATION_ID.SalesforceLWC
: valide um token de autorização de credenciais do cliente OAuth do Salesforce através do ponto final RESToauth2/userinfo
. Variáveis de ambiente obrigatórias: SALESFORCE_ORGANIZATION_ID, SALESFORCE_DOMAIN.GenesysCloud
: valide o token de autorização através da UsersAPI do SDK do Genesys.Twilio
: valide o token de autorização da Twilio. Variável de ambiente obrigatória: TWILIO_FLEX_ENVIRONMENT.Skip
: ignorar a validação do token de autorização. Não deve ser usado em produção.
Exemplo:
$ export AUTH_OPTION='Salesforce'
Cada tipo de token pode ter um meio de validação diferente. A forma como o token é validado é da sua responsabilidade. Sem alterações,
auth.check_auth
devolvefalse
para cada pedido.
Personalize as origens permitidas (recomendado)
Para limitar as origens que podem aceder ao seu serviço, altere o valor da variável config.CORS_ALLOWED_ORIGINS
. O valor predefinido *
permite que qualquer origem visite o seu serviço.
Gere e armazene uma chave secreta JWT
Para que o serviço do conetor da IU envie tokens de autenticação seguros de volta ao cliente, tem de encriptá-los através de uma chave secreta JWT. O valor da chave pode ser qualquer string arbitrária, embora deva ser exclusivo e difícil de adivinhar.
Esta chave secreta vai ser armazenada no Secret Manager.
Definir variável de ambiente
JWT_SECRET_NAME
: o nome da chave secreta no Secret Manager. Pode ser qualquer nome arbitrário. Valor recomendado:aa-integration-jwt-secret
.
Gere a chave
Recomendamos que gere um hash aleatório como a chave secreta do JWT para que não possa ser adivinhado por atacantes. Para o fazer, pode usar o módulo python secrets para gerar números aleatórios seguros.
# generate_secret_key.py import secrets jwt_secret_key = secrets.token_bytes(16) print(jwt_secret_key) # Output example: b'L\x9b\xd6i4\xc3\x1d\x95\xe3\xf78z\xdda\x97\xec'
Armazene a chave no Secret Manager
No comando de exemplo seguinte, substitua my_key
pela chave secreta que planeia usar.
$ python generate_secret_key.py | gcloud secrets create $JWT_SECRET_NAME --data-file=- \ --replication-policy=user-managed --locations=$SERVICE_REGION
Configure o Memorystore for Redis
Para configurar o Redis, precisa das seguintes variáveis de ambiente:
VPC_CONNECTOR_NAME
: o nome do seu conetor de acesso à VPC sem servidor para ligar os serviços do Cloud Run ao Memorystore para Redis. Valor recomendado:aa-integration-vpc
.VPC_NETWORK
: a rede VPC à qual anexar o conector de acesso a VPC sem servidor. O valor deve serdefault
se não configurar a VPC para o seu projeto Google Cloud .VPC_SUBNET
: o nome da rede VPC autorizada à qual a sua instância do Redis está associada. O valor deve serdefault
se não tiver personalizado as definições da rede VPC.REDIS_IP_RANGE
: uma rede IP interna não reservada para o conector do Acesso a VPC sem servidor. É necessário/28
de espaço não atribuído. Valor recomendado:10.8.0.0/28
(este valor deve funcionar para a maioria dos novos projetos).REDIS_INSTANCE_ID
: um nome para a sua instância de Redis. Valor recomendado:aa-integration-redis
.
Crie uma instância do Redis na região dos seus serviços do Cloud Run
Execute o seguinte comando:
$ gcloud redis instances create $REDIS_INSTANCE_ID --size=5 --region=$SERVICE_REGION
Pode estabelecer ligação a uma instância do Redis a partir do Cloud Run através da saída direta ou do acesso a VPC sem servidor.
Crie um conetor do Acesso a VPC sem servidor {:#create-svpca-connector} (opcional)
Agora, esta opção é facultativa se os clientes escolherem a saída direta. Se escolher o Acesso a VPC sem servidor, tem de criar um conetor do Acesso a VPC sem servidor. Para mais detalhes sobre este passo, consulte o tutorial do Cloud Run.
Confirme se a API Serverless VPC Access está ativada para o projeto:
$ gcloud services enable vpcaccess.googleapis.com
Crie um conetor de acesso a VPC sem servidor com um intervalo de IPs personalizado:
$ gcloud compute networks vpc-access connectors create $VPC_CONNECTOR_NAME \ --network $VPC_NETWORK \ --region $SERVICE_REGION \ --range $REDIS_IP_RANGE
Guarde o anfitrião e a porta do Redis como variáveis de ambiente
- Defina o endereço IP da sua instância do Redis para a variável de ambiente
REDIS_HOST
. - Defina o número da porta da sua instância do Redis para a variável de ambiente
REDIS_PORT
.
Implemente o serviço do conetor da IU
Para o serviço de conector da IU, precisa das seguintes variáveis de ambiente:
CONNECTOR_SERVICE_NAME
: o nome do serviço do Cloud Run do conector da IU. Valor recomendado:ui-connector
.CONNECTOR_IMAGE_NAME
: o nome da imagem do seu serviço UI Connector. Pode ser igual aCONNECTOR_SERVICE_NAME
. Valor recomendado:ui-connector
.
Crie a imagem de Docker
Na pasta /ui-connector
, execute o seguinte comando:
$ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/$CONNECTOR_IMAGE_NAME
Implemente o conetor da IU no Cloud Run
Na pasta /ui-connector
,
execute o seguinte comando:
- Se usar a saída direta para estabelecer ligação para a ligação Redis.
$ gcloud run deploy $CONNECTOR_IMAGE_NAME \ --image gcr.io/$GCP_PROJECT_ID/$CONNECTOR_IMAGE_NAME \ --platform managed \ --service-account=$CONNECTOR_SERVICE_ACCOUNT_NAME \ --allow-unauthenticated \ --timeout 3600 \ --region $SERVICE_REGION \ --network $VPC_NETWORK \ --subnet $VPC_SUBNET \ --clear-vpc-connector \ --min-instances=1 \ --set-env-vars REDISHOST=$REDIS_HOST,REDISPORT=$REDIS_PORT,GCP_PROJECT_ID=$GCP_PROJECT_ID,AUTH_OPTION=$AUTH_OPTION \ --update-secrets=/secret/jwt_secret_key=${JWT_SECRET_NAME}:latest
- Se estiver a usar um conetor do Acesso a VPC sem servidor criado para a ligação Redis.
$ gcloud run deploy $CONNECTOR_IMAGE_NAME \ --image gcr.io/$GCP_PROJECT_ID/$CONNECTOR_IMAGE_NAME \ --platform managed \ --service-account=$CONNECTOR_SERVICE_ACCOUNT_NAME \ --allow-unauthenticated \ --timeout 3600 \ --region $SERVICE_REGION \ --vpc-connector $VPC_CONNECTOR_NAME \ --clear-network \ --min-instances=1 \ --no-cpu-throttling \ --set-env-vars REDISHOST=$REDIS_HOST,REDISPORT=$REDIS_PORT,GCP_PROJECT_ID=$GCP_PROJECT_ID,AUTH_OPTION=$AUTH_OPTION \ --update-secrets=/secret/jwt_secret_key=${JWT_SECRET_NAME}:latest
Tome nota do URL do serviço para o conetor da IU implementado, que vai ser usado pelos clientes (estações de trabalho dos agentes).
Implemente o serviço de intercetor do Cloud Pub/Sub
Para o serviço de intercetor do Pub/Sub, precisa das seguintes variáveis de ambiente:
INTERCEPTOR_SERVICE_NAME
: o nome do serviço do Cloud Run do seu intercetor do Cloud Pub/Sub. Valor recomendado:cloud-pubsub-interceptor
.INTERCEPTOR_IMAGE_NAME
: o nome da imagem do seu serviço de intercetor do Cloud Pub/Sub. Pode ser igual aINTERCEPTOR_SERVICE_NAME
. Valor recomendado:cloud-pubsub-interceptor
.INTERCEPTOR_SERVICE_ACCOUNT_NAME
: a conta de serviço para o tempo de execução do intercetor do Cloud Pub/Sub.
Crie a imagem de Docker
Na pasta /cloud-pubsub-interceptor
, execute o seguinte comando:
$ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/$INTERCEPTOR_IMAGE_NAME
Implemente o intercetor do Pub/Sub no Cloud Run
Na pasta /cloud-pubsub-interceptor
, execute o seguinte comando:
- Se usar a saída direta para estabelecer ligação para a ligação Redis.
$ gcloud run deploy $INTERCEPTOR_SERVICE_NAME \ --image gcr.io/$GCP_PROJECT_ID/$INTERCEPTOR_IMAGE_NAME \ --platform managed \ --service-account=$INTERCEPTOR_SERVICE_ACCOUNT_NAME \ --region $SERVICE_REGION \ --network $VPC_NETWORK \ --subnet $VPC_SUBNET \ --clear-vpc-connector \ --ingress=internal \ --min-instances=1 \ --no-cpu-throttling \ # You can also add LOGGING_FILE here to specify the logging file path on Cloud Run. --set-env-vars REDISHOST=$REDIS_HOST,REDISPORT=$REDIS_PORT
- Se estiver a usar um conetor do Acesso a VPC sem servidor criado para a ligação Redis.
$ gcloud run deploy $INTERCEPTOR_SERVICE_NAME \ --image gcr.io/$GCP_PROJECT_ID/$INTERCEPTOR_IMAGE_NAME \ --platform managed \ --service-account=$INTERCEPTOR_SERVICE_ACCOUNT_NAME \ --region $SERVICE_REGION \ --vpc-connector $VPC_CONNECTOR_NAME \ --clear-network \ --ingress=internal \ --min-instances=1 \ # You can also add LOGGING_FILE here to specify the logging file path on Cloud Run. --set-env-vars REDISHOST=$REDIS_HOST,REDISPORT=$REDIS_PORT
Guarde o URL implementado
Defina o URL implementado como a variável de ambiente INTERCEPTOR_SERVICE_URL
.
Configure subscrições do Cloud Pub/Sub
As subscrições do Cloud Pub/Sub usam o seguinte:
- Tópicos
- Perfil de conversa
- Conta de serviço
- Autorização da conta de serviço para o serviço de intercetor
Crie tópicos do Cloud Pub/Sub
Crie um tópico do Cloud Pub/Sub para cada tipo de notificação de evento de que precisa do Dialogflow. Os tipos de notificações de eventos disponíveis são:
- Novos eventos de sugestão: eventos enviados quando estão disponíveis novas sugestões do Agent Assist (por exemplo, novas sugestões de Resposta inteligente em resposta a uma expressão do cliente).
- Eventos de novas mensagens: eventos enviados sempre que é reconhecida uma nova expressão
de um agente ou de um cliente (por exemplo, o cliente diz
Hi
). - Novos eventos do ciclo de vida da conversa: eventos enviados para determinadas alterações do ciclo de vida da conversa (por exemplo, quando uma conversa é iniciada ou quando é concluída).
- Novos eventos de notificação de resultados de reconhecimento: eventos enviados quando a transcrição intermédia é reconhecida a partir de um agente ou de um cliente (por exemplo, o cliente diz
Hi, how can I help you?
, é gerada uma transcrição intermédiaHi how can
enquanto o cliente está a falar).
Tome nota do ID do tópico e do nome do tópico para implementação posterior no back-end.
Configure um perfil de conversa
Configure um perfil de conversa com os tópicos do Cloud Pub/Sub que criou no passo anterior.
- Quando criar um novo perfil de conversa, selecione Notificações do Pub/Sub e, de seguida, Ativar notificações do Pub/Sub. Depois de ativadas, pode selecionar as caixas junto aos tipos de notificações que quer ativar e introduzir o ID do tópico do tópico do Cloud Pub/Sub associado à notificação.
- Selecione
JSON
como formato de mensagem para cada tópico.
Crie uma conta de serviço para a identidade de subscrição do Pub/Sub
Crie uma conta de serviço que represente a identidade da subscrição do Pub/Sub através do seguinte comando:
$ gcloud iam service-accounts create cloud-run-pubsub-invoker \ --display-name "Cloud Run Pub/Sub Invoker"
Conceda à conta de serviço autorização para invocar o seu serviço de intercetor
Execute o seguinte comando:
$ gcloud run services add-iam-policy-binding $INTERCEPTOR_SERVICE_NAME \ --member=serviceAccount:cloud-run-pubsub-invoker@$GCP_PROJECT_ID.iam.gserviceaccount.com \ --role=roles/run.invoker
Crie subscrições do Cloud Pub/Sub para tópicos
Para cada tópico que criou, tem de criar uma subscrição do Cloud Pub/Sub correspondente.
Novos eventos de sugestão
Substitua your-new-suggestion-topic-id
pelo tópico do Cloud Pub/Sub que configurou para novas sugestões:
$ export TOPIC_ID='your-new-suggestion-topic-id' && gcloud pubsub subscriptions create $SUBSCRIPTION_NAME --topic $TOPIC_ID \ --push-endpoint=$INTERCEPTOR_SERVICE_URL/human-agent-assistant-event \ --push-auth-service-account=cloud-run-pubsub-invoker@$GCP_PROJECT_ID.iam.gserviceaccount.com
Novos eventos de mensagens
Substitua your-new-message-event-topic-id
pelo tópico do Cloud Pub/Sub que configurou para novos eventos de mensagens:
$ export TOPIC_ID='your-new-message-event-topic-id' && gcloud pubsub subscriptions create $SUBSCRIPTION_NAME --topic $TOPIC_ID \ --push-endpoint=$INTERCEPTOR_SERVICE_URL/new-message-event \ --push-auth-service-account=cloud-run-pubsub-invoker@$GCP_PROJECT_ID.iam.gserviceaccount.com
Eventos de ciclo de vida da conversa
Substitua your-conversation-lifecycle-event-topic
pelo tópico do Cloud Pub/Sub que configurou para novos eventos do ciclo de vida da conversa:
$ export TOPIC_ID='your-conversation-lifecycle-event-topic' && gcloud pubsub subscriptions create $SUBSCRIPTION_NAME --topic $TOPIC_ID \ --push-endpoint=$INTERCEPTOR_SERVICE_URL/conversation-lifecycle-event \ --push-auth-service-account=cloud-run-pubsub-invoker@$GCP_PROJECT_ID.iam.gserviceaccount.com
Novos eventos de notificação de resultado de reconhecimento
$ export TOPIC_ID='your-new-recognition-result-notification-event-topic' && gcloud pubsub subscriptions create $SUBSCRIPTION_NAME --topic $TOPIC_ID \ --push-endpoint=$INTERCEPTOR_SERVICE_URL/new-recognition-result-notification-event \ --push-auth-service-account=cloud-run-pubsub-invoker@$GCP_PROJECT_ID.iam.gserviceaccount.com