Deploy de Aplicação Flask Usando Docker e GitHub Actions na AWS
Neste post, vamos automatizar o deploy de uma aplicação Flask usando Docker e GitHub Actions diretamente para o AWS Elastic Beanstalk. Ao invés de usar um arquivo ZIP, vamos criar uma imagem Docker para a aplicação e utilizá-la no processo de deploy. Isso permite que o ambiente de produção seja configurado de maneira mais consistente e escalável. Vamos ver como configurar isso passo a passo.
O AWS Elastic Beanstalk suporta contêineres Docker, o que facilita o deploy de aplicações que são empacotadas em contêineres, como no nosso caso, a aplicação Flask. Usaremos o GitHub Actions para construir e empurrar a imagem Docker para o Elastic Beanstalk, e então, atualizar o ambiente com a nova versão da aplicação.
Pré-Requisitos
- Conta AWS: Você precisa de uma conta AWS com permissões para usar o Elastic Beanstalk e o Amazon ECR (Elastic Container Registry).
- Aplicação Flask: Sua aplicação Flask deve estar configurada corretamente, com um arquivo
Dockerfileno repositório. - Credenciais AWS: As chaves de acesso da AWS (Access Key e Secret Key) configuradas no GitHub Secrets.
- GitHub Repository: O código da aplicação Flask deve estar em um repositório no GitHub.
Passo 1: Criando o Dockerfile para sua Aplicação Flask
Para que a aplicação Flask seja executada em um contêiner, você precisa criar um Dockerfile no diretório raiz do seu repositório. Um exemplo básico de Dockerfile seria:
# Usando a imagem base do Python
FROM python:3.8-slim
# Definindo o diretório de trabalho
WORKDIR /app
# Copiando os arquivos do projeto
COPY . /app
# Instalando as dependências
RUN pip install --no-cache-dir -r requirements.txt
# Expondo a porta em que o Flask irá rodar
EXPOSE 5000
# Comando para iniciar a aplicação Flask
CMD ["python", "app.py"]
Esse Dockerfile configura o ambiente para a aplicação Flask, instala as dependências definidas no requirements.txt, expõe a porta 5000 e define o comando para rodar a aplicação Flask.
Passo 2: Configuração das Credenciais AWS no GitHub
Para permitir que o GitHub Actions interaja com a AWS, você precisa configurar as credenciais AWS no seu repositório GitHub. Siga os seguintes passos:
- No AWS Console, crie um usuário IAM com permissões para usar o Elastic Beanstalk e o ECR (Elastic Container Registry), e gere uma chave de acesso para esse usuário.
- No GitHub, acesse o repositório e vá para "Settings" > "Secrets".
- Adicione os seguintes segredos:
- AWS_ACCESS_KEY_ID: A chave de acesso da AWS.
- AWS_SECRET_ACCESS_KEY: A chave secreta de acesso da AWS.
- AWS_REGION: A região onde seu Elastic Beanstalk e ECR estão localizados (ex:
us-east-1). - AWS_ECR_REPO: O nome do repositório ECR onde a imagem Docker será armazenada.
Passo 3: Criando o Workflow no GitHub Actions
Agora que a aplicação Flask e as credenciais estão configuradas, podemos criar um arquivo de workflow do GitHub Actions para construir e fazer o deploy da imagem Docker para o Elastic Beanstalk.
Crie um arquivo chamado .github/workflows/deploy.yml com o seguinte conteúdo:
name: Deploy Flask App to AWS Elastic Beanstalk using Docker
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Docker
uses: docker/setup-buildx-action@v2
- name: Log in to AWS ECR
run: |
aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com
- name: Build and push Docker image
run: |
docker build -t ${{ secrets.AWS_ECR_REPO }} .
docker tag ${{ secrets.AWS_ECR_REPO }}:latest ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.AWS_ECR_REPO }}:latest
docker push ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.AWS_ECR_REPO }}:latest
- name: Deploy to Elastic Beanstalk
run: |
aws elasticbeanstalk create-application-version --application-name flask-app --version-label $GITHUB_SHA --source-bundle S3Bucket="my-app-bucket",S3Key="flask-app.zip"
aws elasticbeanstalk update-environment --application-name flask-app --environment-name flask-env --version-label $GITHUB_SHA
Explicação dos passos:
- Checkout code: Faz o checkout do código do repositório.
- Set up Docker: Configura o ambiente Docker no GitHub Actions.
- Log in to AWS ECR: Faz login no Amazon ECR usando as credenciais da AWS para poder empurrar a imagem Docker para o repositório ECR.
- Build and push Docker image: Constrói a imagem Docker e a empurra para o repositório ECR na AWS.
- Deploy to Elastic Beanstalk: Atualiza o ambiente do Elastic Beanstalk com a nova versão da aplicação, que agora está em um contêiner Docker.
Passo 4: Testando o Workflow
Depois de configurar o arquivo de workflow, sempre que você fizer um commit no branch main, o GitHub Actions irá automaticamente construir a imagem Docker, empurrá-la para o Amazon ECR e atualizar o ambiente do Elastic Beanstalk com a nova versão.
Para testar, basta fazer um commit e observar os logs do GitHub Actions para garantir que tudo foi feito corretamente.
Conclusão
Com GitHub Actions, Docker e AWS Elastic Beanstalk, você consegue automatizar o processo de deploy de sua aplicação Flask, tornando-o mais eficiente e escalável. Essa configuração com Docker traz mais flexibilidade e garante que seu ambiente de produção seja idêntico ao de desenvolvimento. Experimente e aproveite as vantagens do CI/CD para sua aplicação!
Comentários
Postar um comentário