Os módulos de back-end fornecem uma infraestrutura para processar grandes volumes de mensagens relacionadas a recursos e interagir com a UI do usuário da área de trabalho do agente. Neste tutorial, mostramos como integrar módulos de back-end ao sistema de agente.
Para mais informações sobre conceitos e estrutura de módulos em segundo plano, consulte a documentação Noções básicas sobre módulos de back-end.
Pré-requisitos
- Se você ainda não tiver feito isso, instale a Google Cloud CLI.
- Crie um tópico do Cloud Pub/Sub para cada tipo de notificação de evento que você precisa do Dialogflow. Anote o ID e o nome do tópico para implantação posterior do back-end.
- Configure seu perfil de conversa usando o console da Assistente de IA com tópicos do Pub/Sub.
Implantação automatizada
A implantação pode ser automatizada por um Google Cloud script de automação ou pelo Terraform.
Script de automação
Confira ./deploy.sh para mais detalhes.
Aplicar mudanças do Terraform
É possível automatizar a implantação com um script de automação da CLI gcloud ou o Terraform. Antes de aplicar as mudanças do Terraform, siga estas etapas.
- Conceda os seguintes papéis 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 conector de interface e para o interceptor do Cloud Pub/Sub e anote o nome da imagem.
- Para o conector de interface, execute o seguinte comando na pasta
./ui-connector
.$ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/aa-integration-backend/ui-connector
- Para o interceptor 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 conector de interface, execute o seguinte comando na pasta
- Crie um bucket do Cloud Storage para armazenar o estado do Terraform e atualize o valor do bucket de back-end em
/terraform/backend.tf
usando 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 necessárias do Terraform
gcp_project_id
,ui_connector_docker_image
ecloud_pubsub_interceptor_docker_image
. Exemplo: export TF_VAR_gcp_project_id='you-gcp-project-id'. Como alternativa, você pode preencher os 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 essas etapas usando o Cloud Build, siga esta instrução e use o arquivo de configuração de build ./terraform_cloudbuild.yaml. Para permitir que o Cloud Build implante os serviços, conceda à conta de serviço do Cloud Build os papéis do IAM listados na etapa 1.
Implantação manual
As etapas a seguir explicam como implantar módulos de back-end manualmente.
Configurar variáveis de ambiente
Para simplificar os comandos de implantação, recomendamos que você defina as seguintes variáveis de ambiente úteis no shell. Você pode definir as variáveis usando o seguinte comando de exemplo:
$ export GCP_PROJECT_ID='aa-integration-service'
Configure as variáveis de ambiente a seguir:
GCP_PROJECT_ID
: o ID do projeto do Cloud Platform que hospeda recursos relacionados. Exemplo:my-project
.SERVICE_REGION
: o local ou a região dos seus serviços e dos recursos Google Cloud relacionados. Recursos da plataforma. Exemplo:us-central1
.
Configurar uma conta administrativa
Recomendamos usar contas Google Cloud separadas para administração de serviços e identidade de tempo de execução. A administração de serviços é feita principalmente por humanos com Contas do Google, enquanto a identidade de tempo de execução concede permissões aos serviços do Cloud Run usando contas de serviço para permitir o acesso aos recursos necessários.
Preparar a conta administrativa humana
Se você planeja usar uma conta que já tem permissões de editor ou proprietário no seu projeto, pule para a próxima seção.
Para gerenciar a infraestrutura de back-end, crie uma conta de administrador e conceda a ela os seguintes papéis do Identity and Access Management (IAM). Todas as permissões deles estão incluídas nos papéis básicos de editor e proprietário.
roles/secretmanager.admin
(administrador do Secret Manager): gerencie os secrets armazenados no Secret Manager para geração e verificação de JWTs.roles/run.admin
(administrador do Cloud Run): implante e gerencie serviços do Cloud Run.roles/iam.serviceAccountUser
(usuário da conta de serviço): conceda permissõesiam.serviceAccounts.actAs
às contas de serviço do ambiente de execução do Cloud Run.roles/cloudbuild.builds.editor
(Editor do Cloud Build): crie imagens Docker para os serviços de integração usando o Cloud Build.- Administrador do Artifact Registry: armazena e gerencia imagens do Docker criadas para os serviços de integração.
roles/pubsub.editor
(Editor do Cloud Pub/Sub): crie e gerencie tópicos e assinaturas do Cloud Pub/Sub.roles/redis.admin
(administrador do Redis): crie e gerencie recursos do Memorystore para Redis.
Para conceder papéis do IAM a uma conta humana, use o
comando da Google Cloud CLI add-iam-policy-binding
. Confira um exemplo de comando:
$ gcloud projects add-iam-policy-binding $GCP_PROJECT_ID \ --member='user:test-user@gmail.com' \ --role='roles/pubsub.editor'
Definir a conta administrativa humana na gcloud
Substitua $ADMIN_ACCOUNT
pela conta de administrador que você quer usar
(por exemplo: myaccount@gmail.com
) no exemplo a seguir:
$ gcloud config set account $ADMIN_ACCOUNT
Configurar contas de serviço
Por padrão, os serviços ou jobs do Cloud Run são executados como a conta de serviço padrão do Compute Engine. Em vez de deixar o padrão, recomendamos dar a cada serviço do Cloud Run uma identidade dedicada, atribuindo a ele uma conta de serviço gerenciado pelo usuário com o conjunto mínimo de permissões necessárias. Se você planeja manter a conta de serviço padrão, pule para definir variáveis de ambiente.
Crie duas contas de serviço para cada ambiente 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 os papéis a seguir às contas de serviço do conector da UI e do conector 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 os seguintes papéis do IAM à conta de serviço do conector da UI:
roles/redis.editor
roles/vpcaccess.user
roles/compute.viewer
roles/secretmanager.secretAccessor
roles/dialogflow.agentAssistClient
Conceda os seguintes papéis à conta de serviço do conector do Cloud Pub/Sub:
roles/redis.editor
roles/vpcaccess.user
roles/compute.viewer
Defina as variáveis de ambiente
Defina os valores das seguintes variáveis de ambiente como as contas de serviço que você acabou de criar ou a conta de serviço padrão do Compute Engine no seu projeto.
CONNECTOR_SERVICE_ACCOUNT
: a conta de serviço para o ambiente de execução do conector de UI. Exemplo:aa-ui-connector@my-project-id.iam.gserviceaccount.com
.INTERCEPTOR_SERVICE_ACCOUNT
: a conta de serviço do tempo de execução do interceptor do Cloud Pub/Sub. Exemplo:aa-pubsub-interceptor@my-project-id.iam.gserviceaccount.com
.
Personalizar o método de autenticação do usuário
O repositório de código é compatível com usuários de back-end e do módulo de front-end para Genesys Cloud e Twilio.
- No repositório de código, abra o arquivo
ui_connector/auth.py
. Especifique o provedor de identidade compatível definindo a variável de ambiente
AUTH_OPTION
ou implemente seu método de autenticação comauth.check_auth
.Por padrão,
AUTH_OPTION
está vazio e nenhum usuário pode registrar JWT com o serviço UI Connector. Valores aceitos:Salesforce
: verifique o token de autenticação usando o OpenID Connect do Salesforce. Variável de ambiente obrigatória: SALESFORCE_ORGANIZATION_ID.SalesforceLWC
: verifique um token de autenticação de credenciais do cliente OAuth do Salesforce usando o endpoint RESToauth2/userinfo
. Variáveis de ambiente obrigatórias: SALESFORCE_ORGANIZATION_ID, SALESFORCE_DOMAIN.GenesysCloud
: verifique o token de autenticação usando a UsersAPI do SDK do Genesys.Twilio
: verifique o token de autenticação do Twilio. Variável de ambiente obrigatória: TWILIO_FLEX_ENVIRONMENT.Skip
: ignora a verificação do token de autenticação. Ele não deve ser usado na produção.
Exemplo:
$ export AUTH_OPTION='Salesforce'
Cada tipo de token pode ter uma forma diferente de validação. Você decide como o token é validado. Sem mudanças,
auth.check_auth
retornafalse
para cada solicitação.
Personalizar origens permitidas (recomendado)
Para limitar as origens que podem acessar seu serviço, mude o valor da variável config.CORS_ALLOWED_ORIGINS
. O valor padrão *
permite que qualquer origem acesse seu serviço.
Gerar e armazenar uma chave secreta JWT
Para que o serviço de conector da UI envie tokens de autenticação seguros de volta ao cliente, é necessário criptografá-los usando uma chave secreta JWT. O valor da chave pode ser qualquer string arbitrária, mas precisa ser exclusivo e difícil de adivinhar.
Essa chave secreta 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
.
Gerar a chave
Recomendamos gerar um hash aleatório como chave secreta do JWT para que ele não possa ser adivinhado por invasores. Para isso, use 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'
Armazenar a chave no Secret Manager
No exemplo de comando a seguir, substitua my_key
pela chave secreta que você planeja usar.
$ python generate_secret_key.py | gcloud secrets create $JWT_SECRET_NAME --data-file=- \ --replication-policy=user-managed --locations=$SERVICE_REGION
Configurar o Memorystore para Redis
Para configurar o Redis, você precisa das seguintes variáveis de ambiente:
VPC_CONNECTOR_NAME
: o nome do seu conector de acesso VPC sem servidor para conectar serviços do Cloud Run ao Memorystore para Redis. Valor recomendado:aa-integration-vpc
.VPC_NETWORK
: a rede VPC a que seu conector de acesso VPC sem servidor será anexado. O valor deve serdefault
se você não configurar a VPC para seu projeto Google Cloud .VPC_SUBNET
: o nome da rede VPC autorizada a que a instância do Redis está anexada. O valor serádefault
se você não tiver personalizado as configurações da rede VPC.REDIS_IP_RANGE
: uma rede IP interna não reservada para seu conector de acesso VPC sem servidor. É necessário ter/28
de espaço não alocado. Valor recomendado:10.8.0.0/28
(esse valor funciona na maioria dos novos projetos).REDIS_INSTANCE_ID
: um nome para a instância do Redis. Valor recomendado:aa-integration-redis
.
Criar uma instância do Redis na região dos serviços do Cloud Run
Execute este comando:
$ gcloud redis instances create $REDIS_INSTANCE_ID --size=5 --region=$SERVICE_REGION
É possível se conectar a uma instância do Redis a partir do Cloud Run usando a saída direta ou o acesso VPC sem servidor.
Crie um conector de acesso VPC sem servidor {:#create-svpca-connector} (opcional)
Agora, isso é opcional se os clientes escolherem o Direct Egress. Se você escolher o acesso VPC sem servidor, crie um conector de acesso VPC sem servidor. Para mais detalhes sobre esta etapa, consulte o tutorial do Cloud Run.
Verifique se a API de acesso VPC sem servidor está ativada para seu projeto:
$ gcloud services enable vpcaccess.googleapis.com
Crie um conector de acesso VPC sem servidor com um intervalo de IP personalizado:
$ gcloud compute networks vpc-access connectors create $VPC_CONNECTOR_NAME \ --network $VPC_NETWORK \ --region $SERVICE_REGION \ --range $REDIS_IP_RANGE
Salve o host e a porta do Redis como variáveis de ambiente
- Defina o endereço IP da sua instância do Redis como a variável de ambiente
REDIS_HOST
. - Defina o número da porta da instância do Redis como a variável de ambiente
REDIS_PORT
.
Implantar o serviço de conector da UI
Para o serviço de conector da UI, você precisa das seguintes variáveis de ambiente:
CONNECTOR_SERVICE_NAME
: o nome do serviço do Cloud Run do seu conector de interface. Valor recomendado:ui-connector
.CONNECTOR_IMAGE_NAME
: o nome da imagem do serviço do conector de UI. Pode ser igual aCONNECTOR_SERVICE_NAME
. Valor recomendado:ui-connector
.
Compilar a imagem Docker
Na pasta /ui-connector
, execute o seguinte comando:
$ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/$CONNECTOR_IMAGE_NAME
Implantar o conector de interface no Cloud Run
Na pasta /ui-connector
, execute o seguinte comando:
- Se você estiver usando a saída direta para se conectar ao 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 você estiver usando um conector de acesso VPC sem servidor criado para a conexão do 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
Anote o URL do serviço do conector de interface implantado, que será usado pelos clientes (desktops de agentes).
Implantar o serviço de interceptor do Cloud Pub/Sub
Para o serviço interceptor do Pub/Sub, você precisa das seguintes variáveis de ambiente:
INTERCEPTOR_SERVICE_NAME
: o nome do serviço do Cloud Run do seu interceptor do Cloud Pub/Sub. Valor recomendado:cloud-pubsub-interceptor
.INTERCEPTOR_IMAGE_NAME
: o nome da imagem do seu serviço de interceptor do Cloud Pub/Sub. Pode ser igual aINTERCEPTOR_SERVICE_NAME
. Valor recomendado:cloud-pubsub-interceptor
.INTERCEPTOR_SERVICE_ACCOUNT_NAME
: a conta de serviço do ambiente de execução do interceptor do Cloud Pub/Sub.
Compilar a imagem Docker
Na pasta /cloud-pubsub-interceptor
, execute o seguinte comando:
$ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/$INTERCEPTOR_IMAGE_NAME
Implantar o interceptor do Pub/Sub no Cloud Run
Na pasta /cloud-pubsub-interceptor
, execute o seguinte comando:
- Se você estiver usando a saída direta para se conectar ao 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 você estiver usando um conector de acesso VPC sem servidor criado para a conexão do 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
Salvar o URL implantado
Defina o URL implantado como a variável de ambiente INTERCEPTOR_SERVICE_URL
.
Configurar assinaturas do Cloud Pub/Sub
As assinaturas do Cloud Pub/Sub usam o seguinte:
- Tópicos
- Perfil de conversa
- Conta de serviço
- Permissão da conta de serviço para o serviço de interceptor
Criar tópicos do Cloud Pub/Sub
Crie um tópico do Cloud Pub/Sub para cada tipo de notificação de evento que você precisa do Dialogflow. Os tipos de notificação de evento disponíveis são:
- Novos eventos de sugestão: eventos enviados quando novas sugestões do Assistente de IA estão disponíveis (por exemplo, novas respostas rápidas inteligentes em resposta a uma declaração do cliente).
- Novos eventos de mensagem: eventos enviados sempre que uma nova declaração é reconhecida
de um agente ou cliente (por exemplo, o cliente diz
Hi
). - Novos eventos do ciclo de vida da conversa: eventos enviados para determinadas mudanças no ciclo de vida da conversa (por exemplo, quando uma conversa é iniciada ou concluída).
- Novos eventos de notificação de resultado de reconhecimento: eventos enviados quando uma transcrição intermediária é
reconhecida de um agente ou cliente (por exemplo, o cliente diz
Hi, how can I help you?
, uma transcrição intermediária éHi how can
enquanto o cliente está falando).
Anote o ID e o nome do tópico para implantação posterior do back-end.
Configurar um perfil de conversa
Configure um perfil de conversa com os tópicos do Cloud Pub/Sub que você criou na etapa anterior.
- Ao criar um perfil de conversa, selecione Notificações do Pub/Sub e depois Ativar notificações do Pub/Sub. Depois de ativar, marque as caixas ao lado dos tipos de notificações que você quer ativar e insira o ID do tópico associado do Cloud Pub/Sub.
- Selecione
JSON
como o formato de mensagem para cada tópico.
Criar uma conta de serviço para a identidade de assinatura do Pub/Sub
Crie uma conta de serviço que represente a identidade da assinatura do Pub/Sub usando o seguinte comando:
$ gcloud iam service-accounts create cloud-run-pubsub-invoker \ --display-name "Cloud Run Pub/Sub Invoker"
Conceda à conta de serviço permissão para invocar o serviço de interceptor
Execute este 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
Criar assinaturas do Cloud Pub/Sub para tópicos
Para cada tópico criado, é necessário criar uma assinatura correspondente do Cloud Pub/Sub.
Novos eventos de sugestão
Substitua your-new-suggestion-topic-id
pelo tópico do Cloud Pub/Sub que você 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 mensagem
Substitua your-new-message-event-topic-id
pelo tópico do Cloud Pub/Sub que você
configurou para novos eventos de mensagem:
$ 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 você 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