Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Isso é resolvido por meio das filas que dividimos em duas partes, os tópicos (topics) e as assinaturas (subscriptions).

Tópico: U

02. SITUAÇÃO/REQUISITO

03. SOLUÇÃO

...

tabsPasso 01, Passo 02, Passo 03, Passo 04
idspasso1,passo2

Uma fila de mensagens. Toda vez que uma mensagem é publicada por algum serviço com o nome de um tópico, ela vem parar no tópico com o nome definido. A partir daí, as mensagens terão destinos conforme a(s)  Assinatura(s) deste tópico estiverem configuradas.

Assinatura: Pode ser de pois tipos:

  • Push: ao receber uma mensagem, começa a tentar fazer uma requisição (encaminhando essa mensagem) para o endpoint configurado. 
  • Pull: ao receber uma mensagem, encaminha-a quando algum serviço fazer uma requisição

02. Deploy

Atualmente o deploy está sendo feito de duas maneiras: utilizando o Terradorm ou apenas batch files (.bat).

Terraform

No terraform, as filas são declaradass no arquivo principal main.tf. os tópicos e as assinaturas são declarados como resource. Exemplo:


Declarando um tópico:

Bloco de código
resource "google_pubsub_topic" "tpr-routing-invoker-hard" {
  name = "server-routing-invoker-hard-topic"
}

Declarando uma assinatura:

Bloco de código
resource "google_pubsub_subscription" "tpr-hard-job-subscription" {
  name  = "tpr-hard-job-subscription"
  topic = google_pubsub_topic.tpr-routing-invoker-hard.name

  message_retention_duration = "7200s"

  ack_deadline_seconds = 60

  retry_policy {
    minimum_backoff = "60s"
  maximum_backoff = "300s"
  }

  push_config {
    push_endpoint = format("%s/%s/",google_cloud_run_service.tpr-invoker-hard.status[0].url, "invoker")

  oidc_token {
      service_account_email = var.tpr_subscription_service_account
  }
  }

  dead_letter_policy {
    dead_letter_topic = google_pubsub_topic.tpr-dead-letter.id
  }
}

`

Ao utilizar o comando terraform apply , os tópicos e a assinaturas devem ser criados.



Batch files


Nos projetos cujo deploy é feito através de batch files (.bat), os tópicos e assinaturas também são declarados pelo nome de resources, dentro de arquivos .`yml`. Exemplo:

Bloco de código
`#tpr-mail-sender-resources-dev-interno.yml

resources:
  - name: tpr-mail-sender
    type: pubsub.v1.topic
    properties:
      topic: tpr-mail-sender

  - name: tpr-mail-sender-subscription
    type: pubsub.v1.subscription
    properties:
      subscription: tpr-mail-sender-subscription
      topic: $(ref.tpr-mail-sender.name)
      messageRetentionDuration: 3600s
      ackDeadlineSeconds: 10
      retryPolicy:
        minimumBackoff: 10s
        maximumBackoff: 300s
      pushConfig:
        pushEndpoint: https://tpr-mail-sender-kanntqe6lq-ue.a.run.app/mail/send
        oidcToken:
          serviceAccountEmail: [email protected]
      deadLetterPolicy:
        deadLetterTopic: projects/tpr-dev-interno/topics/tpr-dead-letter



Esse arquivo é lido para produzir um deployment manager (https://console.cloud.google.com/dm/deployments), que, por sua vez, cria os tópicos e as assinaturas.


03. Fila morta

Fila morta é um tópico especial para o qual as assinaturas devem enviar mensagens que não conseguem enviar para seus push endpoints configurados. Isso pode acontecer, por exemplo, se o serviço desse endpoint não estiver conseguindo se levantar ou houver algum problema na URL ou no corpo da requsição. Dessa maneira, elas ficam estocadas lá para posteriormente serem analisadas por alguém.

O tópico e a assinatura da fila morta são criados juntos com os tópicos e assinaturas do deploy do CPL, isso é, estão definidos no `main.tf` do tpr-deployment.

Além disso é necessário configurar cada assinatura para utilizar a fila morta. Isso é feito na própria declaração do tópico, seja no `main.tf` seja no `.yml` usado pelos batch files para criar os tópicos.

Bloco de código
/*main.tf, dentro do corpo da declaração da assinatura:*/


dead_letter_policy {
    dead_letter_topic = google_pubsub_topic.tpr-dead-letter.id
  }
Bloco de código
# tpr-projeto-resources-projeto.yml, dentro das properties de um determinado resource

deadLetterPolicy:
        deadLetterTopic: projects/[nome do projeto GCP]/topics/tpr-dead-letter

Permissões para a fila morta


Mesmo após criar o tópico de fila morta e configurar as assinaturas para utilizá-lo, ainda é necessário realizar alguma ações relacionadas à permissões para que a fila morta funcione corretamente.

Cada cada assinatura, é necessário que a conta de serviço do pub/sub daquele projeto tenha as autorizações de Editor (Publisher) e Assinante (Subscriber). 

Atenção

A conta de serviço do pub/sub não é a mesma que a conta de serviço do projeto, utilizada para subir os CloudRuns, por exemplo. enquanto a primeira tem o formato:

`[NÚMERO DO PROJETO]-compute@developer.gserviceaccount.com` a segunda tem o formato

`service-[NÚMERO DO PROJETO]@gcp-sa-pubsub.iam.gserviceaccount.com`


No processo de deploy autotático, isso é feito utilizando o gcloud, chamado de dentro de um batch file:

Bloco de código
@REM assign-roles.bat

call gcloud pubsub subscriptions add-iam-policy-binding %SUBSCRIPTION_NAME%^
    --member="serviceAccount:%PUBSUB_SERVICE_ACCOUNT%"^
    --role="roles/pubsub.subscriber"

call gcloud pubsub subscriptions add-iam-policy-binding %SUBSCRIPTION_NAME%^
    --member="serviceAccount:%PUBSUB_SERVICE_ACCOUNT%"^
    --role="roles/pubsub.publisher"

Essa concessão de permissão somente funcionará, entretando, se o usuário tiver a permissão pubsub.topics.getIamPolicy, do papel "Administrador pub/sub".


 Enquanto não as possua, ao verificar a assinatura no Console do GCP, na aba "Mensagens Mortas", haverá o seguinte aviso:


Bloco de código
Atribuir o papel de Editor
A conta de serviço do Cloud Pub/Sub deste projeto precisa do papel de Editor para publicar mensagens mortas no respectivo tópico.

Atribua o papel de Assinante
A conta de serviço do Cloud Pub/Sub deste projeto precisa do papel de Assinante para encaminhar mensagens desta assinatura para o tópico de mensagens mortas.

`

Nesta mesma tela, é possível atribuir tais papeis clicando no link "Conceder papel de editor/assinante" à direita. Entretanto, essas opções apenas estarão habilitadas se você tiver a permissão pubsub.topics.getIamPolicy, do papel "Administrador pub/sub".

Se as autorizações forme concedidas corretamente, todas as condições nesta página estarão azuis, e a fila morta deve funcionar corretamente.

04. Fontes:

...

defaultyes
referenciapasso1

...

defaultno
referenciapasso2

04. DEMAIS INFORMAÇÕES

Card documentos
InformacaoUse esse box para destacar informações relevantes e/ou de destaque.
TituloIMPORTANTE!

05. ASSUNTOS RELACIONADOS

Templatedocumentos

...