Como passo cabeçalhos personalizados pelo API Gateway para uma função Lambda usando a integração personalizada do Lambda?

Data da última atualização:27-07-2021

Desejo configurar uma função do AWS Lambda para processar cabeçalhos personalizados que passam por minha API do Amazon API Gateway. Como posso configurar isso?

Breve descrição

Por padrão, uma função Lambda processa somente o corpo da solicitação do método que recebe de uma solicitação de API do API Gateway. Para passar cabeçalhos customizados de uma API do API Gateway para uma função Lambda, use o modelo de mapeamento de corpo. A API envia a solicitação de API atualizada para uma função Lambda para processar os cabeçalhos. Então a função Lambda retorna um ou mais valores de cabeçalhos da solicitação original da API.

Resolução

Configurar as permissões necessárias do IAM

Siga as instruções em Controlar acesso a uma API com permissões do IAM.

Para testar esse procedimento, você pode criar uma função do IAM e anexar as seguintes políticas gerenciadas da AWS:

  • AmazonAPIGatewayInvokeFullAccess
  • AmazonAPIGatewayPushToCloudWatchLogs

Criar uma função Lambda para tratar cabeçalhos personalizados de sua API do API Gateway

1.    Abra o console do Lambda.

2.    Escolha Create function (Criar função). É exibida a página Create function (Criar função) com a opção Author from scratch (Autor do zero) selecionada.

3.    No painel Basic information (Informações básicas), faça o seguinte:
Em Function name (Nome da função), insira um nome que descreva o objetivo de sua função. Por exemplo: CustomHeaders.
Em Runtime (Tempo de execução), escolha Node.js 14.x.

4.    Em Permissions (Permissões), expanda Change default execution role (Alterar função de execução padrão).

5.    Escolha Use an existing role (Usar uma função existente). Será exibida uma lista suspensa das funções existentes.

6.    Em Existing role (Função existente), escolha a função de execução do Lambda que você criou anteriormente.

7.    Escolha Create function (Criar função).

8.    No painel Configuration (Configuração), em Function code (Código da função), substitua o código no painel do editor (index.js) por:

exports.handler = (event, context, callback) => {
// TODO implement
callback(null, "This message header was processed by Amazon " +event.headers["header1"]);
};

9.    Escolha Save (Salvar).

Para obter mais informações, consulte Criar funções Lambda com Node.js.

Criar uma API REST do API Gateway

1.    Abra o console do API Gateway.

2.    Escolha Create API (Criar API).

-ou-

(Se esta for a primeira vez que você está usando o API Gateway) É exibida uma página que apresenta os recursos do produto. Em REST API, escolha Build (Criar). Quando a janela pop-up Create Example API (Criar API de exemplo) aparecer, escolha OK.

3.    Em Choose an API type (Escolher um tipo de API), no painel REST API, escolha Build (Criar).

4.    Em Create new API (Criar nova API), escolha New API (Nova API).

5.    Em Settings (Configurações), faça o seguinte:
Em API name (Nome da API), insira um nome que descreva o objetivo de sua função. Por exemplo: SendtoLambda.
(Opcional) Em Description (Descrição), insira uma breve descrição do objetivo de sua API.
Em Endpoint Type (Tipo de endpoint), escolha Regional.

6.    Escolha Create API (Criar API).

Configurar o ponto de integração e o modelo de mapeamento de corpo de sua API

1.    No console do API Gateway, escolha o nome da API que você criou na etapa anterior. A página Resources (Recursos) de sua API é exibida.

2.    Na página Resources (Recursos), escolha Actions (Ações). Escolha Create Resource (Criar recurso).

3.    No painel New Child Resource (Novo recurso filho), faça o seguinte:
Em Resource Name (Nome do recurso), insira um nome que descreva o recurso. Por exemplo: HeadersResource.
Escolha Create Resource (Criar recurso).

4.    Selecione Actions (Ações). Depois, escolha Create Method (Criar método).

5.    Na lista suspensa em /headersresource, escolha POST. Depois, escolha o ícone de sinal de visto.

6.    Na página /headersresource - POST - Setup, faça o seguinte:
Em Integration Type (Tipo de integração), escolha Lambda Function (Função Lambda).
Em Lambda Region (Região do Lambda), escolha a região da AWS que hospeda sua função.
Em Lambda Function (Função Lambda), insira o nome de sua função.
Escolha Save (Salvar). Uma janela pop-up Add Permission to Lambda Function (Adicionar permissão à função do Lambda) é exibida.
Na janela pop-up, escolha OK.

7.    Na página /headersresource - POST - Method Execution, escolha Integration Request (Solicitação de integração).

8.    Na página /headersresource - POST - Integration Request, faça o seguinte:
Expanda Mapping Templates (Modelos de mapeamento).
Em Request body passthrough (Passthrough do corpo da solicitação), escolha When there are no templates defined (recommended) (Quando não houver modelos definidos - recomendado).
Escolha Add mapping template (Adicionar modelo de mapeamento).
Em Content-Type (Tipo de conteúdo), insira application/json. Depois, escolha o ícone de sinal de visto.

9.    No editor de modelos de mapeamento, insira o seguinte:

{
    "method": "$context.httpMethod",
    "body" : $input.json('$'),
    "headers": {
        #foreach($param in $input.params().header.keySet())
        "$param": "$util.escapeJavaScript($input.params().header.get($param))"
        #if($foreach.hasNext),#end
        #end
    }
}

10.    Escolha Save (Salvar).

Implantar sua API em uma nova etapa

1.    Siga as instruções em Implantar uma API REST a uma etapa. Para obter mais informações, consulte Configurar uma etapa usando o console do API Gateway.

2.    No painel Stage Editor (Editor de etapas), copie Invoke URL (URL de invocação) para sua área de transferência.

Exemplo de URL de invocação da API REST

https://1a2bc3d456.execute-api.region.amazonaws.com/test

Teste sua configuração

Para confirmar que os cabeçalhos de mensagem estão sendo processados por sua API e função Lambda, execute o seguinte comando curl:

Importante: substitua https://restApiId.execute-api.region.amazonaws.com/stageName pela URL de invocação de sua API.

curl -H "Content-Type: application/json" -H "header1: API Gateway and AWS Lambda" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/headersresource

Exemplo de saída de comando

"This message header was processed by Amazon API Gateway and AWS Lambda"

Observação:para instalar curl no Windows, consulte Downloads no site do Git. Para mais informações sobre curl, consulte o site do projeto curl.