Deploy AWS ECS + API Gateway — ecosif-angular

Público-alvo: DevOps / SRE
Índice: README.md
Objetivo: Configurar o frontend eCosif na AWS usando ECS e uma única API Gateway com múltiplos mapeamentos. O domínio final é app.ecosif.com.br (frontend na raiz; backends em app.ecosif.com.br/[módulo]).

Este documento não cobre criação de banco de dados (pressupõe que o banco já existe noutro recurso).


1. Arquitetura geral

Uma única API Gateway (REST ou HTTP API) faz o roteamento por path para os respetivos targets (ALB dos serviços ECS ou integração HTTP direta).


2. Mapeamento na API Gateway

Path (API Gateway) Target Descrição
/ (e paths que não casem com os abaixo) ECS / CloudFront do frontend SPA Angular (index.html + assets)
/ecosif-auth / /ecosif-auth/{proxy+} ECS ecosif-auth (ALB) Autenticação e JWT
/ecosif-masterdata / /ecosif-masterdata/{proxy+} ECS ecosif-masterdata Dados mestres
/ecosif-moviments / /ecosif-moviments/{proxy+} ECS ecosif-moviments Lançamentos e lotes
/ecosif-querys / /ecosif-querys/{proxy+} ECS ecosif-querys Consultas
/ecosif-reports / /ecosif-reports/{proxy+} ECS ecosif-reports Relatórios
/ecosif-compliance / /ecosif-compliance/{proxy+} ECS ecosif-compliance Compliance
/ecosif-automations / /ecosif-automations/{proxy+} ECS ecosif-automations (se aplicável) Automations

A ordem das rotas na API Gateway deve dar prioridade aos paths mais específicos (/ecosif-auth, etc.) e deixar o default (/) para o frontend.


3. ecosif-angular (frontend) no ECS

3.1 Papel no desenho

3.2 Variáveis de ambiente (build e runtime)

Configuração em build (Docker/CI) e/ou em runtime via window.env (ex.: env.js injetado no contentor).

Variável (build) window.env (runtime) Obrigatória Descrição Valor em produção (app.ecosif.com.br)
ECOSIF_ANGULAR_API_AUTH_URL authUrl Sim Base do ecosif-auth /ecosif-auth
ECOSIF_ANGULAR_API_MASTERDATA_URL apiUrl Sim Base ecosif-masterdata /ecosif-masterdata
ECOSIF_ANGULAR_API_MOVIMENTS_URL movementAPIUrl Sim Base ecosif-moviments /ecosif-moviments
ECOSIF_ANGULAR_API_QUERYS_URL entryAPIUrl Sim Base ecosif-querys /ecosif-querys
ECOSIF_ANGULAR_API_REPORTS_URL reportsApiUrl Sim Base ecosif-reports /ecosif-reports
ECOSIF_ANGULAR_API_COMPLIANCE_URL complianceApiUrl Sim Base ecosif-compliance /ecosif-compliance
ECOSIF_ENABLE_RUNTIME enableRuntime Recomendado Usar config do container (config.json) true
ECOSIF_ANGULAR_DEBUG debug Não Modo debug false
ECOSIF_ANGULAR_AUTH_TOKEN authToken Não Chave localStorage do JWT (valor padrão do projeto)
ECOSIF_PAGINATION_SIZE paginationSize Não Tamanho padrão de paginação 100
ECOSIF_ANGULAR_HIDE_ADMIN_MENU hideAdminMenu Não Ocultar menu Ferramentas Administrativas conforme política
ECOSIF_AZURE_CLIENT_ID (Azure) Se usar Azure AD Client ID MSAL
ECOSIF_AZURE_AUTHORITY (Azure) Se usar Azure AD Authority MSAL

Importante: Em produção com domínio único, não é necessário definir ECOSIF_API_BASE_URL no frontend; as bases das APIs são apenas os paths relativos acima (ex.: /ecosif-auth), pois o browser usa sempre https://app.ecosif.com.br.

3.3 Exemplo de configuração runtime (env.js)

Para o contentor que serve o Angular, o script que gera window.env pode expor:

window.env = {
  authUrl: '/ecosif-auth',
  apiUrl: '/ecosif-masterdata',
  movementAPIUrl: '/ecosif-moviments',
  entryAPIUrl: '/ecosif-querys',
  reportsApiUrl: '/ecosif-reports',
  complianceApiUrl: '/ecosif-compliance',
  production: true,
  debug: false,
  paginationSize: 100
};

3.4 ECS (task definition)

Para mais detalhes de build, Nginx e variáveis, ver docker.md.


4. Certificado digital no endereço do API Gateway

O endereço correto que o utilizador usa é o domínio customizado (ex.: app.ecosif.com.br). O certificado SSL/TLS é associado a esse domínio no API Gateway, não no contentor do Angular nem nos ALBs. O fluxo é: Cliente (HTTPS) → API Gateway (domínio + certificado) → rotas por path → ALB → ECS.

