Invocación de URL de funciones de Lambda - AWS Lambda

Invocación de URL de funciones de Lambda

Una URL de función es un punto de conexión HTTP(S) dedicado para la función de Lambda. Puede crear y configurar una URL de función a través de la consola de Lambda o la API de Lambda. Al crear una URL de función, Lambda genera automáticamente un punto de conexión de URL único para usted. Una vez que crea una URL de función, el punto de conexión de la URL nunca cambia. Los puntos de conexión de la URL de función tienen el siguiente formato:

https://<url-id>.lambda-url.<region>.on.aws

Las URL de funciones están habilitadas para doble pila y son compatibles con IPv4 e IPv6. Después de configurar la URL de función, puede invocar la función a través de su punto de conexión HTTP(S) mediante un navegador web, curl, Postman o cualquier cliente HTTP. Para invocar una URL de función, debe tener permisos lambda:InvokeFunctionUrl. Para obtener más información, consulte Modelo de seguridad y autenticación .

Conceptos básicos de invocación de URL de funciones

Si la URL de función utiliza el tipo de autenticación AWS_IAM, debe firmar cada solicitud HTTP utilizando AWS Signature Version 4 (SigV4). Herramientas tales como awscurl, Postman y AWS SigV4 Proxy ofrecen formas integradas de firmar sus solicitudes con SigV4.

Si no utiliza una herramienta para firmar solicitudes HTTP en la URL de función, debe firmar manualmente cada solicitud mediante SigV4. Cuando la URL de función recibe una solicitud, Lambda también calcula la firma SigV4. Lambda procesa la solicitud solo si las firmas coinciden. Para obtener instrucciones sobre cómo firmar de manera manual las solicitudes con SigV4, consulte Firmar solicitudes de AWS con Signature Version 4 en la Guía de referencia general de Amazon Web Services.

Si la URL de función utiliza el tipo de autenticación NONE, no es necesario que firme las solicitudes con SigV4. Puede invocar la función mediante un navegador web, curl, Postman o cualquier cliente HTTP.

Para probar solicitudes GET simples a su función, utilice un navegador web. Por ejemplo, si la URL de función es https://abcdefg.lambda-url.us-east-1.on.aws, y toma un parámetro de cadena message, la URL de la solicitud podría tener un aspecto similar al siguiente:

https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld

Para probar otras solicitudes HTTP, como una solicitud POST, puede utilizar una herramienta como curl. Por ejemplo, si desea incluir algunos datos JSON en una solicitud POST a la URL de función, puede utilizar el siguiente comando curl:

curl -v -X POST \ 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \ -H 'content-type: application/json' \ -d '{ "example": "test" }'

Cargas de solicitud y respuesta

Cuando un cliente llama a la URL de función, Lambda asigna la solicitud a un objeto de evento antes de pasarla a la función. A continuación, la respuesta de la función se asigna a una respuesta HTTP que Lambda envía de vuelta al cliente a través de la URL de función.

Los formatos de eventos de solicitud y respuesta siguen el mismo esquema que la versión de formato de carga 2.0 de Amazon API Gateway.

Formato de carga de solicitud

La carga de una solicitud tiene la siguiente estructura:

{ "version": "2.0", "routeKey": "$default", "rawPath": "/my/path", "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value", "cookies": [ "cookie1", "cookie2" ], "headers": { "header1": "value1", "header2": "value1,value2" }, "queryStringParameters": { "parameter1": "value1,value2", "parameter2": "value" }, "requestContext": { "accountId": "123456789012", "apiId": "<urlid>", "authentication": null, "authorizer": { "iam": { "accessKey": "AKIA...", "accountId": "111122223333", "callerId": "AIDA...", "cognitoIdentity": null, "principalOrgId": null, "userArn": "arn:aws:iam::111122223333:user/example-user", "userId": "AIDA..." } }, "domainName": "<url-id>.lambda-url.us-west-2.on.aws", "domainPrefix": "<url-id>", "http": { "method": "POST", "path": "/my/path", "protocol": "HTTP/1.1", "sourceIp": "123.123.123.123", "userAgent": "agent" }, "requestId": "id", "routeKey": "$default", "stage": "$default", "time": "12/Mar/2020:19:03:58 +0000", "timeEpoch": 1583348638390 }, "body": "Hello from client!", "pathParameters": null, "isBase64Encoded": false, "stageVariables": null }
Parámetro Descripción Ejemplo

version

La versión de formato de carga de este evento. Actualmente, las URL de funciones de Lambda son compatibles con la versión de formato de carga 2.0.

2.0

routeKey

Las URL de funciones no utilizan este parámetro. Lambda establece $default como marcador de posición.

$default

rawPath

Ruta de acceso de la solicitud. Por ejemplo, si la URL de solicitud es https://{url-id}.lambda-url.{region}.on.aws/example/test/demo, el valor de la ruta sin procesar es /example/test/demo.

/example/test/demo

rawQueryString

La cadena sin procesar que contiene los parámetros de cadena de consulta de la solicitud.

"?parameter1=value1&parameter2=value2"

cookies

Una matriz que contiene todas las cookies enviadas como parte de la solicitud.

["Cookie_1=Value_1", "Cookie_2=Value_2"]

headers

La lista de encabezados de solicitud, presentada como pares clave-valor.

{"header1": "value1", "header2": "value2"}

queryStringParameters

Los parámetros de consulta de la solicitud. Por ejemplo, si la URL de solicitud es https://{url-id}.lambda-url.{region}.on.aws/example?name=Jane, el valor queryStringParameters es un objeto JSON con una clave de name y un valor de Jane.

{"name": "Jane"}

requestContext

Un objeto que contiene información adicional sobre la solicitud, como el requestId, el momento de la solicitud y la identidad del intermediario si se autoriza a través de AWS Identity and Access Management (IAM).

requestContext.accountId

El ID de Cuenta de AWS del propietario de la función.

"123456789012"

requestContext.apiId

El ID de la URL de función.

"33anwqw8fj"

requestContext.authentication

Las URL de funciones no utilizan este parámetro. Lambda establece esto como null.

null

requestContext.authorizer

Un objeto que contiene información sobre la identidad del intermediario, si la URL de función utiliza el tipo de autenticación AWS_IAM. De lo contrario, Lambda establece esto como null.

requestContext.authorizer.iam.accessKey

La clave de acceso de la identidad del intermediario.

"AKIAIOSFODNN7EXAMPLE"

requestContext.authorizer.iam.accountId

El ID de identidad de Cuenta de AWS del intermediario.

"111122223333"

requestContext.authorizer.iam.callerId

El ID (ID de usuario de IAM) del intermediario.

"AIDACKCEVSQ6C2EXAMPLE"

requestContext.authorizer.iam.cognitoIdentity

Las URL de funciones no utilizan este parámetro. Lambda establece esto como null o lo excluye de JSON.

null

requestContext.authorizer.iam.principalOrgId

El ID de la entidad principal de la organización asociado a la identidad del intermediario.

"AIDACKCEVSQORGEXAMPLE"

requestContext.authorizer.iam.userArn

El nombre de recurso de Amazon (ARN) del usuario de la identidad del intermediario.

"arn:aws:iam::111122223333:user/example-user"

requestContext.authorizer.iam.userId

El ID de usuario de la identidad del intermediario.

"AIDACOSFODNN7EXAMPLE2"

requestContext.domainName

El nombre de dominio de la URL de función.

"<url-id>.lambda-url.us-west-2.on.aws"

requestContext.domainPrefix

El prefijo de dominio de la URL de función.

"<url-id>"

requestContext.http

Un objeto que contiene detalles sobre la solicitud HTTP.

requestContext.http.method

El método HTTP utilizado en esta solicitud. Los valores válidos son GET, POST, PUT, HEAD, OPTIONS, PATCH y DELETE.

GET

requestContext.http.path

Ruta de acceso de la solicitud. Por ejemplo, si la URL de solicitud es https://{url-id}.lambda-url.{region}.on.aws/example/test/demo, el valor de la ruta es /example/test/demo.

/example/test/demo

requestContext.http.protocol

El protocolo de la solicitud.

HTTP/1.1

requestContext.http.sourceIp

La dirección IP de origen de la conexión TCP inmediata que realiza la solicitud.

123.123.123.123

requestContext.http.userAgent

El valor del encabezado de solicitud usuario-agente.

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Gecko/20100101 Firefox/42.0

requestContext.requestId

El ID de la solicitud de invocación. Puede utilizar este ID para realizar un seguimiento de los registros de invocación relacionados con la función.

e1506fd5-9e7b-434f-bd42-4f8fa224b599

requestContext.routeKey

Las URL de funciones no utilizan este parámetro. Lambda establece $default como marcador de posición.

$default

requestContext.stage

Las URL de funciones no utilizan este parámetro. Lambda establece $default como marcador de posición.

$default

requestContext.time

La marca de tiempo de la solicitud.

"07/Sep/2021:22:50:22 +0000"

requestContext.timeEpoch

La marca de tiempo de la solicitud, en fecha de inicio Unix.

"1631055022677"

body

El cuerpo de la solicitud. Si el tipo de contenido de la solicitud es binario, el cuerpo está codificado en base64.

{"key1": "value1", "key2": "value2"}

pathParameters

Las URL de funciones no utilizan este parámetro. Lambda establece esto como null o lo excluye de JSON.

null

isBase64Encoded

TRUE si el cuerpo es una carga binaria y está codificado en base64. FALSE en caso contrario.

FALSE

stageVariables

Las URL de funciones no utilizan este parámetro. Lambda establece esto como null o lo excluye de JSON.

null

Formato de carga de respuesta

Cuando la función devuelve una respuesta, Lambda analiza la respuesta y la convierte en una respuesta HTTP. Las cargas de respuesta de la función tienen el siguiente formato:

{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": "{ \"message\": \"Hello, world!\" }", "cookies": [ "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT", "Cookie_2=Value2; Max-Age=78000" ], "isBase64Encoded": false }

Lambda le infiere el formato de respuesta. Si la función devuelve JSON válido y no devuelve un statusCode, Lambda asume lo siguiente:

  • statusCode es 200.

  • content-type es application/json.

  • body es la respuesta de la función.

  • isBase64Encoded es false.

En los ejemplos siguientes se muestra cómo se asigna la salida de la función de Lambda a la carga de respuesta y cómo se asigna la carga de respuesta a la respuesta HTTP final. Cuando el cliente invoca la URL de función, ve la respuesta HTTP.

Ejemplo de salida para una respuesta de cadena
Salida de función de Lambda Salida de respuesta interpretada Respuesta HTTP (lo que ve el cliente)
"Hello, world!"
{ "statusCode": 200, "body": "Hello, world!", "headers": { "content-type": "application/json" }, "isBase64Encoded": false }
HTTP/2 200 date: Wed, 08 Sep 2021 18:02:24 GMT content-type: application/json content-length: 15 "Hello, world!"
Ejemplo de salida para una respuesta JSON
Salida de función de Lambda Salida de respuesta interpretada Respuesta HTTP (lo que ve el cliente)
{ "message": "Hello, world!" }
{ "statusCode": 200, "body": { "message": "Hello, world!" }, "headers": { "content-type": "application/json" }, "isBase64Encoded": false }
HTTP/2 200 date: Wed, 08 Sep 2021 18:02:24 GMT content-type: application/json content-length: 34 { "message": "Hello, world!" }
Ejemplo de salida para una respuesta personalizada
Salida de función de Lambda Salida de respuesta interpretada Respuesta HTTP (lo que ve el cliente)
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "isBase64Encoded": false }
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "isBase64Encoded": false }
HTTP/2 201 date: Wed, 08 Sep 2021 18:02:24 GMT content-type: application/json content-length: 27 my-custom-header: Custom Value { "message": "Hello, world!" }

Cookies

Para devolver las cookies de su función, no agregue encabezados set-cookie manualmente. En su lugar, incluya las cookies en su objeto de carga de respuesta. Lambda interpreta esto automáticamente y las agrega como encabezados set-cookie de la respuesta HTTP, como en el siguiente ejemplo.

Ejemplo de salida para una respuesta que devuelve cookies
Salida de función de Lambda Respuesta HTTP (lo que ve el cliente)
{ "statusCode": 201, "headers": { "Content-Type": "application/json", "My-Custom-Header": "Custom Value" }, "body": JSON.stringify({ "message": "Hello, world!" }), "cookies": [ "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT", "Cookie_2=Value2; Max-Age=78000" ], "isBase64Encoded": false }
HTTP/2 201 date: Wed, 08 Sep 2021 18:02:24 GMT content-type: application/json content-length: 27 my-custom-header: Custom Value set-cookie: Cookie_1=Value2; Expires=21 Oct 2021 07:48 GMT set-cookie: Cookie_2=Value2; Max-Age=78000 { "message": "Hello, world!" }