Giter Club home page Giter Club logo

aws-lambdas's Introduction

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://pa11tf7p86.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!

aws-lambdas's People

Contributors

xcirel avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.