...
Isso é resolvido por meio das filas que dividimos em duas partes, os tópicos (topics) e as assinaturas (subscriptions).
Tópico: U
...
tabs | Passo 01, Passo 02, Passo 03, Passo 04 |
---|---|
ids | passo1,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:
Atualmente o deploy está sendo feito de duas maneiras: utilizando o Terradorm ou apenas batch files (.bat).
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.
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.
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 |
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).
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.
...
default | yes |
---|---|
referencia | passo1 |
...
default | no |
---|---|
referencia | passo2 |
Card documentos | ||||
---|---|---|---|---|
|
Templatedocumentos |
---|
...