Criando um cassino com AWS: Criando um ambiente de CI/CD
Tags: aws, github, githubactions
Published: 2024-04-09 20:10:50

Seja bem-vindo à nossa primeira etapa sobre como criar um cassino com a Amazon AWS. Ao final desta série, você aprenderá a utilizar serviços da AWS como Lambda, API Gateway, IAM, SNS e DynamoDB.

Iremos construir um cassino totalmente serverless, utilizando Lambda e API Gateway para gerenciar todas as nossas funções.

No próximo post, exploraremos um pouco mais sobre esse universo serverless. Mas, nesse primeiro momento, iremos aprender a configurar nosso ambiente de deploy, pois ele será inteiramente responsável por automatizar as coisas nos bastidores.

Para esta série de conteúdos, você precisará de:

- Uma conta no Github
- Uma conta na AWS

## Configurando nosso ambiente de CI/CD

Vamos começar do princípio. Nosso ambiente de CI/CD é crucial para este tutorial, pois, como utilizaremos serverless para nossas funções, poderíamos ter uma carga muito pesada de funções para fazer deploy manualmente. Imagine ter que fazer uma por uma manualmente? Seria um trabalhão. Por isso, iremos configurar um ambiente de pipeline com as seguintes etapas:

1. Encontrar os nomes das funções dentro da pasta `lambda_functions`.
2. Configurar nosso ambiente de desenvolvimento com Python 3.9.
3. Instalar todas as dependências individuais de cada projeto.
4. Compactar e atualizar as funções Lambda.

Segue a estrutura do projeto:

```lua
-- .github/workflows/deploy.yml
-- lambda_functions
   -- lambda_function_1
   -- lambda_function_2
```

Dentro da nossa pasta .github/workflows, iremos criar um arquivo chamado deploy.yml e colar o código abaixo:

```yml
name: Update Function Code

on:
  push:
    branches:
      - master

jobs:
  get-filenames:
    runs-on: ubuntu-latest
    outputs:
      lambdaArray: ${{ steps.lambda_functions.outputs.lambdas }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Get functions filenames
        id: lambda_functions
        run: |
          directories=$(tree lambda_functions -d -L 1 -J | jq -j -c '.[0].contents | map(.name)')
          echo ::set-output name=lambdas::${directories}

  update-code:
    needs: get-filenames
    strategy:
      matrix:
        lambda: ${{ fromJson(needs.get-filenames.outputs.lambdaArray) }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.9'
          cache: 'pip'

      - name: Zip And Install Lambda functions
        run: |
          cd lambda_functions/${{matrix.lambda}}
          pip install -r requirements.txt -t .
          zip -r ${{matrix.lambda}}.zip .

      - name: Set up AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1

      - name: Update Lambdas code
        run: aws lambda update-function-code --function-name=${{matrix.lambda}} --zip-file=fileb://lambda_functions/${{matrix.lambda}}/${{matrix.lambda}}.zip
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: us-east-1
```

O código YAML acima define um fluxo de trabalho (workflow) para automação de deploys usando o GitHub Actions. Ele consiste em duas etapas principais:

1. **get-filenames**: Esta etapa é responsável por encontrar os nomes das funções dentro da pasta `lambda_functions`. Utiliza a ferramenta `tree` para listar os diretórios e arquivos dentro de `lambda_functions`, em seguida usa `jq` para filtrar apenas os nomes das funções e armazená-los como saída para uso posterior.

2. **update-code**: Esta etapa depende da saída da etapa anterior e utiliza uma matriz para iterar sobre cada função encontrada. Para cada função, ela realiza as seguintes tarefas:
   - Configura o ambiente Python.
   - Instala as dependências de cada função.
   - Compacta o código da função em um arquivo `.zip`.
   - Configura as credenciais da AWS.
   - Atualiza o código da função Lambda na AWS com o arquivo compactado.

Este fluxo de trabalho automatiza o processo de atualização do código das funções Lambda sempre que ocorrer um push para a branch `master` do repositório.

## Criando uma chave secreta na AWS

O código YAML acima define um fluxo de trabalho (workflow) para automação de deploys usando o GitHub Actions. Ele consiste em duas etapas principais:

get-filenames: Esta etapa é responsável por encontrar os nomes das funções dentro da pasta lambda_functions. Utiliza a ferramenta tree para listar os diretórios e arquivos dentro de lambda_functions, em seguida usa jq para filtrar apenas os nomes das funções e armazená-los como saída para uso posterior.

update-code: Esta etapa depende da saída da etapa anterior e utiliza uma matriz para iterar sobre cada função encontrada. Para cada função, ela realiza as seguintes tarefas:

Configura o ambiente Python.
Instala as dependências de cada função.
Compacta o código da função em um arquivo .zip.
Configura as credenciais da AWS.
Atualiza o código da função Lambda na AWS com o arquivo compactado.
Este fluxo de trabalho automatiza o processo de atualização do código das funções Lambda sempre que ocorrer um push para a branch master do repositório.

IAM, ou Identity and Access Management (Gerenciamento de Identidade e Acesso), é um serviço da AWS que permite controlar o acesso aos recursos da AWS de forma segura. Com o IAM, você pode gerenciar usuários, grupos e permissões para conceder acesso apenas às ações necessárias dentro da sua conta AWS.

No contexto deste tutorial, ao criar uma chave secreta na AWS, estamos configurando as credenciais de acesso que serão usadas pelo GitHub Actions para interagir com os serviços da AWS, como Lambda. Essas credenciais são essenciais para garantir que o processo de deploy automatizado tenha permissão para atualizar o código das funções Lambda na sua conta AWS.

1-  Na barra de pesquisa procure por IAM


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/441d6er59fl0dszh16kf.png)

2- Procure por users e clique sobre: Create user


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/slmamz1nbyrwshs3k7zi.png)

3- Escolha um nome de usuário 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/20gp5y8k8rnetw9czkie.png)

4- Na parte de policy escolha por: Attach policies directly


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6zvzlc4ltf5dodmguz3f.png)

5- Pesquise por Lambda e escolha a permissão: Lambda Full Access


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73mzopqg6cngtl5alqqy.png)
6- Revise as informações e clique sobre criar usuário 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5t7mcjipfb4zdizyuolt.png)

7- De volta na nossa tela de usuários, clique sobre o nome de usuário que acabou de criar, e vá ate Security Credentials


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hr6uyzvo816mdyk57hhr.png)

8- Role a tela e procure a sessão de credentials keys e clique sobre Create Access Key


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zma2dpukgf4fhu7obq11.png)

9- Escolha a opção Outside AWS


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ox8ers8mh1hd3kx3vym.png)

10- Clique sobre o botão create access key


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5d7md3y81r0lsc2njpi.png)

## Configurando variáveis de ambiente no Github

1- Crie o seu projeto no github

2- Navegue ate em settings, no menu lateral escolha por Secrets and variables e escolha por Actions


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iju3qght8ye5h6nw4vkh.png)

3- Clique sobre o botão criar New Repository Secret


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pelgufy2rssnj2gxosyx.png)

4- Crie a primeira variavel com o nome de AWS_ACCESS_KEY_ID, no console da AWS copie sua Access key

5- Logo após crie a variavel AWS_SECRET_ACCESS_KEYno console da AWS copie sua Secret access key


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b6ea74gkmaexf0rttt4d.png)

Pronto, nosso ambiente de deploy está configurado para realizar deploys automáticos para a AWS.