4.1 Visão geral dos passos

  1. Obter um certificado para o domínio no AWS Certificate Manager (ACM).
  2. Criar um domínio customizado no API Gateway e anexar o certificado a esse domínio.
  3. Mapear o domínio customizado para a sua API (REST ou HTTP API).
  4. DNS: apontar o nome do domínio (ex.: app.ecosif.com.br) para o endpoint do domínio customizado do API Gateway.

Assim, todo o tráfego em https://app.ecosif.com.br usa o certificado configurado no API Gateway e é roteado para os targets (frontend na /, backends nos paths /ecosif-*).

4.2 Passo 1 — Certificado no ACM

  1. No AWS ConsoleCertificate Manager (ACM) (na mesma região onde vai criar o API Gateway).
  2. Request a certificate: - Fully qualified domain name: o domínio que vai usar (ex.: app.ecosif.com.br ou *.ecosif.com.br para wildcard). - Validation method: DNS validation (recomendado) ou Email validation.
  3. Se escolher DNS validation: na lista de certificados, abra o certificado e crie os registos CNAME indicados na sua zona DNS (Route 53 ou DNS externo) até o estado ficar Issued.

Nota: O certificado deve estar na mesma região que o API Gateway. Para API Gateway REST API use a região onde a API está; para HTTP API o domínio customizado pode usar certificado em us-east-1 (requisito da AWS para edge-optimized).

4.3 Passo 2 — Domínio customizado no API Gateway

Opção A — API Gateway HTTP API (recomendado para novo desenho)

  1. API GatewayCustom domain names (no menu da HTTP API).
  2. Create domain name: - Domain name: ex. app.ecosif.com.br. - Domain name configuration: Import certificate ou ACM certificate (selecione o certificado do ACM criado no passo 1). - Endpoint type: Regional (recomendado; o certificado pode estar na mesma região da API).
  3. Guarde o API Gateway domain name (ex.: d-xxxxxxxxxx.execute-api.region.amazonaws.com) e o Target domain name que a AWS mostrar para o custom domain — será usado no DNS.

Opção B — API Gateway REST API

  1. API GatewayCustom domain names (na secção da REST API).
  2. Create: - Domain name: ex. app.ecosif.com.br. - Regional certificate: selecione o certificado do ACM (na mesma região da API). - Ou use Edge-optimized e um certificado em us-east-1.
  3. Depois de criar, em API mappings associe este domínio à sua REST API e ao stage (ex.: prod).

4.4 Passo 3 — Mapear o domínio à API

Cada integração HTTP deve apontar para o ALB do respetivo serviço ECS (frontend para o ALB do ecosif-angular; backends para os ALBs de ecosif-auth, ecosif-masterdata, etc.). A ordem das rotas deve dar prioridade aos paths mais específicos (/ecosif-auth, etc.) e deixar / (e catch-all) para o frontend.

4.5 Passo 4 — DNS: apontar o domínio para o API Gateway

Para o endereço final ser https://app.ecosif.com.br com o certificado ativo:

  1. Na zona DNS do domínio (ex.: Route 53 ou provedor externo), crie um registo que aponte o nome (ex.: app.ecosif.com.br) para o target do domínio customizado do API Gateway: - Route 53: Crie um registo A (Alias) ou CNAME apontando para o target do custom domain (a AWS mostra esse valor em Custom domain names → seu domínio → Configuration). - DNS externo: Normalmente um CNAME de app.ecosif.com.br para o valor Target domain name mostrado no API Gateway (ex.: d-xxxxxxxxxx.execute-api.region.amazonaws.com ou o endpoint regional indicado).
  2. Aguarde a propagação DNS (minutos a algumas horas).

4.6 Resumo

O quê Onde
Certificado SSL/TLS AWS Certificate Manager (ACM), para o domínio (ex. app.ecosif.com.br)
Domínio customizado API Gateway → Custom domain names → criar e anexar o certificado
Endereço usado pelo utilizador https://app.ecosif.com.br (ou o nome que configurou)
Roteamento Rotas por path (/, /ecosif-auth, etc.) para os ALBs dos serviços ECS

Assim, o certificado digital fica no endereço correto — no domínio do API Gateway que o utilizador usa para aceder ao frontend e às APIs. O contentor do ecosif-angular continua a servir apenas HTTP (porta configurada em AngularPort / ECOSIF_ANGULAR_PORT) atrás do ALB; o HTTPS é terminado no API Gateway com o certificado que configurou.


5. Documentação relacionada

Documento Conteúdo
variaveis-angular.md Tabela de variáveis e exemplo de task definition
docker.md Build, Nginx, env.js, docker-compose
README.md Índice da documentação

Materiais internos (guia cliente, Fargate aprofundado): .internal_docs/ (local, não versionado) — ver README.md.