Este projeto implementa uma função AWS Lambda escrita em Go, empacotada como imagem Docker e provisionada automaticamente com Terraform usando uma arquitetura modular.
A ideia é simples: você escreve seu código em Go ➡ compila ➡ empacota no Docker ➡ envia para o Amazon ECR ➡ Terraform modular provisiona tudo na AWS de forma organizada e reutilizável.
O projeto utiliza uma arquitetura Terraform modular para melhor organização, manutenibilidade e reutilização:
terraform/
├── main.tf # Orquestração dos módulos
├── variables.tf # Variáveis globais
├── staging.tfvars # Configurações do ambiente staging
├── production.tfvars # Configurações do ambiente produção
└── modules/
├── ecr/ # Repositório de containers
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── iam/ # Roles e políticas
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── lambda/ # Função Lambda
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── apigw/ # API Gateway
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── cloudwatch/ # Logs e alertas
│ ├── main.tf
│ └── variables.tf
├── sns/ # Notificações
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── route53/ # DNS e health checks
├── main.tf
├── outputs.tf
└── variables.tf
graph TD
A[ECR Module] --> D[Lambda Module]
B[IAM Module] --> D[Lambda Module]
D --> E[API Gateway Module]
D --> F[CloudWatch Module]
C[SNS Module] --> F
E --> G[Route53 Module]
O projeto implementa um pipeline CI/CD separado e robusto:
Executa em: push
para main
, develop
, feature/*
e pull_request
para main
Jobs:
-
Lint & Code Quality
- go vet
- gofmt (formatação)
- Verificação de dependências
-
Unit Tests
- Execução de testes unitários
- Cobertura de código
- Upload de relatórios
-
Build & Docker
- Build da imagem Docker
- Validação da imagem
- Verificação do Terraform
Executa em:
- Sucesso do workflow de CI na branch
main
- Manualmente com
workflow_dispatch
Jobs:
- Check CI Status - Verifica se o CI passou
- Deploy to AWS - Deploy completo na AWS
- Post-Deploy Notification - Notificação do resultado
Funcionalidades do Deploy:
- ✅ Verificação de dependências do CI
- ✅ Build e push da imagem Docker
- ✅ Atualização da função Lambda
- ✅ Versionamento automático
- ✅ Configuração de alias
staging
- ✅ Verificação pós-deploy
- ✅ Deploy manual com opção de força
- AWS Lambda – Executa a função Go usando container images
- Amazon ECR – Armazena a imagem Docker da função
- API Gateway v2 – Disponibiliza a função como uma API HTTP
- CloudWatch Logs – Armazena os logs da função
- CloudWatch Alarms – Monitora erros da Lambda
- SNS (Simple Notification Service) – Envia alertas configurados
- IAM (Identity and Access Management) – Controla permissões
- Route53 – Health checks da aplicação
- Desenvolvimento: Escrevemos o código Go
- Build: Compilamos o binário (
bootstrap
) - Container: Construímos a imagem Docker usando
public.ecr.aws/lambda/provided:al2
- Registry: Fazemos push para o Amazon ECR
- Infraestrutura: O Terraform modular cria:
- ECR Module: Repositório de containers
- IAM Module: Roles e políticas de execução
- Lambda Module: Função Lambda + alias + concorrência provisionada
- API Gateway Module: HTTP API com rotas
- CloudWatch Module: Logs e alarmes
- SNS Module: Tópicos de notificação
- Route53 Module: Health checks
- Deploy: Chamamos a API e vemos a mágica acontecer ✨
- Go 1.24.5
- Docker
- AWS CLI configurado (
aws configure
) - Terraform 1.5+
- Perfil AWS configurado (ex:
terraform-user
)
Edite o arquivo terraform/staging.tfvars
:
env = "staging"
aws_region = "us-east-1"
account_id = "SEU_ACCOUNT_ID"
image_tag = "latest"
alert_email = "seu@email.com"
aws_profile = "terraform-user"
provisioned_concurrency = 0
env = "production"
aws_region = "us-east-1"
account_id = "SEU_ACCOUNT_ID"
image_tag = "v1.0.0"
alert_email = "prod-alerts@empresa.com"
aws_profile = "terraform-user"
provisioned_concurrency = 5
# No seu repositório GitHub, vá em Settings > Secrets and variables > Actions
# Adicione os seguintes secrets:
AWS_ACCESS_KEY_ID=SEU_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=SEU_SECRET_KEY
AWS_ACCOUNT_ID=SEU_ACCOUNT_ID
# 1️⃣ Compilar o Go e empacotar
./deploy.sh
# 2️⃣ Navegar para o diretório terraform
cd terraform
# 3️⃣ Inicializar Terraform
terraform init
# 4️⃣ Verificar o plano
terraform plan -var-file="staging.tfvars"
# 5️⃣ Aplicar a infraestrutura
terraform apply -var-file="staging.tfvars"
# 1️⃣ Fazer push para uma feature branch
git checkout -b feature/nova-funcionalidade
git add .
git commit -m "feat: adiciona nova funcionalidade"
git push origin feature/nova-funcionalidade
# 2️⃣ Criar Pull Request para main
# - O CI executará automaticamente
# - Verificará código, testes e build
# 3️⃣ Fazer merge para main
# - O CD executará automaticamente
# - Fará deploy se CI passou com sucesso
# Executar todos os testes
go test -v ./...
# Executar com cobertura
go test -v -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
# Executar linting
golangci-lint run ./...
# Obter URL da API
terraform output api_gateway_url
# Testar endpoint de saúde
curl https://SEU_API_ID.execute-api.us-east-1.amazonaws.com/health
# Testar endpoint de usuários
curl https://SEU_API_ID.execute-api.us-east-1.amazonaws.com/users
# Destruir ambiente staging
terraform destroy -var-file="staging.tfvars"
# Destruir ambiente produção
terraform workspace select production
terraform destroy -var-file="production.tfvars"
Após o deploy, o Terraform fornece as seguintes informações:
api_gateway_url
: URL da API HTTPlambda_function_arn
: ARN da função Lambdalambda_function_name
: Nome da função Lambdaecr_repository_url
: URL do repositório ECRhealth_check_id
: ID do health check Route53
- ✅ IAM roles com princípio do menor privilégio
- ✅ Logs estruturados no CloudWatch
- ✅ Alertas configurados para erros
- ✅ Health checks automáticos
- ✅ Variáveis sensíveis em
.tfvars
(não commitadas) - ✅ Security scanning no CI
- ✅ Vulnerability scanning com Trivy
- Reutilização: Módulos podem ser reutilizados em diferentes projetos
- Manutenibilidade: Cada módulo tem responsabilidade específica
- Testabilidade: Módulos podem ser testados independentemente
- Escalabilidade: Fácil adicionar novos ambientes e funcionalidades
- Organização: Código bem estruturado e fácil de navegar
- Collaboração: Equipes podem trabalhar em módulos diferentes
Workflow | Status | Descrição |
---|---|---|
CI | Build, Test, Lint, Security | |
CD | Deploy para AWS |
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature
) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature'
) - Push para a branch (
git push origin feature/AmazingFeature
) - Abra um Pull Request
- Aguarde o CI passar ✅
- Após merge, o CD fará deploy automaticamente 🚀