Controlador de funciones AWS Lambda en Go - AWS Lambda

Controlador de funciones AWS Lambda en Go

El controlador de la función de Lambda es el método del código de la función que procesa eventos. Cuando se invoca una función, Lambda ejecuta el método del controlador. Si el controlador existe o devuelve una respuesta, pasará a estar disponible para gestionar otro evento.

Una función de Lambda escrita en Go se crea como ejecutable de Go. En el código de la función de Lambda, debe incluir el paquete github.com/aws/aws-lambda-go/lambda, que implementa el modelo de programación de para Go. Además, debe implementar el código de la función de controlador y una función main().

package main import ( "fmt" "context" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"name"` } func HandleRequest(ctx context.Context, name MyEvent) (string, error) { return fmt.Sprintf("Hello %s!", name.Name ), nil } func main() { lambda.Start(HandleRequest) }

Tenga en cuenta lo siguiente:

  • package main: en Go, el paquete que contiene func main() debe denominarse siempre main.

  • import: utilice esta opción para incluir las bibliotecas que requiere la función de Lambda. En este ejemplo, incluye:

    • context: Objeto context AWS Lambda en Go.

    • fmt: objeto de formato de Go que se utiliza para dar formato al valor de retorno de la función.

    • github.com/aws/aws-lambda-go/lambda: como se mencionó anteriormente, implementa el modelo de programación de Lambda para Go.

  • func HandleRequest(ctx context.Context, name MyEvent) (string, error): esta es la firma de controlador de Lambda e incluye el código que se va a ejecutar. Además, los parámetros incluidos indican lo siguiente:

    • ctx context.Context: proporciona información en tiempo de ejecución para la invocación de la función de Lambda. ctx es la variable que declara para aprovechar la información disponible a través de Objeto context AWS Lambda en Go.

    • name MyEvent: tipo de entrada con un nombre de variable de name cuyo valor se devuelve en la instrucción return.

    • string, error: devuelve dos valores: cadena en caso de ejecución correcta e información de error estándar. Para obtener más información sobre el control de errores personalizado, consulte Errores de funciónAWS Lambda en Go.

    • return fmt.Sprintf("Hello %s!", name), nil: devuelve simplemente un saludo "Hello" formateado con el nombre que ha proporcionado en el eevnto de entrada. nil indica que no hubo errores y que la función se ejecutó correctamente.

  • func main(): el punto de entrada que ejecuta el código de la función de Lambda. Esto es necesario.

    Al agregar lambda.Start(HandleRequest) entre los corchetes del código func main(){}, la función de Lambda se ejecuta. De acuerdo con los estándares del lenguaje Go, el corchete de apertura { debe colocarse directamente al final de la firma de función main.

Denominación

Cuando configura una función en Go, el valor de la configuración del controlador es el nombre del archivo ejecutable. Por ejemplo, si establece el valor del controlador como Handler, Lambda llamará a la función main() del archivo ejecutable Handler.

Para cambiar el nombre del controlador de funciones en la consola de Lambda, seleccione edit (editar) en el panel de configuración Runtime (Tiempo de ejecución).

Controlador de funciones de Lambda con tipos estructurados

En el ejemplo anterior, el tipo de entrada era una cadena sencilla. Sin embargo, también pueden pasarse eventos estructurados al controlador de funciones:

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) { return MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil } func main() { lambda.Start(HandleLambdaEvent) }

La solicitud sería similar a la siguiente:

# request { "What is your name?": "Jim", "How old are you?": 33 }

Y la respuesta sería similar a:

# response { "Answer": "Jim is 33 years old!" }

Para que se exporten, los nombres de campo en la estructura de eventos deben estar en mayúsculas. Para obtener más información acerca de cómo controlar eventos de orígenes de eventos de AWS, consulte aws-lambda-go/events.

Firmas de controlador válidas

Al crear un controlador de funciones de Lambda en Go tiene varias opciones, pero debe cumplir las reglas siguientes:

  • El controlador debe ser una función.

  • El controlador puede aceptar entre 0 y 2 argumentos. Si hay dos argumentos, el primero debe implementar context.Context.

  • El controlador puede devolver entre 0 y 2 argumentos. Si hay un único valor de retorno, este debe implementar error. Si hay dos valores de retorno, el segundo debe implementar error. Para obtener más información acerca de cómo implementar la información de control de errores, consulte Errores de funciónAWS Lambda en Go.

A continuación se enumeran las firmas de controlador válidas. TIn y TOut representan los tipos compatibles con la biblioteca estándar encoding/json. Para obtener más información, consulte func Unmarshal a fin de saber cómo se deserializan estos tipos.

  • 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)

Uso del estado global

Es posible declarar y modificar variables globales que son independientes del código de controlador de la función de Lambda. Además, el controlador puede declarar una función init que se ejecute cuando este se carga. El comportamiento es el mismo en AWS Lambda que en los programas Go estándar. Una sola instancia de su función de Lambda nunca controlará varios eventos de forma simultánea.

package main import ( "log" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/aws" ) var invokeCount = 0 var myObjects []*s3.Object func init() { svc := s3.New(session.New()) input := &s3.ListObjectsV2Input{ Bucket: aws.String("examplebucket"), } result, _ := svc.ListObjectsV2(input) myObjects = result.Contents } func LambdaHandler() (int, error) { invokeCount = invokeCount + 1 log.Print(myObjects) return invokeCount, nil } func main() { lambda.Start(LambdaHandler) }