Integre módulos de back-end com o seu sistema

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

  1. Se não o tiver configurado, instale a CLI Google Cloud.
  2. 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.
  3. 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.

  1. 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)
  2. 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
  3. 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
  4. Exporte o valor das variáveis do Terraform obrigatórias gcp_project_id, ui_connector_docker_image e cloud_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.
  5. 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ções iam.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

  1. 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'
  2. 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.

  1. 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.
  2. 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.

  1. No repositório de código, abra o ficheiro ui_connector/auth.py.
  2. Especifique o fornecedor de identidade suportado definindo a variável de ambiente AUTH_OPTION ou implemente o seu método de autenticação com auth.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 REST oauth2/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 devolve false para cada pedido.

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 ser default 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 ser default 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 a CONNECTOR_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 a INTERCEPTOR_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édia Hi 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