Pular para conteúdo

Deploy com AWS SAM

O deploy da aplicação é definido por template.yaml, samconfig.toml e scripts/deploy_from_env.ps1. Este runbook descreve os recursos e comandos existentes; nenhuma publicação ou verificação de conta AWS foi realizada para produzir esta documentação.

Ambientes e nomes

Ambiente Configuração versionada Stack padrão Região da configuração
dev default em samconfig.toml gogenetic-agent sa-east-1
staging Permitido pelo parâmetro SAM, sem seção própria no samconfig Definir explicitamente, por exemplo gogenetic-agent-staging Definir explicitamente
prod prod em samconfig.toml gogenetic-agent-prod sa-east-1

O nome da stack e o parâmetro Environment são independentes. Os nomes físicos da tabela, filas e funções usam Environment, não StackName; duas stacks com o mesmo ambiente na mesma conta/região podem disputar os mesmos nomes.

Recursos implantados

flowchart LR
    SRC[Checkout aprovado] --> BUILD[SAM build]
    ENV[Configuração local protegida] --> SSM[SSM por ambiente]
    ENV --> PARAM[Parâmetros SAM]
    BUILD --> CF[CloudFormation / SAM deploy]
    PARAM --> CF
    CF --> API[HTTP API]
    API --> WEB[Webhook Lambda]
    API --> UI[Emulator / Atendimento Lambda]
    WEB --> FIFO[SQS FIFO e DLQ]
    FIFO --> ORCH[Orchestrator Lambda]
    SSM --> ORCH
    ORCH --> DDB[DynamoDB single-table]
    UI --> DDB
    CF --> SCHEDULE[EventBridge schedules]
    SCHEDULE --> CRM[CRM Sync: 1 minuto]
    SCHEDULE --> HAND[Renotificação: 1 hora]
    SCHEDULE --> EXPORT[Exportação: segunda 12 UTC]
    CRM --> DDB
    HAND --> DDB
    EXPORT --> DDB
Recurso Handler / detalhe
WebhookHandlerFunction webhook_handler.app.lambda_handler; GET/POST /webhook; 60 s
OrchestratorFunction orchestrator.app.lambda_handler; SQS batch 1, falha parcial; 90 s
EmulatorFunction emulator.app.lambda_handler; HTTP /{proxy+}; 60 s
AdminExportFunction admin_export.app.lambda_handler; cron(0 12 ? * MON *); 90 s
HandoffRenotifyFunction handoff_renotify.app.lambda_handler; rate(1 hour); 60 s
CrmSyncFunction crm_sync.app.lambda_handler; rate(1 minute); 120 s, concorrência reservada 1

Defaults globais: Python 3.12 e 512 MB. DynamoDB é PAY_PER_REQUEST, GSI1 e TTL ttl. Fila FIFO usa visibilidade 120 s, retenção 4 dias, atraso 0 e redrive após 3 recebimentos para DLQ com retenção de 14 dias. Consulte SQS para processamento e repetição.

Divergência documental

O README menciona três Lambdas em uma descrição histórica. O template atual define seis. context/infra/deploy.md também registra pendências históricas; sua existência não permite concluir quais recursos estão ativos hoje em uma conta externa.

Pré-requisitos e validação local

Use checkout/commit aprovado, Python 3.12, AWS CLI, SAM CLI e credenciais da conta de destino. Configure o profile no ambiente e confirme a identidade sem imprimir secrets:

$env:AWS_PROFILE = "<PERFIL_AWS>"
aws sts get-caller-identity --query '{Account:Account,Arn:Arn}'
sam --version
aws --version
sam validate --lint --region sa-east-1
sam build

IAM deve permitir as operações necessárias de CloudFormation, SAM/S3, criação dos recursos e gestão de secrets planejada. CAPABILITY_IAM é passado pelo script porque o template cria papéis e políticas. Acesso externo correto só é comprovado no ambiente alvo.

Deploy pelo script existente

O script lê um arquivo CHAVE=valor, rejeita linhas sem =, suporta aspas externas e exige configuração WhatsApp completa. -ValidateOnly valida o arquivo sem chamar AWS ou SAM:

.\scripts\deploy_from_env.ps1 -EnvFile .env.staging -Environment staging -Region sa-east-1 -StackName gogenetic-agent-staging -ValidateOnly

No modo de validação, OpenAI API key é obrigatória salvo -SkipOpenAiSsm, e os quatro modelos precisam estar presentes. Em prod, o arquivo precisa declarar explicitamente EGESTOR_ENABLED, HUBSPOT_ENABLED, HANDOFF_NOTIFIER_ENABLED, HANDOFF_NOTIFIER_TYPE e OPERATOR_UI_BASE_URL. Ausência dessas chaves é erro, para evitar desativação silenciosa de integrações.

Depois de revisar o plano e autorizar a publicação do ambiente:

