Integrar módulos de back-end ao seu sistema

Os módulos de back-end fornecem uma infraestrutura para processar grandes volumes de mensagens relacionadas a recursos e interagir com a interface do agente. Este tutorial orienta você no processo de integração de módulos de back-end com o sistema do agente.

Para mais informações sobre os conceitos e a estrutura dos módulos de back-end, consulte a documentação sobre os conceitos básicos dos módulos de back-end.

Pré-requisitos

  1. Instale a Google Cloud CLI, caso ainda não tenha feito isso.
  2. 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 a implantação de back-end posterior.
  3. Configure o perfil de conversa usando o console do Agent Assist 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

Consulte ./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 do Terraform. Antes de aplicar as mudanças do Terraform, conclua as etapas a seguir.

  1. 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)
  2. Crie imagens para o conector da interface e para o interceptor do Cloud Pub/Sub e anote o nome da imagem.
    • Para o conector da interface, execute o comando a seguir 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 comando a seguir na pasta ./cloud-pubsub-interceptor.
      $ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/aa-integration-backend/cloud-pubsub-interceptor
  3. 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 comando a seguir.
    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
  4. Exporte o valor das variáveis necessárias do Terraform gcp_project_id, ui_connector_docker_image e cloud_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.
  5. Personalize o método de autenticação modificando o método auth.check_auth() em /ui-connector/auth.py.

Se você quiser automatizar essas etapas usando o Cloud Build, siga esta instrução e use o arquivo de configuração do 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. É possível 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 serviços e dos recursos relacionados. Google Cloud Recursos da plataforma. Exemplo: us-central1.

Configurar uma conta administrativa

Recomendamos o uso de contas separadas para administração de serviços e identidade de ambiente de execução. Google Cloud A administração de serviços é realizada principalmente por pessoas com Contas do Google, enquanto a identidade de ambiente de execução concede permissões de 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á tenha permissões de editor ou proprietário em seu projeto, pule para a próxima seção.

Para gerenciar a infraestrutura de back-end, estabeleça uma conta de administrador e conceda a ela os seguintes papéis do Identity and Access Management (IAM). As permissões estão incluídas nos papéis básicos de editor e proprietário.

  • roles/secretmanager.admin (Admin do Secret Manager): gerencie os secrets armazenados no Secret Manager para geração e verificação de JWT.
  • roles/run.admin (Admin do Cloud Run): implante e gerencie serviços do Cloud Run.
  • roles/iam.serviceAccountUser (Usuário da conta de serviço): conceda permissões iam.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 do Docker para os serviços de integração usando o Cloud Build.
  • Administrador do Artifact Registry: armazene e gerencie 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 (Admin do Redis): crie e gerencie recursos do Memorystore para Redis.

Para conceder papéis do IAM a uma conta humana, use o add-iam-policy-binding comando da Google Cloud CLI. 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 as variáveis de ambiente.

