Dando continuidade aos meus posts anteriores sobre LocalStack, hoje vou mostrar como criar uma Lambda Function em Go e publicá-la em um ambiente local que simula os serviços da AWS.
O objetivo é explorar como configurar, testar e integrar funções Lambda de maneira eficiente em um ambiente de desenvolvimento isolado, utilizando o LocalStack.
Caso tenha interesse em ler os artigos anteriores sobre este tema, segue link de cada um deles abaixo:
- Trabalhando com AWS em um ambiente localhost
- AWS SES + Node.js + LocalStack
- [Dica rápida] Executando AWS Lambda com localstack
Go
Para o nosso exemplo prático, vamos criar uma função que calcula o retorno esperado de um investimento com base em parâmetros fornecidos pelo usuário, como valor inicial, taxa de juros e período de tempo.
Dentro do diretório que você escolheu para o seu projeto, crie um arquivo chamado main.go e atualize ele com o seguinte trecho de código:
package main
import (
"context"
"github.com/aws/aws-lambda-go/lambda"
)
// Estrutura de entrada
type Input struct {
InitialAmount float64 `json:"initial_amount"` // Valor inicial
Rate float64 `json:"rate"` // Taxa de juros em porcentagem
Periods int `json:"periods"` // Número de períodos
}
// Estrutura de saída
type Output struct {
FinalAmount float64 `json:"final_amount"` // Valor final do investimento
}
// handler processa o cálculo do investimento
func handler(ctx context.Context, input Input) (Output, error) {
// Calcular o valor final: FV = PV * (1 + i)^n
finalAmount := input.InitialAmount * pow(1+(input.Rate/100), input.Periods)
// Criar o output
output := Output{
FinalAmount: finalAmount,
}
return output, nil
}
// Função auxiliar para cálculo de potência
func pow(base float64, exp int) float64 {
result := 1.0
for i := 0; i < exp; i++ {
result *= base
}
return result
}
func main() {
lambda.Start(handler)
}
Obs.: Não esqueça de executar o comando go mod tidy para importar os pacotes.
Como o foco deste post não será demostrar o código Go, eu deixei alguns comentários no exemplo anterior para facilitar o seu entendimento.
Com a função criada, o próximo passo é compilar o código para gerar o binário necessário para execução no ambiente da AWS Lambda. Para isso, execute o seguinte comando no terminal:
GOOS=linux GOARCH=amd64 go build -o main main.go
Agora vamos zipar a nossa function:
zip function.zip main
Obs.: Para os próximo passos você precisa estar com o seu ambiente configurado, caso não esteja com ele cpmfogirado ainda, recomendo a leitura do meu artigo anterior, onde demonstro este passo a passo.
Com a Localstack rodando e o seu aws cli configurado apontando para o seu ambiente local.
Execute o seguinte comando no seu terminal para publicar a sua function:
aws --endpoint-url=http://localhost:4566 lambda create-function \
--function-name InvestmentLambda \
--runtime go1.x \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler main \
--zip-file fileb://function.zip
Analisando este comando, ele envia o código da nossa função Lambda (contido no arquivo function.zip
) para o LocalStack. A função é registrada com o nome InvestmentCalculator
, configurada para rodar no runtime Go, e está pronta para ser invocada em ambiente local.
Caso tenha interesse em verificar se ele foi publicado corretamente, basta acessar o Dashboard da LocalStack e acessar as suas lambdas:
Para testar este fluxo, vamos criar um arquivo .http
que simula a invocação da nossa função Lambda diretamente no LocalStack.
### Invoke the Investment Lambda Function
POST http://localhost:4566/2015-03-31/functions/InvestmentLambda/invocations
Content-Type: application/json
X-Amz-CLI-Binary-Format: raw-in-base64-out
{
"initial_amount": 1000,
"rate": 5,
"periods": 12
}
Executando este request na nossa function, nós temos o seguinte resultado:
Bem simples né?
Bom, como o foco deste artigo e ser algo rápido e prático, eu finalizo ele aqui e qualquer dúvida que você tenha neste processo, deixe uma mensagem nos comentários 🙂
Até mais pessoal.
Artigo publicado originalmente em https://programadriano.medium.com/dic%C3%A1-r%C3%A1pida-criando-e-publicando-uma-lambda-function-em-go-na-localstack-48590fc4293d