Definir o manipulador de função do Lambda em Go
O manipulador da função do Lambda é o método no código da função que processa eventos. Quando sua função é invocada, o Lambda executa o método do manipulador. A função é executada até que o manipulador retorne uma resposta, seja encerrado ou atinja o tempo limite.
Uma função do Lambda escrita em Gomain()
.
exemplo Função do Lambda em Go
package main import ( "context" "fmt" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"name"` } func HandleRequest(ctx context.Context, event *MyEvent) (*string, error) { if event == nil { return nil, fmt.Errorf("received nil event") } message := fmt.Sprintf("Hello %s!", event.Name) return &message, nil } func main() { lambda.Start(HandleRequest) }
Um exemplo de entrada para esta função é:
{ "name": "Jane" }
Observe o seguinte:
-
pacote main: no Go, o pacote que contém
func main()
sempre deve ser denominadomain
. -
import: use essa opção para incluir as bibliotecas necessárias para a função do Lambda. Neste caso, ela inclui:
-
context: Objeto de contexto do AWS Lambda em Go.
-
fmt: o objeto de Formatação
do Go usado para formatar o valor de retorno da função. -
github.com/aws/aws-lambda-go/lambda: conforme mencionado anteriormente, implementa o modelo de programação do Lambda para Go.
-
-
func HandleRequest(ctx context.Context, event *MyEvent) (*string, error): esta é a assinatura do manipulador do Lambda. É o ponto de entrada para sua função do Lambda e contém a lógica que é executada quando sua função é invocada. Além disso, os parâmetros incluídos indicam o seguinte:
-
ctx context.Context: fornece informações do runtime da invocação da função do Lambda.
ctx
é a variável que você declara para utilizar as informações disponíveis por meio do Objeto de contexto do AWS Lambda em Go. -
event *MyEvent: um parâmetro chamado
event
que aponta paraMyEvent
. Ela representa a entrada para a função do Lambda. -
*string, error: o manipulador retorna dois valores. O primeiro é um ponteiro para uma string que contém o resultado da função do Lambda. O segundo é um tipo de erro, que é
nil
quando não há erro e contém informações de erropadrão se algo errado ocorre. -
return &message, nil: retorna dois valores. O primeiro é um ponteiro para uma mensagem de string que consiste em uma saudação construída usando o campo
Name
do evento de entrada. O segundo valor,nil
, indica que a função não encontrou nenhum erro.
-
-
func main(): o ponto de entrada que executa o código da função do Lambda. Isso é obrigatório.
Com a adição de
lambda.Start(HandleRequest)
entre colchetes do códigofunc main(){}
, a função do Lambda será executada. De acordo com os padrões da linguagem Go, o colchete de abertura,{
deve ser colocado diretamente no final da assinatura da funçãomain
.
Nomenclatura
- Runtimes provided.al2 e provided.al2023
-
Para funções Go que usam o runtime
provided.al2
ouprovided.al2023
em um pacote de implantação .zip, o arquivo executável que contém o código da função deve ser denominadobootstrap
. Se você estiver implantando a função com um arquivo .zip, o arquivobootstrap
deverá estar na raiz do arquivo .zip. Para funções Go que usam o runtimeprovided.al2
ouprovided.al2023
em uma imagem de contêiner, você pode usar qualquer nome para o arquivo executável.Você pode usar qualquer nome para o manipulador. Para referenciar o valor do manipulador em seu código, você pode usar a variável de ambiente
_HANDLER
. - runtime do go1.x
-
Para funções Go que usam o runtime
go1.x
, o arquivo executável e o manipulador podem compartilhar qualquer nome. Por exemplo, se você definir o valor do manipulador comoHandler
, o Lambda chamará a funçãomain()
no arquivo executávelHandler
.
Para alterar o nome do manipulador de função no console do Lambda no painel de Configurações de runtime, escolha Editar.
Manipulador de função do Lambda usando tipos estruturados
No exemplo acima, o tipo de entrada era uma sequência simples. Mas você também pode passar eventos estruturados para o manipulador da função:
package main import ( "fmt" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"What is your name?"` Age int `json:"How old are you?"` } type MyResponse struct { Message string `json:"Answer"` } func HandleLambdaEvent(event *MyEvent) (*MyResponse, error) { if event == nil { return nil, fmt.Errorf("received nil event") } return &MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil } func main() { lambda.Start(HandleLambdaEvent) }
Um exemplo de entrada para esta função é:
{ "What is your name?": "Jim", "How old are you?": 33 }
A resposta é semelhante a:
{ "Answer": "Jim is 33 years old!" }
Para serem exportados, os nomes do campo no struct do evento devem estar em letra maiúscula. Para obter mais informações sobre a manipulação de eventos de fontes de eventos da AWS, consulte aws-lambda-go/events
Assinaturas válidas de manipulador
Há várias opções ao criar um manipulador de função do Lambda no Go, mas você deve observar as seguintes regras:
-
O manipulador deve ser uma função.
-
O manipulador pode usar de 0 a 2 argumentos. Se houver dois argumentos, o primeiro argumento deverá implementar
context.Context
. -
O manipulador pode retornar de 0 a 2 argumentos. Se houver um único valor de retorno, ele deverá implementar
error
. Se houver dois valores de retorno, o segundo valor deverá implementarerror
.
As assinaturas válidas de manipulador são listadas a seguir. TIn
e TOut
representam tipos compatíveis com a biblioteca encoding/json padrão. Para obter mais informações, consulte func Unmarshal
-
func ()
-
func () error
-
func (TIn) error
-
func () (TOut, error)
-
func (context.Context) error
-
func (context.Context, TIn) error
-
func (context.Context) (TOut, error)
-
func (context.Context, TIn) (TOut, error)
Usar o estado global
Você pode declarar e modificar variáveis globais que são independentes do código do manipulador da função do Lambda. Além disso, o manipulador pode declarar uma função init
que é executada quando o manipulador é carregado. Esse comportamento é o mesmo no AWS Lambda e nos programas Go padrão. Uma única instância de sua função do Lambda nunca manipulará vários eventos simultaneamente.
exemplo Função Go com variáveis globais
nota
Esse código usa o AWS SDK for Go V2. Para obter mais informações, consulte Conceitos básicos do AWS SDK for Go V2
package main import ( "context" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" "log" ) var invokeCount int var myObjects []types.Object func init() { // Load the SDK configuration cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { log.Fatalf("Unable to load SDK config: %v", err) } // Initialize an S3 client svc := s3.NewFromConfig(cfg) // Define the bucket name as a variable so we can take its address bucketName := "DOC-EXAMPLE-BUCKET" input := &s3.ListObjectsV2Input{ Bucket: &bucketName, } // List objects in the bucket result, err := svc.ListObjectsV2(context.TODO(), input) if err != nil { log.Fatalf("Failed to list objects: %v", err) } myObjects = result.Contents } func LambdaHandler(ctx context.Context) (int, error) { invokeCount++ for i, obj := range myObjects { log.Printf("object[%d] size: %d key: %s", i, obj.Size, *obj.Key) } return invokeCount, nil } func main() { lambda.Start(LambdaHandler) }