Criar duas contas de serviço para cada ambiente de execução do Cloud Run

  1. Para criar as contas de serviço, substitua o valor de $CONNECTOR_SERVICE_ACCOUNT_ID e $INTERCEPTOR_SERVICE_ACCOUNT_ID e execute os comandos a seguir:

    $ 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'
  2. Use o comando de exemplo a seguir 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.

  1. CONNECTOR_SERVICE_ACCOUNT: a conta de serviço do ambiente de execução do conector da UI. Exemplo: aa-ui-connector@my-project-id.iam.gserviceaccount.com.
  2. INTERCEPTOR_SERVICE_ACCOUNT: a conta de serviço do ambiente 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 oferece suporte a usuários de back-end e usuários do módulo de front-end para Genesys Cloud e Twilio.

  1. No repositório de código, abra o arquivo ui_connector/auth.py.
  2. Especifique o provedor de identidade com suporte definindo a variável de ambiente AUTH_OPTION ou implemente o método de autenticação com auth.check_auth.

    Por padrão, AUTH_OPTION está vazio e nenhum usuário pode registrar o JWT com o serviço do conector da interface. Valores aceitos:

    • Salesforce: verifique o token de autenticação usando o Salesforce OpenID Connect. Variável de ambiente necessária: SALESFORCE_ORGANIZATION_ID.
    • SalesforceLWC: verifique um token de autenticação de credenciais do cliente OAuth do Salesforce usando o endpoint REST oauth2/userinfo. Variáveis de ambiente necessá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 necessária: TWILIO_FLEX_ENVIRONMENT.
    • Skip: pule a verificação do token de autenticação. Ele não pode ser usado na produção.

    Exemplo:

    $ export AUTH_OPTION='Salesforce'

    Cada tipo de token pode ter um meio de validação diferente. Você decide como o token é validado. Sem nenhuma mudança, auth.check_auth retorna false para cada solicitação.

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 do conector da UI envie tokens de autenticação seguros de volta ao cliente, ele precisa criptografá-los usando uma chave secreta JWT. O valor da chave pode ser qualquer string arbitrária, embora precise 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 a chave secreta JWT para que ela não possa ser adivinhada por invasores. Para fazer isso, use secrets do Python 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 comando de exemplo 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 o conector de acesso VPC sem servidor será anexado. O valor precisa ser default se você não configurar a VPC para o Google Cloud projeto.
  • VPC_SUBNET: o nome da rede VPC autorizada a que a instância do Redis está anexada. O valor precisa ser default se você não tiver personalizado as configurações de rede VPC.
  • REDIS_IP_RANGE: uma rede IP interna não reservada para o conector de acesso VPC sem servidor. É necessário um /28 de espaço não alocado. Valor recomendado: 10.8.0.0/28 (esse valor funciona para a 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 o tráfego de saída direto ou o acesso VPC sem servidor.

Criar um conector de acesso VPC sem servidor {:#create-svpca-connector} (opcional)

Isso agora é opcional se os clientes escolherem o tráfego de saída direto. Se você escolher o acesso VPC sem servidor, será necessário criar um conector de acesso VPC sem servidor. Para mais detalhes sobre essa etapa, consulte o tutorial do Cloud Run.

Verifique se a API de acesso VPC sem servidor está ativada no 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

Salvar o host e a porta do Redis como variáveis de ambiente

  • Defina o endereço IP da 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 do conector da UI

Para o serviço do conector da UI, você precisa das seguintes variáveis de ambiente:

  • CONNECTOR_SERVICE_NAME: o nome do serviço do Cloud Run do conector da interface. Valor recomendado: ui-connector.
  • CONNECTOR_IMAGE_NAME: o nome da imagem do serviço do conector da interface. Pode ser o mesmo que CONNECTOR_SERVICE_NAME. Valor recomendado: ui-connector.

Compilar a imagem Docker

Na pasta /ui-connector, execute o comando a seguir:

$ gcloud builds submit --tag gcr.io/$GCP_PROJECT_ID/$CONNECTOR_IMAGE_NAME

Implantar o conector da interface no Cloud Run

Na pasta /ui-connector folder, execute o comando a seguir:

  • Se você estiver usando o tráfego de saída direto para se conectar à 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 \
--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 para o conector da interface implantado, que será usado pelos clientes (interfaces do agente).

Implantar o serviço do interceptor do Cloud Pub/Sub

Para o serviço do interceptor do Pub/Sub, você precisa das seguintes variáveis de ambiente:

  • INTERCEPTOR_SERVICE_NAME: o nome do serviço do Cloud Run do interceptor do Cloud Pub/Sub. Valor recomendado: cloud-pubsub-interceptor.
  • INTERCEPTOR_IMAGE_NAME: o nome da imagem do serviço do interceptor do Cloud Pub/Sub. Pode ser o mesmo que INTERCEPTOR_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 comando a seguir:

$ 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 comando a seguir:

  • Se você estiver usando o tráfego de saída direto para se conectar à 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 \
--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 Agent Assist estão disponíveis (por exemplo, novas sugestões de Resposta Inteligente 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 de ciclo de vida de 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 a implantação de back-end posterior.

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 novo perfil de conversa, selecione Notificações do Pub/Sub e Ativar notificações do Pub/Sub. Depois de ativado, você pode marcar as caixas ao lado dos tipos de notificações que quer ativar e inserir o ID do tópico associado do Cloud Pub/Sub.
  • Selecione JSON como o formato da mensagem para cada tópico.

Criar uma conta de serviço para a identidade da assinatura do Pub/Sub

Crie uma conta de serviço que represente a identidade da assinatura do Pub/Sub usando o comando a seguir:

$ gcloud iam service-accounts create cloud-run-pubsub-invoker \
     --display-name "Cloud Run Pub/Sub Invoker"

Conceder permissão à conta de serviç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 configurado 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 configurado 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 de conversa

Substitua your-conversation-lifecycle-event-topic pelo tópico do Cloud Pub/Sub configurado para novos eventos de ciclo de vida de 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