[Dica rápida] Executando AWS Lambda com localstack (localhost)
Veja nesse artigo como testar a sua lambda em um ambiente local
Dando continuidade ao meu post anterior, onde demonstrei como configurar um ambiente AWS com LocalStack, neste vou demonstrar como criar uma Lambda Function rodando no seu ambiente local.
Segue link do meu artigo anterior onde demoonstro como configurar este ambiente: https://dev.to/programadriano/trabalhando-com-aws-em-um-ambiente-localhost-20i8
Bom, para o nosso exemplo prático nós criaremos um código que baixa dados de um ativo financeiro da bolsa de valores. Para isso, nós utilizaremos a API do Alpha Vantage.
Se você ainda não está familiarizado com esta API, ela fornece dados financeiros, tanto em tempo real quanto históricos, sobre ações, ETFs, moedas e criptomoedas.
Para saber mais informações sobre ela e já criar o seu token, basta clicar no seguinte link: https://www.alphavantage.co/support/#api-key
Com o token criando e o seu ambiente configurado, vamos criar o nosso código.
O nosso primeiro passo será a criação de um novo projeto. Para isso, escolha um diretório no seu computador, e depois execute os seguintes comandos dentro dele:
npm init -y
npm install axios
touch index.js
Em seguida, atualize o arquivo index.js com o seguinte trecho de código:
Neste trecho de código nós estamos criando um handler de uma função Lambda, que será executado quando a função for invocada. Ele é assíncrono, permitindo o uso de await
para operações assíncronas.
Dentro dele estamos fazendo um request simples para buscar os dados de um ativo que devemos receber via parametro.
Obs.: Não esqueça de atualizar a apikey da linha 13 com a que você criou no site da alpha vantage.
Bom, o nosso próximo passo será criar um zip do nosso código e subir ele no s3 (tudo utilizando a localstack), para que possamos publicar e testar ele.
Para zipar o código você pode clicar nele e zipar (ambiente windows) ou utilizar o comando: zip -r function.zip
caso esteja em um outro ambiente linux.
Com o zip do código, o próximo passo será criar recursos na AWS. Para isso nós utilizaremos IAM fictícios. No seu terminal, execute o comando abaixo:
aws --endpoint-url=http://localhost:4566 iam create-role --role-name lambda-ex --assume-role-policy-document file://<(echo '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }')Neste comando, estamos realizando os seguintes passos:
Resultado da execução deste trecho:
Vamos entender cada passo dela:
- Especificação do endpoint:
aws --endpoint-url=http://localhost:4566
Aqui, estamos especificando o endpoint URL para o AWS CLI, que está apontando para http://localhost:4566
.
- Criação do Papel IAM (Role):
iam create-role --role-name lambda-ex
Estamos utilizando o serviço IAM (Identity and Access Management) para criar um novo papel (role) chamado lambda-ex
. Este papel será utilizado pela função Lambda para obter permissões de execução.
- Definição da Política de Assunção de Papel (role):
--assume-role-policy-document file://<(echo '{ "Version": "2012–10–17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }')
Estamos fornecendo a política de assunção de papel através de um documento JSON. Esta política define quem pode assumir este papel (role) e sob quais condições. No nosso caso, estamos permitindo que o serviço Lambda (lambda.amazonaws.com
) assuma este papel (role).
- Versão da Política:
"Version": "2012-10-17"
Indica a versão do formato da política. - Declaração de Permissão:
"Statement": [ { ... } ]
Define as permissões concedidas pela política. - Efeito da Permissão:
"Effect": "Allow"
Indica que a ação descrita é permitida. - Principal:
"Principal": { "Service": "lambda.amazonaws.com" }
Especifica que o serviço Lambda é quem pode assumir este papel. - Ação:
"Action": "sts:AssumeRole"
Especifica que a ação permitida ésts:AssumeRole
, que é necessária para que o serviço Lambda possa assumir o papel.
Com a role criada, vamos criar um bucket S3 para armazenar o arquivo ZIP da nossa Lambda:
aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket
Neste trecho de código estamos criando um bucket chamado my-bucket.
Para fazer o upload do nosso arquivo ZIP, basta executar o seguinte comando no seu terminal:
aws --endpoint-url=http://localhost:4566 s3 cp function.zip s3://my-bucket/function.zip
Com o zip no seu bucket, execute o seguinte comando para criar a sua lambda a partir dele:
aws --endpoint-url=http://localhost:4566 lambda create-function --function-name StockDataDownloader --runtime nodejs14.x --role arn:aws:iam::000000000000:role/lambda-ex --handler index.handler --code S3Bucket=my-bucket,S3Key=function.zip
Para verificar se a sua Lambda foi criada corretamente, você pode acessar o dash da localstack e clicar em lambda, la estarão listadas todas as que você criou no seu ambiente:
Para que possamos testar se tudo foi criado corretamente, crie um novo arquivo chamadoevent.json,
em seguida atualize ele com o trecho de código abaixo:
{
"symbol": "AAPL"
}
Nós utilizaremos este arquivo como parametro para a nossa lambda.
Bom, existem algumas formas para que possamos testar a nossa Lambda, a seguir você tem algumas delas:
Teste via AWS CLI:
Abra o seu terminal e cole a seguinte instrução:
aws --endpoint-url=http://localhost:4566 lambda invoke --function-name StockDataDownloader --payload file://event.json --cli-binary-format raw-in-base64-out --log-type Tail output.txt
Neste trecho de código, estamos chamando a nossa Lambda chamada StockDataDownloader
usando o AWS CLI.
- A função é chamada com um payload fornecido pelo arquivo
event.json
, e o formato binário CLI é especificado comoraw-in-base64-out
. - O endpoint URL está configurado para
http://localhost:4566
. Além disso, estamos solicitando que os logs da execução sejam retornados no terminal (--log-type Tail
) e direcionando a saída da invocação para um arquivo chamadooutput.txt
.
O resultado vai sair no arquivo output.txt
Teste via postman:
Abra o seu postman e importe o seguinte curl:
curl --location 'http://localhost:4566/2015-03-31/functions/StockDataDownloader/invocations' \
--header 'Content-Type: application/json' \
--data '{
"symbol": "AAPL"
}
'
Em seguida execute ele, caso tudo esteja configurado corretamente você tera o seguinte resultado:
Teste via curl:
Abra o seu terminal e cole a seguinte instrução para que possa testar este fluxo:
curl --location 'http://localhost:4566/2015-03-31/functions/StockDataDownloader/invocations' \
--header 'Content-Type: application/json' \
--data '{
"symbol": "AAPL"
}
'
Resultado:
Bom, com isso finalizo este artigo, espero que tenham gostado e até um próximo pessoal :)