8000 GitHub - xcirel/aws-lambdas
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

xcirel/aws-lambdas

Repository files navigation

AWS Lambda with Chalice - Tutorial

Neste projeto iremos trabalhar com algumas funções Lambda utilizando o framework da AWS chamado Chalice em um ambiente Linux. Para mais informações https://pypi.org/project/chalice/.

Como dependências, teremos a biblioteca virtualenv, acesse o link para mais informações https://pypi.org/project/virtualenv/ além da biblioteca pytest para testes https://pypi.org/project/pytest/.

Versões utilizadas neste projeto

Python 3.10.12, chalice 1.30.0, pytest 8.0.1, aws-cli/2.15.10

Pré-requisitos

  • Conta na AWS devidamente configurada (usuário no IAM com permissões para a criação de recursos)
  • AWS CLI instalado e configurado How to instal AWS CLI
  • Após instalar o AWS CLI, execute o comando abaixo para configurar a sua conta.

    aws configure

    Será solicitado o Access Key ID, Secret Access Key, Default region name e Default output format. Preencha com as informações corretas.

    Em default region, geralmente utilizamos us-east-1 e para a saída, podemos utilizar o json.

    Invoke

    Neste primeiro exemplo, iremos criar uma função por invocação, ou seja, ela será chamada por um evento específico.

    Crie um diretório com o nome invoke e dentro dele crie um outro diretório para o virtualenv, vamos chamá-lo de venv.

    Deverá ficar assim

    ~/aws-lambdas/invoke/venv

    Acesse o diretório e execute o comando abaixo para criar o virtualenv.

    cd venv
    virtualenv invoke

    Para ativar o virtualenv digite

    source invoke/bin/activate

    Agora volte para o diretório do projeto ~/aws-lambdas/invoke.

    cd ..

    Agora vamos criar o nosso projeto, digite o comando abaixo.

    chalice new-project

    Em project name, digite invoke para mantermos o mesmo padrão. Após isso, um prompt com algumas opções será exibido, selecione a opção Lambda Functions only. Você receberá uma saída como

    Your project has been generated in ./invoke

    Vamos instalar a lib pytest para fazer nossos testes, aproveite e instale o chalice (agora estamos em um virtual env, lembra...?)

    pip install pytest & pip install chalice

    Para fazer o teste, execute o seguinte comando.

    py.test invoke/tests/test_app.py -s

    Você recebera uma output similar a este.

    ====================================================== test session starts =======================================================
    platform linux -- Python 3.10.12, pytest-8.0.1, pluggy-1.4.0
    rootdir: /home/aws-lambdas/invoke
    collected 1 item                                                                                                                 
    
    invoke/tests/test_app.py YourName
    30
    .
    
    ======================================================= 1 passed in 0.18s ========================================================

    Fazendo o deploy - para fazer o deploy, é importante observar que temos que estar dentro do diretório da função Lambda, neste caso, ~/aws-lambdas/invoke/invoke.

    Digite o comando abaixo.

    chalice deploy 

    Você terá uma saída similar a esta abaixo.

    Creating deployment package.
    Reusing existing deployment package.
    Creating IAM role: invoke-dev
    Creating lambda function: invoke-dev-invoke
    Resources deployed:
      - Lambda ARN: arn:aws:lambda:us-east-1:002603181790:function:invoke-dev-invoke

    Acesse o console de sua conta na AWS veja que sua função estará lá. AWS Console

    Scheduled

    Agora, vamos criar uma função com disparo programado, para isso, será necessário criar um novo diretório chamado scheduled e também o diretório para o virtualenv chamado venv.

    mkdir scheduled & mkdir scheduled/venv 

    Acesse o diretório do projeto e crie o virtualenv.

    cd scheduled/venv
    virtualenv scheduled

    Para ativar o virtualenv execute o comando abaixo.

    source scheduled/bin/activate

    Agora volte para o diretório do projeto ~/aws-lambdas/scheduled

    cd ..

    Verifique se o chalice já está instalado dentro do virtualenv.

    chalice --version

    caso não esteja instalado, instale através do comando abaixo.

    pip install chalice

    Agora crie o projeto.

    chalice new-project

    Em project name, digite scheduled para mantermos o mesmo padrão. Após isso, um prompt com algumas opções será exibido, infelizmente não temos a opção Scheduled Event disponível, assim sendo, vamos utilizar o Lambda Functions only e fazer alguns ajustes no código.

    Vamos instalar a lib pytest para fazer nossos testes, aproveite e instale o chalice (agora estamos em um virtual env, lembra...?)

    pip install pytest

    Para fazer o teste, execute o seguinte comando.

    py.test scheduled/tests/test_app.py -s

    O resultado deverá ser similar a este

    Teste

    Pronto, teste efetuado com sucesso, assim sendo, vamos efetuar o deploy.

    Lembrando de conferir se está dentro do diretório da função Lambda, neste caso, ~/aws-lambdas/scheduled/scheduled.

    chalice deploy

    Acesse o console de sua conta na AWS veja que sua função estará lá. AWS Console

    Além disso, a função será executada a cada 15 minutos, conforme configurado no arquivo app.py.

    @app.schedule("cron(*/15 * ? * * *)")
    def scheduled(event):
        print("Function executed successfully!")
        return True

    Confira os logs no Amazon CloudWatch. Logs

    S3 Trigger

    Vamos para mais uma função, iremos criar uma função que será acionada quando um arquivo for enviado para um bucket S3. Chamaremos esta função de s3trigger.

    Acesse o console da sua conta na AWS e crie um bucket S3, no meu caso, criei um chamado aws-lambdas-chalice.

    Crie o diretório s3trigger e dentro dele, o diretório venv como temos feito nas funções anteriores.

    mkdir s3trigger & mkdir s3trigger/venv 

    Acesse o diretório venv e execute o comando abaixo para criar o virtualenv.

    cd s3trigger/venv
    virtualenv s3trigger

    Ative o virtualenv

    source s3trigger/bin/activate

    Agora volte para o diretório do projeto ~/aws-lambdas/s3trigger.

    cd ..

    Crei o projeto

    chalice new-project

    Em project name, digite s3trigger para mantermos o mesmo padrão. Após isso, um prompt com algumas opções será exibido, neste caso, utilize o S3 Event Handler.

    Observe que o arquivo app.py foi criado com o seguinte conteúdo.

    import os
    
    from chalice import Chalice
    
    app = Chalice(app_name='s3trigger')
    app.debug = True
    
    
    # Set the value of APP_BUCKET_NAME in the .chalice/config.json file.
    S3_BUCKET = os.environ.get('APP_BUCKET_NAME', '')
    
    
    @app.on_s3_event(bucket=S3_BUCKET, events=['s3:ObjectCreated:*'])
    def s3_handler(event):
        app.log.debug("Received event for bucket: %s, key: %s",
                      event.bucket, event.key)

    Na linha referente ao bucket (S3_BUCKET... ...), podemos alterar o conteúdo da variável simplesmente colocando o nome do bucket ou utilizar envs.

    Opção 1 - altere o valor para uma string com o nome do bucket.

    S3_BUCKET = 'aws-lambdas-chalice'

    Opção 2 - utilize envs.

    Abra o arquivo .chalice/config.json e adicione a variável APP_BUCKET_NAME com o nome do bucket. Deverá ficar como abaixo.

    {
      "version": "2.0",
      "app_name": "s3trigger",
      "stages": {
        "dev": {
          "api_gateway_stage": "api",
          "environment_variables": {
            "APP_BUCKET_NAME": "aws-lambdas-chalice"
          }
        }
      }
    }

    Sugestão: Recomendo pesquisar por secrets repository, repository variables, variáveis de ambiente para mais informações, isso é importante para não expor informações sensíveis, você irá usar bastante em ambientes de produção.

    continuando, agora, altere o arquivo de teste test_app.py para que possamos testar a função.

    def test_s3_handler():
        with Client(app) as client:
            event = client.events.generate_s3_event(
                bucket='aws-lambdas-chalice', key='sheet.xls')
            client.lambda_.invoke('s3_handler', event)

    Agora, execute o teste

    py.test s3trigger/tests/test_app.py -s

    Para fazer o deploy, basta acessar o diretório com a função Lambda (neste caso, s3trigger/s3trigger) e executar o comando abaixo.

    chalice deploy

    Veja que a função foi criada com sucesso. AWS Console

    Observe agora o que ocorreu quando foi efetuado o upload de um arquivo para o bucket aws-lambdas-chalice. Logs

    Endpoint - API Gateway

    Neste quarto exemplo, iremos criar uma função que será acionada por um endpoint HTTP, chamaremos esta função de endpoint.

    Crie um diretório com o nome endpoint e dentro dele crie um outro diretório para o virtualenv, vamos chamá-lo de venv.

    mkdir endpoint & mkdir endpoint/venv 

    Acesse este diretório e execute o comando abaixo para criar o virtualenv.

    cd venv
    virtualenv endpoint

    Para ativar o virtualenv digite

    source endpoint/bin/activate

    Agora volte para o diretório do projeto ~/aws-lambdas/endpoint.

    cd ..

    Agora vamos criar o nosso projeto, digite o comando abaixo.

    chalice new-project

    Em project name, digite endpoint para mantermos o mesmo padrão. Após isso, um prompt com algumas opções será exibido, selecione a opção REST API.

    Intale o a lib pytest para fazer nossos testes, aproveite e instale o chalice.

    pip install pytest & pip install chalice

    Para fazer o teste, execute o seguinte comando.

    py.test endpoint/tests/test_app.py -s

    Output.

    ====================================================== test session starts =======================================================
    platform linux -- Python 3.10.12, pytest-8.0.1, pluggy-1.4.0
    rootdir: /home/username/aws-lambdas/endpoint
    collected 1 item                                                                                                                 
    
    endpoint/tests/test_app.py 54321
    .
    
    ======================================================= 1 passed in 0.18s ========================================================

    Uma vez que o teste foi efetuado com sucesso, vamos fazer o deploy.

    Para fazer o deploy, basta acessar o diretório com a função Lambda (neste caso, endpoint/endpoint) e executar o comando abaixo.

    chalice deploy

    A output do comando será similar a esta.

    Creating deployment package.
    Creating IAM role: endpoint-dev
    Creating lambda function: endpoint-dev
    Creating Rest API
    Resources deployed:
      - Lambda ARN: arn:aws:lambda:us-east-1:002603187090:function:endpoint-dev
      - Rest API URL: https://pa1
    5EC8
    1tf7p86.execute-api.us-east-1.amazonaws.com/api/
    

    Agora, acesse o console de sua conta na AWS veja que a função foi criada.

    AWS Console

    AWS Console

    Você pode testar o endpoint através do comando curl, o postman, ou qualquer outra ferramenta de sua preferência.

    curl https://pa11tf7p86.execute-api.us-east-1.amazonaws.com/api/id/54321

    curl

    Você também pode acessar o endpoint através do seu navegador.

    Browser

    Não se esqueça que você pode conferir os logs no Amazon CloudWatch, basta clicar na opção Monitor e depois no botão View CloudWatch logs. Veja na imagem abaixo.

    Link to access logs

    É isso, espero que tenham gostado do tutorial, até a próxima!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

0