

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Uso de funciones de Lambda como destino de un Equilibrador de carga de aplicación
<a name="lambda-functions"></a>

Puede registrar sus funciones de Lambda como destinos y configurar una regla del oyente para reenviar las solicitudes al grupo de destino de la función de Lambda. Cuando el equilibrador de carga reenvía la solicitud a un grupo de destino con una función de Lambda como destino, invoca la función de Lambda y pasa el contenido de la solicitud a la función de Lambda, en formato JSON.

El equilibrador de carga invoca la función de Lambda directamente, en lugar de utilizar una conexión de red. Por lo tanto, no existen requisitos para las reglas de salida de los grupos de seguridad del equilibrador de carga de aplicaciones.

**Límites**
+ La función de Lambda y el grupo de destino deben estar en la misma cuenta y en la misma región.
+ El tamaño máximo del cuerpo de la solicitud que puede enviar a una función de Lambda es de 1 MB. Para ver límites de tamaño relacionados, consulte [Límites de los encabezados HTTP](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html#http-header-limits).
+ El tamaño máximo del JSON de respuesta que la función de Lambda puede enviar es de 1 MB.
+ WebSockets no son compatibles. Las solicitudes de actualización se rechazan con el código HTTP 400.
+ No se admiten las Zonas locales.
+ No se admiten los pesos de destino automáticos (ATW).

**Topics**
+ [Preparar la función de Lambda](#prepare-lambda-function)
+ [Creación de un grupo de destino para la función de Lambda](#create-lambda-target-group)
+ [Recibir eventos del equilibrador de carga](#receive-event-from-load-balancer)
+ [Responder al equilibrador de carga](#respond-to-load-balancer)
+ [Encabezados de varios valores](#multi-value-headers)
+ [Deshabilitar las comprobaciones de estado](#enable-health-checks-lambda)
+ [Registro de la función de Lambda](#register-lambda-function)
+ [Anulación del registro de la función de Lambda](#deregister-lambda-function)

Para ver una demostración, consulte [Destino de Lambda en Equilibrador de carga de aplicación](https://exampleloadbalancer.com/lambda_demo.html).

## Preparar la función de Lambda
<a name="prepare-lambda-function"></a>

Se aplican las recomendaciones siguientes si está utilizando su función de Lambda con un Equilibrador de carga de aplicación.

**Permisos para invocar la función de Lambda**  
Si crea el grupo de destino y registra la función de Lambda utilizando la Consola de administración de AWS, la consola añade los permisos necesarios a la política de su función de Lambda en su nombre. De lo contrario, después de crear el grupo objetivo y registrar la función mediante el AWS CLI, debe utilizar el comando [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) para conceder a Elastic Load Balancing el permiso para invocar la función Lambda. Le recomendamos que use las claves de condición `aws:SourceAccount` y `aws:SourceArn` para restringir la invocación de la función al grupo de destino especificado. Para obtener más información, consulte [El problema del suplente confuso](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) en la *Guía del usuario de IAM*.

```
aws lambda add-permission \
    --function-name lambda-function-arn-with-alias-name \ 
    --statement-id elb1 \
    --principal elasticloadbalancing.amazonaws.com \
    --action lambda:InvokeFunction \
    --source-arn target-group-arn \
    --source-account target-group-account-id
```

**Control de versiones de funciones de Lambda**  
Puede registrar una sola función de Lambda por grupo de destino. Para asegurarse de que puede cambiar la función de Lambda y de que el equilibrador de carga siempre invoque la versión actual de la función de Lambda, cree un alias de función e incluya el alias en el ARN de la función cuando registre la función de Lambda en el equilibrador de carga. Para obtener más información, consulte [alias de funciones de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html) en la *Guía del desarrollador de AWS Lambda *.

**Tiempo de espera de la función**  
El equilibrador de carga espera hasta que la función de Lambda responde o se agota el tiempo de espera. Le recomendamos que configure el tiempo de espera de la función de Lambda en función del tiempo de ejecución previsto. Para obtener información sobre el valor de tiempo de espera predeterminado y cómo modificarlo, consulte [Configuración del tiempo de espera de una función de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html). Para obtener información sobre el valor máximo de tiempo de espera que puede configurar, consulte [Cuotas de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).

## Creación de un grupo de destino para la función de Lambda
<a name="create-lambda-target-group"></a>

Cree el grupo de destino que se va a utilizar para el enrutamiento de solicitudes. Si el contenido de la solicitud coincide con una regla del oyente con una acción para reenviarlo a este grupo de destino, el equilibrador de carga invoca la función de Lambda registrada.

------
#### [ Console ]

**Para crear un grupo de destino y registrar la función Lambda**

1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. En el panel de navegación, en **Load Balancing** (Equilibración de carga), elija **Target Groups** (Grupos de destino).

1. Elija **Crear grupo de destino**.

1. En **Elegir un tipo de destino**, seleccione **Función de Lambda**.

1. En **Nombre del grupo de destino**, escriba el nombre del grupo de destino.

1. (Opcional) Para habilitar las comprobaciones, elija **Comprobación de estado**, **Habilitar**.

1. (Opcional) Amplíe las **Etiquetas**. Para cada etiqueta, seleccione **Agregar nueva etiqueta** e introduzca una clave de etiqueta y un valor de etiqueta.

1. Elija **Siguiente**.

1. Si está listo para registrar la función de Lambda, seleccione **Seleccionar una función de Lambda** y elija la función de Lambda en la lista, o seleccione **Introducir un ARN de función de Lambda** e introduzca el ARN correspondiente.

   Si aún no está listo para registrar la función de Lambda, seleccione **Registrar la función de Lambda más adelant**e y registre el destino posteriormente. Para obtener más información, consulte [Cómo registrar destinos](target-group-register-targets.md#register-targets).

1. Elija **Crear grupo de destino**.

------
#### [ AWS CLI ]

**Para crear un grupo de destino de tipo lambda**  
Utilice el comando [create-target-group](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-target-group.html).

```
aws elbv2 create-target-group \
    --name my-target-group \
    --target-type lambda
```

**Para registrar la función de Lambda**  
Use el comando [register-targets](https://docs.aws.amazon.com/cli/latest/reference/elbv2/register-targets.html).

```
aws elbv2 register-targets \
    --target-group-arn target-group-arn \
    --targets Id=lambda-function-arn
```

------
#### [ CloudFormation ]

**Para crear un grupo de destino y registrar la función Lambda**  
Defina un tipo de recurso. [AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) Si no está listo para registrar la función de Lambda en este momento, puede omitir la propiedad `Targets` y agregarla más adelante.

```
Resources:
  myTargetGroup:
    Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
    Properties:
      Name: my-target-group
      TargetType: lambda
      Tags: 
        - Key: 'department'
          Value: '123'
      Targets:
        - Id: !Ref myLambdaFunction
```

------

## Recibir eventos del equilibrador de carga
<a name="receive-event-from-load-balancer"></a>

El equilibrador de carga admite la invocación de Lambda de solicitudes a través de HTTP y HTTPS. El equilibrador de carga envía un evento en formato JSON. El equilibrador de carga añade los siguientes encabezados a cada solicitud: `X-Amzn-Trace-Id`, `X-Forwarded-For`, `X-Forwarded-Port` y `X-Forwarded-Proto`.

Si el encabezado `content-encoding` está presente, el equilibrador de carga Base64 codifica el cuerpo y establece `isBase64Encoded` en `true`.

Si el encabezado `content-encoding` no está presente, la codificación en Base64 depende del tipo de contenido. Para los siguientes tipos, el balanceador de cargas envía el cuerpo tal cual y lo establece `isBase64Encoded` en`false`: text/\$1,. application/json, application/javascript, and application/xml Para todos los demás tipos, el equilibrador de carga codifica en Base64 el cuerpo y establece `isBase64Encoded` en `true`.

El siguiente es un evento de ejemplo.

```
{
    "requestContext": {
        "elb": {
            "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09"
        }
    },
    "httpMethod": "GET",
    "path": "/",
    "queryStringParameters": {parameters},
    "headers": {
        "accept": "text/html,application/xhtml+xml",
        "accept-language": "en-US,en;q=0.8",
        "content-type": "text/plain",
        "cookie": "cookies",
        "host": "lambda-846800462-us-east-2.elb.amazonaws.com",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)",
        "x-amzn-trace-id": "Root=1-5bdb40ca-556d8b0c50dc66f0511bf520",
        "x-forwarded-for": "72.21.198.66",
        "x-forwarded-port": "443",
        "x-forwarded-proto": "https"
    },
    "isBase64Encoded": false,
    "body": "request_body"
}
```

## Responder al equilibrador de carga
<a name="respond-to-load-balancer"></a>

La respuesta de la función de Lambda debe incluir el estado de codificación en Base64, el código de estado y los encabezados. Puede omitir el cuerpo.

Para incluir contenido binario en el cuerpo de la respuesta, debe codificar en Base64 el contenido y establecer `isBase64Encoded` en `true`. El equilibrador de carga descodifica el contenido para recuperar el contenido binario y lo envía al cliente en el cuerpo de la respuesta HTTP.

El balanceador de cargas no respeta los hop-by-hop encabezados, como o. `Connection` `Transfer-Encoding` Puede omitir el encabezado `Content-Length` porque el equilibrador de carga lo procesa antes de enviar las respuestas a los clientes.

A continuación, se muestra un ejemplo de la respuesta de **nodejs** basado en una función de Lambda.

```
{
    "isBase64Encoded": false,
    "statusCode": 200,
    "statusDescription": "200 OK",
    "headers": {
        "Set-cookie": "cookies",
        "Content-Type": "application/json"
    },
    "body": "Hello from Lambda (optional)"
}
```

Para ver las plantillas de funciones Lambda que funcionan con los balanceadores de carga de aplicaciones, consulta [application-load-balancer-serverless-app](https://github.com/aws/elastic-load-balancing-tools/tree/master/application-load-balancer-serverless-app) en github. También puede abrir la [consola de Lambda](https://console.aws.amazon.com/lambda), elegir **Aplicaciones**, **Crear una aplicación** y seleccionar una de las siguientes opciones de entre AWS Serverless Application Repository:
+ ALB-Lambda-Target- S3 UploadFileto
+ ALB-Lambda-objetivo- BinaryResponse
+ ALB-Lambda-Target- IP WhatisMy

## Encabezados de varios valores
<a name="multi-value-headers"></a>

Si las solicitudes de un cliente o las respuestas de una función de Lambda incluyen encabezados con varios valores o el mismo encabezado varias veces, o parámetros de consulta con varios valores para la misma clave, puede habilitar la compatibilidad con la sintaxis de encabezados de varios valores. Después de habilitar encabezados de varios valores, los encabezados y los parámetros de consulta intercambiados entre el equilibrador de carga y la función de Lambda utilizan matrices en lugar de cadenas. Si no habilita la sintaxis de encabezado de varios valores y un parámetro de encabezado o consulta tiene varios valores, el equilibrador de carga utiliza el último valor que reciba.

**Topics**
+ [Solicitudes con encabezados de varios valores](#multi-value-headers-request)
+ [Respuestas con encabezados de varios valores](#multi-value-headers-response)
+ [Habilitar encabezados de varios valores](#enable-multi-value-headers)

### Solicitudes con encabezados de varios valores
<a name="multi-value-headers-request"></a>

Los nombres de los campos utilizados para los encabezados y los parámetros de cadena de consulta difieren en función de su habilita los encabezados de varios valores para el grupo de destino.

La siguiente solicitud de ejemplo tiene dos parámetros de consulta con la misma clave:

```
http://www.example.com?&myKey=val1&myKey=val2
```

Con el formato predeterminado, el equilibrador de carga utiliza el último valor enviado por el cliente y le envía un evento que incluye parámetros de cadena de consulta que utilizan `queryStringParameters`. Por ejemplo:

```
"queryStringParameters": { "myKey": "val2"},
```

Si habilita los encabezados de varios valores, el equilibrador de carga utiliza ambos valores de clave enviados por el cliente y le envía un evento que incluye parámetros de cadena de consulta que utilizan `multiValueQueryStringParameters`. Por ejemplo:

```
"multiValueQueryStringParameters": { "myKey": ["val1", "val2"] },
```

De forma similar, suponga que el cliente envía una solicitud con dos cookies en el encabezado:

```
"cookie": "name1=value1",
"cookie": "name2=value2",
```

Con el formato predeterminado, el equilibrador de carga utiliza la última cookie enviada por el cliente y le envía un evento que incluye encabezados que utilizan `headers`. Por ejemplo:

```
"headers": {
    "cookie": "name2=value2",
    ...
},
```

Si habilita encabezados de varios valores, el equilibrador de carga utiliza ambas cookies enviadas por el cliente y le envía un evento que incluye encabezados que utilizan `multiValueHeaders`. Por ejemplo:

```
"multiValueHeaders": {
    "cookie": ["name1=value1", "name2=value2"],
    ...
},
```

Si los parámetros de consulta están codificados en URL, el equilibrador de carga no los decodifica. Debe decodificarlos en la función de Lambda.

### Respuestas con encabezados de varios valores
<a name="multi-value-headers-response"></a>

Los nombres de los campos utilizados para los encabezados difieren en función de si habilita encabezados de varios valores para el grupo de destino. Debe utilizar `multiValueHeaders` si ha habilitado encabezados de varios valores y `headers` de lo contrario.

Con el formato predeterminado, puede especificar una única cookie:

```
{
  "headers": {
      "Set-cookie": "cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly",
      "Content-Type": "application/json"
  },
}
```

Con los encabezados de varios valores, debe especificar varias cookies tal y como se indica a continuación:

```
{
  "multiValueHeaders": {
      "Set-cookie": ["cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly","cookie-name=cookie-value;Expires=May 8, 2019"],
      "Content-Type": ["application/json"]
  },
}
```

Es posible que el equilibrador de carga envíe los encabezados al cliente en un orden diferente al especificado en la carga útil de respuesta de Lambda. Por lo tanto, no espere que los encabezados se devuelvan en un orden específico.

### Habilitar encabezados de varios valores
<a name="enable-multi-value-headers"></a>

Puede habilitar o deshabilitar los encabezados de varios valores para un grupo de destino con el tipo de destino `lambda`.

------
#### [ Console ]

**Para habilitar encabezados de varios valores**

1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. En el panel de navegación, en **Load Balancing** (Equilibración de carga), elija **Target Groups** (Grupos de destino).

1. Elija el nombre del grupo de destino para abrir la página de detalles.

1. En la pestaña **Atributos**, seleccione **Editar**.

1. Habilite **Encabezados de varios valores**.

1. Seleccione **Save changes (Guardar cambios)**.

------
#### [ AWS CLI ]

**Para habilitar encabezados de varios valores**  
Utilice el comando [modify-target-group-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-target-group-attributes.html) con el atributo `lambda.multi_value_headers.enabled`.

```
aws elbv2 modify-target-group-attributes \
    --target-group-arn target-group-arn \
    --attributes "Key=lambda.multi_value_headers.enabled,Value=true"
```

------
#### [ CloudFormation ]

**Para habilitar encabezados de varios valores**  
Actualice el [AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)recurso para incluir el atributo. `lambda.multi_value_headers.enabled`

```
Resources:
  myTargetGroup:
    Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
    Properties:
      Name: my-target-group
      TargetType: lambda
      Tags: 
        - Key: 'department'
          Value: '123'
      Targets:
        - Id: !Ref myLambdaFunction
      TargetGroupAttributes:
        - Key: "lambda.multi_value_headers.enabled"
          Value: "true"
```

------

## Deshabilitar las comprobaciones de estado
<a name="enable-health-checks-lambda"></a>

De forma predeterminada, las comprobaciones de estado están deshabilitadas para los grupos de destino de tipo `lambda`. Puede habilitar las comprobaciones de estado a fin de implementar la conmutación por error de DNS con Amazon Route 53. La función de Lambda puede comprobar el estado de un servicio posterior antes de responder a la solicitud de comprobación de estado. Si la respuesta de la función de Lambda indica un error en la comprobación de estado, este error se pasa a Route 53. Puede configurar Route 53 para que realice una conmutación por error a una pila de aplicaciones de reserva.

Se aplican cargos por las comprobaciones de estado, al igual que con las invocaciones a funciones de Lambda.

A continuación, se muestra el formato del evento de comprobación de estado enviado a la función de Lambda. Para comprobar si un evento es un evento de comprobación de estado, compruebe el valor del campo agente-usuario. El agente de usuario de las comprobaciones de estado es `ELB-HealthChecker/2.0`.

```
{
    "requestContext": {
        "elb": {
            "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09"
        }
    },
    "httpMethod": "GET",  
    "path": "/",  
    "queryStringParameters": {},  
    "headers": {
        "user-agent": "ELB-HealthChecker/2.0"
    },  
    "body": "",  
    "isBase64Encoded": false
}
```

------
#### [ Console ]

**Para habilitar comprobaciones de estado en un grupo de destino de lambda**

1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. En el panel de navegación, en **Load Balancing** (Equilibración de carga), elija **Target Groups** (Grupos de destino).

1. Elija el nombre del grupo de destino para mostrar sus detalles.

1. En la pestaña **Health check**, elija **Edit**.

1. En **Comprobación de estado**, seleccione **Habilitar**.

1. (Opcional) Actualice la configuración de comprobación de estado según sea necesario.

1. Seleccione **Save changes (Guardar cambios)**.

------
#### [ AWS CLI ]

**Para habilitar comprobaciones de estado en un grupo de destino de lambda**  
Utilice el comando [modify-target-group](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-target-group.html).

```
aws elbv2 modify-target-group \
    --target-group-arn target-group-arn \
    --health-check-enabled
```

------
#### [ CloudFormation ]

**Para habilitar comprobaciones de estado en un grupo de destino de lambda**  
Actualice el [AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)recurso.

```
Resources:
  myTargetGroup:
    Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
    Properties:
      Name: my-target-group
      TargetType: lambda
      HealthCheckEnabled: true
      Tags: 
        - Key: 'department'
          Value: '123'
      Targets:
        - Id: !Ref myLambdaFunction
```

------

## Registro de la función de Lambda
<a name="register-lambda-function"></a>

Puede registrar una sola función de Lambda con cada grupo de destino. Para reemplazar una función de Lambda, recomendamos crear un nuevo grupo de destino, registrar la nueva función en ese grupo y actualizar las reglas del oyente para que utilicen el nuevo grupo de destino.

------
#### [ Console ]

**Para registrar una función Lambda**

1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. En el panel de navegación, en **Load Balancing** (Equilibración de carga), elija **Target Groups** (Grupos de destino).

1. Elija el nombre del grupo de destino para mostrar sus detalles.

1. En la pestaña **Destinos**, si no hay ninguna función de Lambda registrada, seleccione **Registrar destino**.

1. Seleccione la función de Lambda o introduzca su ARN.

1. Elija **Registro**.

------
#### [ AWS CLI ]

**Para registrar una función Lambda**  
Use el comando [register-targets](https://docs.aws.amazon.com/cli/latest/reference/elbv2/register-targets.html).

```
aws elbv2 register-targets \
    --target-group-arn target-group-arn \
    --targets Id=lambda-function-arn
```

------
#### [ CloudFormation ]

**Para registrar una función Lambda**  
Actualice el [AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)recurso.

```
Resources:
  myTargetGroup:
    Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
    Properties:
      Name: my-target-group
      TargetType: lambda
      Tags: 
        - Key: 'department'
          Value: '123'
      Targets:
        - Id: !Ref myLambdaFunction
```

------

## Anulación del registro de la función de Lambda
<a name="deregister-lambda-function"></a>

Si ya no necesita enviar tráfico a la función de Lambda, puede anular su registro. Después de anular el registro de una función de Lambda, las solicitudes en tránsito producirán errores HTTP 5XX.

Para reemplazar una función de Lambda, recomendamos crear un nuevo grupo de destino, registrar la nueva función en ese grupo y actualizar las reglas del oyente para que utilicen el nuevo grupo de destino.

------
#### [ Console ]

**Para anular el registro de una función de Lambda**

1. Abra la consola de Amazon EC2 en [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. En el panel de navegación, en **Load Balancing** (Equilibración de carga), elija **Target Groups** (Grupos de destino).

1. Elija el nombre del grupo de destino para mostrar sus detalles.

1. En la pestaña **Destinos**, seleccione el destino y elija **Anular registro**.

1. Cuando se le pida que confirme, elija **Deregister**.

------
#### [ AWS CLI ]

**Para anular el registro de una función de Lambda**  
Use el comando [deregister-targets](https://docs.aws.amazon.com/cli/latest/reference/elbv2/deregister-targets.html).

```
aws elbv2 deregister-targets \
    --target-group-arn target-group-arn \
    --targets Id=lambda-function-arn
```

------