Set up Lambda custom integrations in API Gateway
To show how to set up the Lambda custom, or non-proxy,integration, we create an API Gateway API to expose
the GET /greeting?greeter={name} method to invoke a Lambda function. Use one of the following example Lambda functions for you API.
Use one of the following example Lambda functions:
The
function responds with a message of "Hello, {name}!" if the
greeter parameter value is a non-empty string. It returns a message of
"Hello, World!" if the greeter value is an empty string.
The function returns an error message of "Missing the required greeter
parameter." if the greeter parameter is not set in the incoming request. We
name the function HelloWorld.
You can create it in the Lambda console or by using the AWS CLI. In this section, we reference this function using the following ARN:
arn:aws:lambda:us-east-1:123456789012:function:HelloWorld
With the Lambda function set in the backend, proceed to set up the API.
To set up the Lambda custom integration using the AWS CLI
-
Use the following create-rest-api command to create an API:
aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)'The output will look like the following:
{ "name": "HelloWorld (AWS CLI)", "id": "te6si5ach7", "rootResourceId" : "krznpq9xpg", "createdDate": 1508461860 }You use the API
id(te6si5ach7) and therootResourceId(krznpq9xpg) throughout this example. -
Use the following create-resource command to create an API Gateway Resource of
/greeting:aws apigateway create-resource \ --rest-api-id te6si5ach7 \ --parent-id krznpq9xpg \ --path-part greetingThe output will look like the following:
{ "path": "/greeting", "pathPart": "greeting", "id": "2jf6xt", "parentId": "krznpq9xpg" }You use the
greetingresource'sidvalue (2jf6xt) to create a method on the/greetingresource in the next step. -
Use the following put-method command to create an API method request of
GET /greeting?greeter={name}:aws apigateway put-method --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --authorization-type "NONE" \ --request-parameters method.request.querystring.greeter=falseThe output will look like the following:
{ "apiKeyRequired": false, "httpMethod": "GET", "authorizationType": "NONE", "requestParameters": { "method.request.querystring.greeter": false } }This API method allows the client to receive a greeting from the Lambda function at the backend. The
greeterparameter is optional because the backend should handle either an anonymous caller or a self-identified caller. -
Use the following put-method-response command to set up the
200 OKresponse to the method request ofGET /greeting?greeter={name}:aws apigateway put-method-response \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200 -
Use the following put-integration command to set up the integration of the
GET /greeting?greeter={name}method with a Lambda function, namedHelloWorld. The function responds to the request with a message of"Hello, {name}!", if thegreeterparameter is provided, or"Hello, World!", if the query string parameter is not set.aws apigateway put-integration \ --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/apigAwsProxyRoleThe mapping template supplied here translates the
greeterquery string parameter to thegreeterproperty of the JSON payload. This is necessary because the input to a Lambda function must be expressed in the body.Important
For Lambda integrations, you must use the HTTP method of
POSTfor the integration request, according to the specification of the Lambda service action for function invocations. Theuriparameter is the ARN of the function-invoking action.The output will look like the following:
{ "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" }The IAM role of
apigAwsProxyRolemust have policies that allow theapigatewayservice to invoke Lambda functions. Instead of supplying an IAM role forcredentials, you can call the add-permission command to add resource-based permissions. This is how the API Gateway console adds these permissions. -
Use the following put-integration-response command to set up the integration response to pass the Lambda function output to the client as the
200 OKmethod response:aws apigateway put-integration-response \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method GET \ --status-code 200 \ --selection-pattern ""By setting the selection-pattern to an empty string, the
200 OKresponse is the default.The output will look like the following:
{ "selectionPattern": "", "statusCode": "200" } -
Use the following create-deployment command to deploy the API to a
teststage:aws apigateway create-deployment \ --rest-api-id te6si5ach7 \ --stage-name test -
Test the API using the following cURL command in a 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'