Uso del objeto de contexto Lambda para recuperar la información de la función Go - AWS Lambda

Uso del objeto de contexto Lambda para recuperar la información de la función Go

En Lambda, el objeto de contexto proporciona métodos y propiedades con información acerca de la invocación, la función y el entorno de ejecución. Cuando Lambda ejecuta su función, pasa un objeto context al controlador. Para usar el objeto de contexto en el controlador, puede declararlo opcionalmente como un parámetro de entrada para el controlador. El objeto de contexto es necesario si desea hacer lo siguiente en el controlador:

Variables, métodos y propiedades compatibles en el objeto de contexto

La biblioteca de contexto de Lambda proporciona las siguientes variables globales, métodos y propiedades.

Variables globales
  • FunctionName: el nombre de la función de Lambda.

  • FunctionVersion: la versión de la función.

  • MemoryLimitInMB: cantidad de memoria asignada a la función.

  • LogGroupName: el grupo de registros de para la función.

  • LogStreamName: el flujo de registro de la instancia de la función.

Métodos de context
  • Deadline: devuelve la fecha en la que la ejecución agota su tiempo de espera, en milisegundos de tiempo Unix.

Propiedades de context
  • InvokedFunctionArn: el nombre de recurso de Amazon (ARN) que se utiliza para invocar la función. Indica si el invocador especificó un número de versión o alias.

  • AwsRequestID: el identificador de la solicitud de invocación.

  • Identity: (aplicaciones móviles) Información acerca de la identidad de Amazon Cognito que autorizó la solicitud.

  • ClientContext: (aplicaciones móviles) Contexto de cliente proporcionado a Lambda por la aplicación cliente.

Acceso a la información del contexto de invocación

Las funciones de Lambda tienen acceso a metadatos acerca de su entorno y la solicitud de invocación. Se puede obtener acceso en el contexto del paquete. Si el controlador incluye context.Context como parámetro, Lambda información acerca de su función en la propiedad Value del contexto. Tenga en cuenta que debe importar la biblioteca lambdacontext para obtener acceso al contenido del objeto context.Context.

package main import ( "context" "log" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-lambda-go/lambdacontext" ) func CognitoHandler(ctx context.Context) { lc, _ := lambdacontext.FromContext(ctx) log.Print(lc.Identity.CognitoIdentityPoolID) } func main() { lambda.Start(CognitoHandler) }

En el ejemplo anterior, lc es la variable que se usa para consumir la información que el objeto context capturó y log.Print(lc.Identity.CognitoIdentityPoolID) imprime dicha información, en este caso, CognitoIdentityPoolID.

En el ejemplo siguiente se indica cómo utilizar el objeto context para monitorear el tiempo que tarda en ejecutarse la función de Lambda. Esto le permite analizar las expectativas de desempeño y ajustar el código de su función en consecuencia, si es necesario.

package main import ( "context" "log" "time" "github.com/aws/aws-lambda-go/lambda" ) func LongRunningHandler(ctx context.Context) (string, error) { deadline, _ := ctx.Deadline() deadline = deadline.Add(-100 * time.Millisecond) timeoutChannel := time.After(time.Until(deadline)) for { select { case <- timeoutChannel: return "Finished before timing out.", nil default: log.Print("hello!") time.Sleep(50 * time.Millisecond) } } } func main() { lambda.Start(LongRunningHandler) }

Uso del contexto en las llamadas e inicializaciones de los clientes del AWS SDK

Si el controlador necesita usar AWS SDK for Go para hacer llamadas a otros servicios, incluya el objeto de contexto como entrada para el controlador. En AWS, una práctica recomendada es pasar el objeto de contexto en la mayoría de las llamadas al AWS SDK. Por ejemplo, la llamada PutObject a Amazon S3 acepta el objeto de contexto (ctx) como primer argumento:

// Upload an object to S3 _, err = s3Client.PutObject(ctx, &s3.PutObjectInput{ ... })

Para inicializar los clientes del SDK correctamente, también puede usar el objeto de contexto para cargar la configuración correcta antes de pasar ese objeto de configuración al cliente:

// Load AWS SDK configuration using the default credential provider chain cfg, err := config.LoadDefaultConfig(ctx) ... s3Client = s3.NewFromConfig(cfg)

Si quiere inicializar los clientes del SDK fuera del controlador principal (es decir, durante la fase de inicialización), puede pasar un objeto de contexto de marcador de posición:

func init() { // Initialize the S3 client outside of the handler, during the init phase cfg, err := config.LoadDefaultConfig(context.TODO()) ... s3Client = s3.NewFromConfig(cfg) }

Si inicializa los clientes de esta manera, asegúrese de pasar el objeto de contexto correcto en las llamadas al SDK desde el controlador principal.