Integração contínua no AWS ECS Fargate com AWS Lambda

Um guia de como configurar um deploy automático a partir de uma imagem disponibilizada no AWS Container Registry. Uma coisa que ainda falta no AWS CodePipeline é um fluxo de deploy no ECS a partir da disponibilização de uma imagem no AWS ECR. E fazer um deploy na clicação ou subir um Jenkins só pra
Integração contínua no AWS ECS Fargate com AWS Lambda

Um guia de como configurar um deploy automático a partir de uma imagem

disponibilizada no AWS Container Registry.

Uma coisa que ainda falta no AWS
CodePipeline

é um fluxo de deploy no ECS a partir da disponibilização de uma imagem no AWS
ECR. E fazer um deploy na clicação ou subir um Jenkins só pra resolver esse
problema, não dá né!

Neste post vou ensinar uma forma simples e prática de automatizar seus deploys
no AWS ECS Fargate, a partir de uma imagem
disponibilizada no ECR, registro de containeres da AWS.

**** Importante: **Considero aqui que você já tenha cluster, service e task
definitions já configuradas e que só queira automatizar o processo.

Passo 1: Criar Role no IAM


“white security camera on post” by Paweł
Czerwiński

on Unsplash

Antes de criar nossa Lambda, vamos criar a IAM
Role
que dá
permissão para que ela utilize os serviços da AWS necessários. Pra facilitar,
utilizaremos as AWS Managed
Policies

abaixo:

  • AmazonEC2ContainerRegistryReadOnly: Autoriza a leitura da imagem publicada
    nos repositórios do ECR.
  • AmazonEC2ContainerServiceFullAccess: Autoriza a criação, atualização e
    deleção de Tasks Definitions e Serviços.


Exemplo de uma Role com as policies criadas.

Além das permissões citadas acima, sua Lambda vai precisar de permissões para
escrever Logs no CloudWatch. Então,
adicione também o seguinte trecho como
inline
na sua IAM Role:

Passo 2: Criar Lambda Function

Neste passo, você vai escolher a IAM Role criada no passo anterior. Nosso
script é em Python, pode rodar tanto na versão 2.7 quanto na 3.6:


Criando uma Lambda na mão lá no console.

O Script tem 4 pontos principais:

  • Verifica se o evento
    PutImage
    foi no repositório do projeto que você quer automatizar. Isso é uma garantia
    que você não saia dando deploy em todos os projetos automaticamente.
  • Pega o número da conta de acordo com a IAM
    Role
    utilizada.
    Dessa forma esse script pode ser reaproveitado em ambiente de dev, homologação e
    produção.
  • Registra uma nova Task
    Definition

    com a última imagem disponibilizada. Observe que ele mantem todas as outras
    configurações da task
    .
  • Atualiza o
    Serviço
    com a Task Definition recém-criada.

Copie o script aí embaixo, **substituindo o valor de PROJECT_PREFIX com o nome
do seu projeto/cluster **e cole no editor da AWS:

Passo 2: Testando sua Lambda

Para testar sua lambda, basta configurar um novo payload de teste, clicando em
Configure Test Events” lá no topo do console da AWS. Utilizaremos este
json, que explicarei melhor o que representa no próximo passo.

  • Importante: Obviamente, você tem que substituir os valores
    repositoryName e imageTag de acordo com o seu projeto.

Se tudo deu certo, seu cluster já está atualizando o serviço com a nova taskdef.
Olha aqui pra você
ver…

Passo 3: Criação da Regra no CloudWatch

Agora que sua Lambda está testada e pronta para dar o deploy no ECS,
precisamos estruturar o acionamento dela. Pra tal, utilizaremos as
CloudWatch Rules. Com esse serviço, podemos “escutar” eventos da API da AWS
via CloudTrail e disparar ações a partir
deles. Neste caso, vamos trackear o evento
PutImage”,
que acontece no AWS ECR.

Em “Targets”, escolha a sua Lambda Function, criada no passo 2. Somente o
requestParameters é importante pra gente, então vamos filtrar o restante do
evento, em Configure input. Olha aí embaixo como configurar:


Criando uma regra na mão lá no CloudWatch.

Se estiver utilizando o aws-cli, use o json abaixo pra criar a regra:

Pronto! Agora é só executar um push de uma nova imagem pro repositório e ver
tudo rodando juntinho! Você também tem métricas de acionamento das rules no
próprio CloudWatch.

Caso tenham alguma crítica ou correção pra fazer, não deixem de comentar =)

Valeu, galera! Até a próxima!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *