

# Invocación de URL de funciones de Lambda
<a name="urls-invocation"></a>

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.

**sugerencia**  
Lambda ofrece dos formas de invocar la función a través de un punto de conexión HTTP: URL de función y Amazon API Gateway. Si no está seguro de cuál es el mejor método para el caso, consulte [Selección de un método para invocar una función de Lambda mediante una solicitud HTTP](furls-http-invoke-decision.md).

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
```

**nota**  
Las URL de función no se admiten en las siguientes Regiones de AWS: Asia-Pacífico (Hyderabad) (`ap-south-2`), Asia-Pacífico (Melbourne) (`ap-southeast-4`), Asia-Pacífico (Malasia) (`ap-southeast-5`), Asia Pacífico (Nueva Zelanda) (`ap-southeast-6`), Asia Pacífico (Tailandia) (`ap-southeast-7`) Asia-Pacífico (Taipéi) (`ap-east-2`), Oeste de Canadá (Calgary) (`ca-west-1`), Europa (España) (`eu-south-2`), Europa (Zúrich) (`eu-central-2`), Israel (Tel Aviv) (`il-central-1`) y Medio Oriente (EAU) (`me-central-1`).

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` y `lambda:InvokeFunction`. Para obtener más información, consulte [Control de acceso](urls-auth.md).

**Topics**
+ [Conceptos básicos de invocación de URL de funciones](#urls-invocation-basics)
+ [Cargas de solicitud y respuesta](#urls-payloads)

## Conceptos básicos de invocación de URL de funciones
<a name="urls-invocation-basics"></a>

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)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html). Herramientas tales como [Postman](https://quickstarts.postman.com/guide/aws/index.html?index=..%2F..index#2) 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](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html) 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 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \
-H 'content-type: application/json' \
-d '{ "example": "test" }'
```

## Cargas de solicitud y respuesta
<a name="urls-payloads"></a>

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](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format).

### Formato de carga de solicitud
<a name="urls-request-payload"></a>

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](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format).  |  `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. Los caracteres admitidos incluyen `a-z`, `A-Z`, `0-9`, `.`, `_`, `-`, `%`, `&`, `=` y `+`.  |  `"?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) 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
<a name="urls-response-payload"></a>

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` is `200`.
**nota**  
Los `statusCode` válidos están dentro del rango de 100 a 599.
+ `content-type` is `application/json`.
+ `body` es la respuesta de la función.
+ `isBase64Encoded` is `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) | 
| --- | --- | --- | 
|  <pre>"Hello, world!"</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": "Hello, world!",<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 15<br /><br />"Hello, world!"</pre>  | 

**Ejemplo de salida para una respuesta JSON**


| Salida de función de Lambda | Salida de respuesta interpretada | Respuesta HTTP (lo que ve el cliente) | 
| --- | --- | --- | 
|  <pre>{<br />  "message": "Hello, world!"<br />}</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": {<br />    "message": "Hello, world!"<br />  },<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 34<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

**Ejemplo de salida para una respuesta personalizada**


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

### Cookies
<a name="urls-cookies"></a>

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.


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