

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Usar funções do Lambda como destino de um Application Load Balancer
<a name="lambda-functions"></a>

Você pode registrar suas funções Lambda como destinos e configurar uma regra de listener para encaminhar solicitações ao grupo de destino para sua função Lambda. Quando o load balancer encaminha a solicitação para um grupo de destino com uma função Lambda como um destino, ele invoca sua função Lambda e transmite o conteúdo da solicitação para a função Lambda, no formato JSON.

O balanceador de carga invoca a função do Lambda diretamente em vez de usar uma conexão de rede. Logo, não há requisitos para as regras de saída dos grupos de segurança do Application Load Balancer.

**Limites**
+ A função do Lambda e o grupo de destino devem estar na mesma conta e na mesma região.
+ O tamanho máximo do corpo da solicitação que você pode enviar para uma função Lambda é de 1 MB. Para limites de tamanho relacionados, consulte [Limites de cabeçalho HTTP](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html#http-header-limits).
+ O tamanho máximo da resposta JSON que a função Lambda pode enviar é de 1 MB.
+ WebSockets não são suportados. Solicitações de atualização são rejeitadas com um código HTTP 400.
+ Não há compatibilidade com zonas locais.
+ Não há suporte para ponderações de destinos automáticos (ATW).

**Topics**
+ [Preparar a função do Lambda](#prepare-lambda-function)
+ [Criar um grupo de destino para a função do Lambda](#create-lambda-target-group)
+ [Receber eventos do balanceador de carga](#receive-event-from-load-balancer)
+ [Responder ao balanceador de carga](#respond-to-load-balancer)
+ [Cabeçalhos de vários valores](#multi-value-headers)
+ [Habilitar verificações de integridade](#enable-health-checks-lambda)
+ [Registro da função do Lambda](#register-lambda-function)
+ [Cancelar o registro da função do Lambda](#deregister-lambda-function)

Para uma demonstração, consulte [Destino do Lambda no Application Load Balancer](https://exampleloadbalancer.com/lambda_demo.html).

## Preparar a função do Lambda
<a name="prepare-lambda-function"></a>

As recomendações a seguir se aplicam se você estiver usando sua função do Lambda com um Application Load Balancer.

**Permissões para invocar a função do Lambda**  
Se criar o grupo de destino e registrar a função Lambda usando o Console de gerenciamento da AWS, o console adicionará as permissões necessárias à sua política de função Lambda em seu nome. Caso contrário, depois de criar o grupo-alvo e registrar a função usando o AWS CLI, você deverá usar o comando [add-permission para conceder permissão](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) ao Elastic Load Balancing para invocar sua função Lambda. Recomendamos que você use as chaves de condição `aws:SourceAccount` e `aws:SourceArn` para restringir a invocação da função ao grupo de destino especificado. Para obter mais informações, consulte [O problema de “confused deputy”](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) no *Guia do usuário do 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
```

**Versionamento da função do Lambda**  
É possível registrar uma função Lambda por grupo de destino. Para garantir que você possa alterar sua função Lambda e que o load balancer sempre invoque a versão atual da função Lambda, crie um alias de função e inclua o alias no ARN da função ao registrar a função Lambda com o load balancer. Para obter mais informações, consulte [Aliases de função do AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html) no *Guia do desenvolvedor do AWS Lambda *.

**Tempo limite da função**  
O load balancer aguarda até que sua função Lambda responda ou expire. Recomendamos que você configure o tempo-limite da função Lambda com base no tempo de execução esperado. Para obter informações sobre o valor de tempo limite padrão e como alterá-lo, consulte [Configurar o tempo limite da função do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html). Para obter informações sobre o valor do tempo limite máximo que você pode configurar, consulte [Cotas do AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).

## Criar um grupo de destino para a função do Lambda
<a name="create-lambda-target-group"></a>

Crie um grupo de destino, que é usado no roteamento da solicitação. Se o conteúdo da solicitação corresponder a uma regra de listener com uma ação para encaminhá-la para esse grupo de destino, o load balancer invocará a função Lambda registrada.

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

**Para criar um grupo de destino e registrar a função Lambda**

1. Abra o console do Amazon EC2 em [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. No painel de navegação, em **Load Balancing** (Balanceamento de carga), escolha **Grupos de destino**.

1. Selecione **Criar grupo de destino**.

1. Em **Selecionar um tipo de destino**, escolha **Função do Lambda**.

1. Em **Nome do grupo de destino**, insira um nome para o grupo de destino.

1. (Opcional) Para habilitar as verificações de integridade, escolha **Habilitar** na seção **Verificação de integridade**.

1. (Opcional) Expanda as **Tags**. Para cada etiqueta, escolha **Adicionar nova etiqueta** e insira a chave da etiqueta e o valor da etiqueta.

1. Escolha **Próximo**.

1. Se você estiver pronto para registrar a função do Lambda, escolha **Selecionar uma função do Lambda** e escolha a função do Lambda na lista, ou escolha **Inserir um ARN da função do Lambda** e insira o ARN da função do Lambda,

   Se você não estiver pronto para registrar a função do Lambda, escolha **Registrar a função do Lambda posteriormente** e registre o destino posteriormente. Para obter mais informações, consulte [Registrar destinos](target-group-register-targets.md#register-targets).

1. Selecione **Criar grupo de destino**.

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

**Para criar um grupo de destino do tipo lambda**  
Use o 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 a função do Lambda**  
Use o 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 criar um grupo de destino e registrar a função Lambda**  
Defina um recurso do tipo [AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html). Se você não estiver pronto para registrar a função do Lambda agora, você pode omitir a propriedade `Targets` e adicioná-la posteriormente.

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

------

## Receber eventos do balanceador de carga
<a name="receive-event-from-load-balancer"></a>

O load balancer oferece suporte a invocações do Lambda para solicitações por protocolos HTTP e HTTPS. O load balancer envia um evento no formato JSON. O load balancer adiciona os seguintes cabeçalhos a todas as solicitações: `X-Amzn-Trace-Id`, `X-Forwarded-For`, `X-Forwarded-Port` e `X-Forwarded-Proto`.

Se o cabeçalho `content-encoding` estiver presente, o balanceador de carga Base64 codifica o corpo e define `isBase64Encoded` como `true`.

Se o cabeçalho `content-encoding` não estiver presente, a codificação Base64 dependerá do tipo de conteúdo. Para os seguintes tipos, o balanceador de carga envia o corpo como está e define `isBase64Encoded` como`false`: text/\$1,. application/json, application/javascript, and application/xml Caso contrário, o balanceador de carga Base64 codificará o corpo e definirá `isBase64Encoded` como `true`.

O comando a seguir é um exemplo de evento.

```
{
    "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 ao balanceador de carga
<a name="respond-to-load-balancer"></a>

A resposta da função do Lambda deve incluir o status de codificação Base64, o código do status e os cabeçalhos. É possível omitir o corpo.

Para incluir um conteúdo binário no corpo da resposta, você deve codificar o conteúdo em Base64 e definir `isBase64Encoded` como `true`. O load balancer decodifica o conteúdo para recuperar o conteúdo binário e o envia ao cliente no corpo da resposta HTTP.

O balanceador de carga não respeita hop-by-hop cabeçalhos, como `Connection` ou. `Transfer-Encoding` É possível omitir o cabeçalho `Content-Length` porque o load balancer o calcula antes de enviar respostas aos clientes.

Veja a seguir um exemplo de resposta de uma função do Lambda com base em **nodejs**.

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

Para modelos de função Lambda que funcionam com Application Load Balancers, consulte [application-load-balancer-serverless-app](https://github.com/aws/elastic-load-balancing-tools/tree/master/application-load-balancer-serverless-app) no github. Como alternativa, abra o [console do Lambda](https://console.aws.amazon.com/lambda), escolha **Aplicações**, **Criar uma aplicação** e selecione uma das seguintes opções no AWS Serverless Application Repository:
+ Alb-lambda-Target - S3 UploadFileto
+ Alb-lambda-Target- BinaryResponse
+ ALB-Lambda-Target - IP WhatisMy

## Cabeçalhos de vários valores
<a name="multi-value-headers"></a>

Se as solicitações de um cliente ou respostas de uma função do Lambda contiverem cabeçalhos de vários valores ou contiverem o mesmo cabeçalho várias vezes, ou parâmetros de consulta com vários valores para a mesma chave, você poderá habilitar o suporte para a sintaxe de cabeçalho de vários valores. Após habilitar cabeçalhos de vários valores, os cabeçalhos e os parâmetros de consulta trocados entre o load balancer e a função do Lambda usam matrizes em vez de strings. Se você não habilitar a sintaxe de cabeçalho de vários valores e um cabeçalho ou um parâmetro de consulta tiver vários valores, o load balancer usará o último valor recebido.

**Topics**
+ [Solicitações com cabeçalhos de vários valores](#multi-value-headers-request)
+ [Respostas com cabeçalhos de vários valores](#multi-value-headers-response)
+ [Habilitar cabeçalhos de vários valores](#enable-multi-value-headers)

### Solicitações com cabeçalhos de vários valores
<a name="multi-value-headers-request"></a>

Os nomes dos campos usados ​​para cabeçalhos e parâmetros de string de consulta diferem dependendo da ativação de cabeçalhos de vários valores para o grupo de destino.

A solicitação de exemplo a seguir tem dois parâmetros de consulta com a mesma chave:

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

Com o formato padrão, o load balancer usa o último valor enviado pelo cliente e envia um evento que inclui parâmetros de string de consulta que usam `queryStringParameters`. Por exemplo:

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

Se você ativar cabeçalhos de vários valores, o load balancer usará os dois valores de chave enviados pelo cliente e enviará um evento que inclui parâmetros de string de consulta usando `multiValueQueryStringParameters`. Por exemplo:

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

Da mesma forma, suponha que o cliente envie uma solicitação com dois cookies no cabeçalho:

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

Com o formato padrão, o load balancer usa o último cookie enviado pelo cliente e envia um evento que inclui cabeçalhos que usam `headers`. Por exemplo:

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

Se você ativar cabeçalhos de vários valores, o load balancer usará os dois cookies enviados pelo cliente e enviará um evento que inclui cabeçalhos que usam `multiValueHeaders`. Por exemplo:

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

Se os parâmetros de consulta forem codificados em URL, o load balancer não os decodificará. Decodifique-os na função do Lambda.

### Respostas com cabeçalhos de vários valores
<a name="multi-value-headers-response"></a>

Os nomes dos campos usados ​​para cabeçalhos diferem dependendo da ativação de cabeçalhos de vários valores para o grupo de destino. Você deve usar `multiValueHeaders`, se tiver ativado cabeçalhos de vários valores e `headers` de outra forma.

Com o formato padrão, é possível especificar um único cookie:

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

Se você habilitar os cabeçalhos de vários valores, será necessário especificar vários cookies da seguinte maneira:

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

O balanceador de carga pode enviar os cabeçalhos para o cliente em uma ordem diferente da ordem especificada na carga de resposta do Lambda. Portanto, não conte com o retorno dos cabeçalhos em uma ordem específica.

### Habilitar cabeçalhos de vários valores
<a name="enable-multi-value-headers"></a>

Você pode habilitar ou desabilitar cabeçalhos de vários valores para um grupo de destino com o tipo de destino `lambda`.

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

**Para habilitar cabeçalhos de vários valores**

1. Abra o console do Amazon EC2 em [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. No painel de navegação, em **Load Balancing** (Balanceamento de carga), escolha **Grupos de destino**.

1. Escolha o nome do grupo de destino para abrir sua página de detalhes.

1. Na guia **Atributos**, escolha **Editar**.

1. Habilite **Cabeçalhos de vários valores**.

1. Escolha **Salvar alterações**.

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

**Para habilitar cabeçalhos de vários valores**  
Use o comando [modify-target-group-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-target-group-attributes.html) com o 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 cabeçalhos de vários valores**  
Atualize o [AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)recurso para incluir o `lambda.multi_value_headers.enabled` atributo.

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

------

## Habilitar verificações de integridade
<a name="enable-health-checks-lambda"></a>

Por padrão, as verificações de integridade estão desabilitadas para grupos de destino do tipo `lambda`. Você pode habilitar as verificações de integridade para implementar o failover de DNS com o Amazon Route 53. A função Lambda pode verificar a integridade de um serviço de downstream antes de responder à solicitação de verificação de integridade. Se a resposta da função do Lambda indicar uma falha na verificação de integridade, essa falha será transmitida para o Route 53. É possível configurar o Route 53 para executar o failover para uma pilha de backup da aplicação.

Você será cobrado por verificações de integridade como por qualquer invocação da função Lambda.

A seguir, o formato do evento de verificação de integridade enviado à sua função Lambda. Para verificar se um evento é um evento de verificação de integridade, verifique o valor do campo do agente de usuário. O agente de usuário para verificações de integridade é `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 verificações de integridade para um grupo de destino lambda**

1. Abra o console do Amazon EC2 em [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. No painel de navegação, em **Load Balancing** (Balanceamento de carga), escolha **Grupos de destino**.

1. Escolha o nome do grupo de destino para abrir sua página de detalhes.

1. Na guia **Verificações de integridade**, selecione **Editar**.

1. Em **Verificação de integridade**, selecione **Habilitar**.

1. (Opcional) Atualize as configurações da verificação de integridade conforme necessário.

1. Escolha **Salvar alterações**.

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

**Para habilitar verificações de integridade para um grupo de destino lambda**  
Use o 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 verificações de integridade para um grupo de destino lambda**  
Atualize o [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 da função do Lambda
<a name="register-lambda-function"></a>

Você só pode registrar uma função do Lambda com cada grupo de destino. Para substituir uma função do Lambda, recomendamos criar um grupo de destino, registrar a nova função com o novo grupo de destino e atualizar as regras do receptor para usar o novo grupo de destino.

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

**Para registrar uma função Lambda**

1. Abra o console do Amazon EC2 em [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. No painel de navegação, em **Load Balancing** (Balanceamento de carga), escolha **Grupos de destino**.

1. Escolha o nome do grupo de destino para abrir sua página de detalhes.

1. Na guia **Destinos**, se não houver nenhuma função do Lambda registrada, escolha **Registrar destino**.

1. Selecione a função do Lambda ou insira seu ARN.

1. Escolha **Registrar**.

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

**Para registrar uma função Lambda**  
Use o 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 uma função Lambda**  
Atualize o [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
```

------

## Cancelar o registro da função do Lambda
<a name="deregister-lambda-function"></a>

Se não precisar mais enviar tráfego para sua função Lambda, você poderá cancelar o registro. Depois de cancelar o registro de uma função Lambda, as solicitações em andamento falham com erros HTTP 5XX.

Para substituir uma função do Lambda, recomendamos criar um grupo de destino, registrar a nova função com o novo grupo de destino e atualizar as regras do receptor para usar o novo grupo de destino.

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

**Para cancelar o registro de uma função do Lambda**

1. Abra o console do Amazon EC2 em [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. No painel de navegação, em **Load Balancing** (Balanceamento de carga), escolha **Grupos de destino**.

1. Escolha o nome do grupo de destino para abrir sua página de detalhes.

1. Na guia **Destinos**, selecione o destino e escolha **Cancelar registro**.

1. Quando a confirmação for solicitada, escolha **Cancelar registro**.

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

**Para cancelar o registro de uma função do Lambda**  
Use o 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
```

------