Implemente pipelines CI/CD para micro-serviços em python rodando em container no Fargate.
- Linguagem: Python
- Repositório: CodeCommit
- Pipeline: CodePipeline + CodeBuild + CodeDeploy
- Recurso computacional: ECS Fargate
- Git Secrets
- Unit Test & Test Coverage
- Lint para Cloudformation
- Lint para Dockerfile
- SAST
- Container Security
informações enviadas por e-mail
- Você deve pegar suas credenciais na console do Event Engine, na opção AWS Console
- Exemplo de configuração do arquivo ~/.aws/credentials
Importante configurar o parâmetro aws_session_token!
[myprofile]
aws_access_key_id = <your_access_key>
aws_secret_access_key = <your_secret_key>
aws_session_token = <your_token>
O comando abaixo deverá retornar seu AccountId:
aws sts get-caller-identity --query Account --output text --profile <profile>
- Na Console do IAM, crie um novo usuário com acesso do tipo Programmatic access (sem acesso à console), crie um grupo chamado CodeCommitUsers e selecione a managed policy AWSCodeCommitPowerUser.
- Crie uma nova credencial HTTPS para o CodeCommit para este novo usuário.
- Na Console do CodeCommit, crie um repositório apenas para teste.
- Clone o repositório em sua máquina utilizando a nova credencial.
- Para copiar a URL do novo repositório, clique em Clone URL, depois em Clone HTTPS.
- Na sua máquina, execute:
git clone <RepoURL>
- Delete o repositório.
git clone https://github.com/hgbueno/devtools-workshop.git
Seguindo a boa prática para segmentar stacks em camadas, criaremos 3 stacks:
- 1. Netwoking: Toda a infraestrutura de VPC e conectividade em multi-az(2), incluindo o Application Load Balancer.
- 2. Common: Recursos que serão compartilhados entre todas os micro-serviços que criaremos. KMS e S3 Bucket.
- 3. Fargate: Cluster Fargate.
ATENÇÃO! Existem dependências entre as stacks, portanto elas não podem ser criadas paralelamente.
aws cloudformation deploy \
--stack-name networking \
--template-file foundation/networking.yaml \
--capabilities CAPABILITY_IAM \
--region <region> \
--profile <profile>
aws cloudformation deploy \
--stack-name commons \
--template-file foundation/commons.yaml \
--capabilities CAPABILITY_IAM \
--region <region> \
--profile <profile>
aws cloudformation deploy \
--stack-name fargate \
--template-file foundation/fargate.yaml \
--capabilities CAPABILITY_IAM \
--region <region> \
--profile <profile>
Na Console do Cloudformation, crie uma nova stack com base no template pipeline.yaml com os seguintes parâmetros:
- Stack name: pipeline-myapp
- ServiceName: myapp
- Email: <seu_email>
Não é necessário alterar os valores dos demais parâmetros.
- ATENÇÃO! Você receberá um e-mail para confirmar a inscrição no tópico SNS. Faça essa confirmação antes de prosseguir.
- Verifique que o repositório foi criado no CodeCommit.
- Verifique que a pipeline foi criada no CodePipeline.
- Acesse a Console do CodeCommit, clique em Clone URL, depois em Clone HTTPS.
- Na sua máquina, execute:
git clone <RepoURL>
- Copie o conteúdo do diretório sample-app do repositório do workshop para o novo repositório do CodeCommit. Exemplo:
cp -rpf ../devtools-workshop/sample-app/* <RepoName>/
ATENÇÃO NESTE PASSO!
-
templates/service.yaml
- ServiceName: myapp
- ServicePath: /myapp
- BranchName: master
- AlbRulePriority: 2 (AlbRulePriority+1) Este número nunca deve ser repetido entre os micro-serviços
-
app/main.py
- mypath="myapp"
git add .
git commit -m "first commit"
git push origin master
- Acesse a Console do CodePipeline
- Acompanhe os logs de execução de cada job do CodeBuild.
- Valide que os relatórios de execução estão sendo salvos no Bucket S3
- Após o estágio de Publish, você receberá um e-mail solicitando aprovação para seguir com a pipeline.
- Acesse a URL do Load Balancer adicionando o path do seu microserviço para vê-lo funcionando.
- Para pegar a URL do Load Balancer, vá até a Console do Cloudformation, acesse a stack networking e clique em Outputs.
- Ao final da URL, adicione "/myapp".
- Obs: Este passo somente funcionará após iniciar o deploy do serviço. (penúltimo estágio da pipeline).
- Atualize (refresh) algumas vezes a página para conferir que as conexões estão sendo balanceadas entre as duas AZ's.
- Obs: Este passo somente funcionará após iniciar o deploy do serviço. (penúltimo estágio da pipeline).
git checkout -b develop
ATENÇÃO NESTE PASSO!
-
templates/service.yaml
- ServiceName: myapp (este parâmetro não muda!)
- ServicePath: /myapp-develop (este é o path que será usado no ALB para o novo micro-serviço)
- BranchName: develop
- AlbRulePriority: 3 (AlbRulePriority+1) ATENÇÃO! Este número nunca deve ser repetido entre os micro-serviços
-
app/main.py
- mypath="myapp-develop"
git add .
git commit -m "first commit"
git push origin develop
Na Console do Cloudformation, crie uma nova stack com base no template pipeline.yaml com os seguintes parâmetros:
- Stack name: pipeline-myapp-develop
- ServiceName: myapp (mesmo nome do serviço criado anteriormente)
- BranchName: develop
- Email: seu@email.com
- ManualApproval: false
Não é necessário alterar os valores dos demais parâmetros.
- Verifique que a pipeline foi criada no CodePipeline.
Não será criado um novo repositório como da primeira vez porque existe uma condition no Cloudformation para apenas criar o repositório quando a branch informada for a master.
- Acesse a URL do Load Balancer adicionando o path do seu microserviço para vê-lo funcionando.
- Para pegar a URL do Load Balancer, vá até a Console do Cloudformation, acesse a stack networking e clique em Outputs.
- Ao final da URL, adicione "/myapp-develop".
- Obs: Este passo somente funcionará após iniciar o deploy do serviço. (penúltimo estágio da pipeline).
- Atualize (refresh) algumas vezes a página para conferir que as conexões estão sendo balanceadas entre as duas AZ's.
- Obs: Este passo somente funcionará após iniciar o deploy do serviço. (penúltimo estágio da pipeline).
- Na Console do Cloudformation, edite a stack da pipeline master (pipeline-myapp), selecionando a opção Use current template.
- Habilite os demais testes que estavam desabilitados.
- Após concluir a atualização, vá até a pipeline no console do CodePipeline e clique em Release Changes.