Configurar integrações personalizadas do Lambda no API Gateway - Amazon API Gateway

Configurar integrações personalizadas do Lambda no API Gateway

Para mostrar como configurar a integração personalizada do Lambda, criamos uma API do API Gateway para expor o método GET /greeting?greeter={name} para invocar uma função do Lambda. Use um dos exemplos de funções do Lambda a seguir para a API.

Use um dos seguintes exemplos de funções do Lambda:

Node.js
export const handler = function(event, context, callback) { var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; if (event.greeter==null) { callback(new Error('Missing the required greeter parameter.')); } else if (event.greeter === "") { res.body = "Hello, World"; callback(null, res); } else { res.body = "Hello, " + event.greeter +"!"; callback(null, res); } };
Python
import json def lambda_handler(event, context): print(event) res = { "statusCode": 200, "headers": { "Content-Type": "*/*" } } if event['greeter'] == "": res['body'] = "Hello, World" elif (event['greeter']): res['body'] = "Hello, " + event['greeter'] + "!" else: raise Exception('Missing the required greeter parameter.') return res

A função responde com uma mensagem de "Hello, {name}!" se o valor do parâmetro greeter for uma string não vazia. Ela retornará uma mensagem de "Hello, World!" se o valor greeter for uma string vazia. A função retornará uma mensagem de erro de "Missing the required greeter parameter." se o parâmetro do greeter não estiver definido na solicitação de entrada. Atribuímos o nome HelloWorld à função.

Ela pode ser criada no console do Lambda ou usando a AWS CLI. Nesta seção, fazemos referência a essa função usando o seguinte Nome de recurso da Amazon (ARN):

arn:aws:lambda:us-east-1:123456789012:function:HelloWorld

Com a função do Lambda definida no backend, configure a API.

Como configurar a integração personalizada do Lambda usando a AWS CLI
  1. Chame o comando create-rest-api para criar uma API:

    aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)' --region us-west-2

    Observe o valor id da API resultante (te6si5ach7) na resposta:

    { "name": "HelloWorld (AWS CLI)", "id": "te6si5ach7", "createdDate": 1508461860 }

    Você precisará do id da API durante toda esta seção.

  2. Chame o comando get-resources para obter o id do recurso raiz:

    aws apigateway get-resources --rest-api-id te6si5ach7 --region us-west-2

    A resposta bem-sucedida é a seguinte:

    { "items": [ { "path": "/", "id": "krznpq9xpg" } ] }

    Anote o valor id do recurso raiz (krznpq9xpg). Você precisará dele na próxima etapa e mais adiante.

  3. Chame create-resource para criar um recurso do API Gateway de /greeting:

    aws apigateway create-resource --rest-api-id te6si5ach7 \ --region us-west-2 \ --parent-id krznpq9xpg \ --path-part greeting

    A resposta correta é semelhante ao seguinte:

    { "path": "/greeting", "pathPart": "greeting", "id": "2jf6xt", "parentId": "krznpq9xpg" }

    Anote o valor greeting do recurso id (2jf6xt). Você precisará dele para criar um método no recurso /greeting na próxima etapa.

  4. Chame put-method para criar uma solicitação de método de API de GET /greeting?greeter={name}:

    aws apigateway put-method --rest-api-id te6si5ach7 \ --region us-west-2 \ --resource-id 2jf6xt \ --http-method GET \ --authorization-type "NONE" \ --request-parameters method.request.querystring.greeter=false

    A resposta correta é semelhante ao seguinte:

    { "apiKeyRequired": false, "httpMethod": "GET", "authorizationType": "NONE", "requestParameters": { "method.request.querystring.greeter": false } }

    Esse método de API permite que o cliente receba uma saudação da função do Lambda no backend. O parâmetro greeter é opcional, pois o back-end deve lidar com um chamador anônimo ou um chamador autoidentificado.

  5. Chame put-method-response para configurar a resposta 200 OK para a solicitação de método de GET /greeting?greeter={name}:

    aws apigateway put-method-response \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200

  6. Chame put-integration para configurar a integração do método GET /greeting?greeter={name} com uma função do Lambda denominada HelloWorld. A função responde à solicitação com uma mensagem de "Hello, {name}!", se o parâmetro greeter for fornecido ou "Hello, World!", se o parâmetro de string de consulta não for definido.

    aws apigateway put-integration \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --type AWS \ --integration-http-method POST \ --uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations \ --request-templates '{"application/json":"{\"greeter\":\"$input.params('greeter')\"}"}' \ --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole

    O modelo de mapeamento fornecido aqui converte o parâmetro de string de consulta greeter na propriedade greeter da carga útil JSON. Isso é necessário porque a entrada para uma função do Lambda deve ser expressa no corpo.

    Importante

    Para integrações do Lambda, você deve usar o método HTTP de POST para a solicitação de integração, de acordo com a especificação da ação do serviço do Lambda para invocações de função. O parâmetro uri é o Nome de recurso da Amazon (ARN) da ação de invocação da função.

    A saída bem-sucedida é semelhante ao seguinte:

    { "passthroughBehavior": "WHEN_NO_MATCH", "cacheKeyParameters": [], "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations", "httpMethod": "POST", "requestTemplates": { "application/json": "{\"greeter\":\"$input.params('greeter')\"}" }, "cacheNamespace": "krznpq9xpg", "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole", "type": "AWS" }

    A função do IAM de apigAwsProxyRole deve ter políticas que permitem ao serviço apigateway invocar funções do Lambda. Em vez de fornecer uma função do IAM para credentials, você pode chamar o comando add-permission para adicionar permissões baseadas em recurso. É assim que o console do API Gateway adiciona essas permissões.

  7. Chame put-integration-response para configurar a resposta de integração para transmitir a saída da função do Lambda para o cliente como a resposta de método 200 OK.

    aws apigateway put-integration-response \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200 \ --selection-pattern ""

    Ao definir o padrão de seleção como uma string vazia, a resposta 200 OK é o padrão.

    A resposta correta deve ser semelhante ao seguinte:

    { "selectionPattern": "", "statusCode": "200" }
  8. Chame create-deployment para implantar a API em um estágio test:

    aws apigateway create-deployment --rest-api-id te6si5ach7 --stage-name test --region us-west-2
  9. Teste a API usando o seguinte comando cURL em um terminal:

    curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=me' \ -H 'authorization: AWS4-HMAC-SHA256 Credential={access_key}/20171020/us-west-2/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=f327...5751'