.\scripts\deploy_from_env.ps1 -EnvFile .env.staging -Environment staging -Region sa-east-1 -StackName gogenetic-agent-staging

Para produção, use arquivo de configuração próprio e passe -Environment prod -StackName gogenetic-agent-prod. -NoBuild reutiliza o build existente e exige certeza de que corresponde ao checkout. -SkipOpenAiSsm só evita a escrita da chave OpenAI; não impede gravação de secrets de outros providers nem deploy.

O script atual imprime variáveis: chaves com TOKEN|SECRET|KEY|PASSWORD|EMAIL recebem máscara parcial, outras podem sair integralmente, incluindo telefones. -ValidateOnly também faz isso. Não compartilhe a saída bruta nem trate a máscara parcial como anonimização completa.

SSM e parâmetros

Caminho SSM Tipo escrito pelo script Condição
/gogenetic-agent/<ambiente>/openai-api-key SecureString Sempre, salvo -SkipOpenAiSsm
/gogenetic-agent/<ambiente>/egestor-base-url String eGestor habilitado e URL/token locais presentes juntos
/gogenetic-agent/<ambiente>/egestor-api-token SecureString Mesma condição
/gogenetic-agent/<ambiente>/crm-comercial-access-token SecureString CRM habilitado e token local presente

Se eGestor estiver habilitado, URL/token devem estar presentes juntos ou ambos ausentes para usar os parâmetros já provisionados. CRM permite token local ausente e presume SSM pronto. Esses caminhos correspondem aos *_SSM_PARAM do template; não expõem valores de secrets.

O script escreve SSM antes de sam build. Uma falha de build/deploy não desfaz essas escritas. Registre previamente as versões/configurações que deverão ser restauradas em eventual rollback, sem copiar valores para relatórios.

Os overrides incluem flags, quatro modelos, WhatsApp, CRM pipeline/stages/owner, eGestor, notificador, whitelist, domínio e URL de operadores. DevUiEnabled=false é imposto pelo script. Não existe transformação genérica de todas as chaves .env em parâmetros SAM.

Configuração não encaminhada pelo script

OPENAI_REASONING_EFFORT não é adicionado por deploy_from_env.ps1 aos overrides de OpenAiReasoningEffort. O SAM tem esse parâmetro e samconfig.toml na seção prod fixa medium, mas o script não seleciona --config-env prod. Confira a configuração efetiva e use um fluxo SAM explicitamente revisado se precisar desse override. sam deploy não importa .env automaticamente.

O fluxo manual suportado é sam build seguido de sam deploy --guided, ou sam deploy --config-env prod quando a configuração completa já foi preparada. Não trate os poucos parâmetros presentes no samconfig como inventário completo dos secrets e switches do ambiente. Veja variáveis.

Outputs e validação pós-deploy

aws cloudformation describe-stacks --region sa-east-1 --stack-name gogenetic-agent-staging --query 'Stacks[0].{Status:StackStatus,Outputs:Outputs}'
aws lambda get-function-configuration --region sa-east-1 --function-name gogenetic-agent-orchestrator-staging --query '{State:State,Update:LastUpdateStatus,Runtime:Runtime,Timeout:Timeout}'

Os outputs são WebhookUrl, EmulatorUrl, OperatorUiUrl, AgentTableName, DebounceQueueUrl e, se houver domínio customizado, OperatorCustomDomainTarget e OperatorCustomDomainHostedZoneId. O template cria domínio/mapping apenas com nome e certificado configurados; o alias DNS deve ser configurado separadamente. A condição não cria certificado ACM nem registro DNS.

Confirme stack estável, saúde HTTP, bloqueio da UI dev e fluxo de acesso antes dos testes reais do runbook de homologação. Output de URL não comprova assinatura Meta, token válido, entrega de WhatsApp ou contrato CRM.

Rollback

Se a atualização falhar, leia eventos CloudFormation e aguarde a conclusão de rollback antes de reaplicar. Se a stack ficar em UPDATE_ROLLBACK_FAILED, uma operação de recuperação, após corrigir a causa, é:

aws cloudformation continue-update-rollback --region sa-east-1 --stack-name gogenetic-agent-staging

Para uma regressão de aplicação com stack estável, prepare checkout separado da revisão aprovada anterior, faça novo build e reaplique preservando explicitamente parâmetros atuais necessários. Não há alias/versionamento de Lambda nem estratégia blue/green configurados no template. Reversão de código não reverte dados DynamoDB, mensagens entregues, negócios criados nem alterações SSM feitas pelo script. Não delete a stack como procedimento de rollback: o template não declara política de retenção/backup da tabela.

Testes do mecanismo: tests/unit/scripts/test_deploy_from_env.py e tests/unit/test_template_scoping.py. A validação SAM e os testes locais não comprovam deploy em conta externa.