使用 AWS CLI 为 API Gateway 设置 Lambda 代理集成
在此部分中,我们将介绍如何使用 AWS CLI 设置 API 与 Lambda 代理集成。有关使用 API Gateway 控制台配置与 Lambda 代理集成的代理资源的详细说明,请参阅 教程:利用 Lambda 代理集成创建 REST API。
例如,我们使用以下示例 Lambda 函数作为 API 的后端:
export const handler = function(event, context, callback) { console.log('Received event:', JSON.stringify(event, null, 2)); var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; var greeter = 'World'; if (event.greeter && event.greeter!=="") { greeter = event.greeter; } else if (event.body && event.body !== "") { var body = JSON.parse(event.body); if (body.greeter && body.greeter !== "") { greeter = body.greeter; } } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") { greeter = event.queryStringParameters.greeter; } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") { greeter = event.multiValueHeaders.greeter.join(" and "); } else if (event.headers && event.headers.greeter && event.headers.greeter != "") { greeter = event.headers.greeter; } res.body = "Hello, " + greeter + "!"; callback(null, res); };
将这一点与在 API Gateway 中设置 Lambda 自定义集成中的 Lambda 自定义集成设置对比,对此 Lambda 函数的输入可能出现在请求参数和正文中。您可以有更多的自主度来允许客户端传递相同的输入数据。在这里,客户端可以将欢迎者的姓名作为查询字符串参数、标题或正文属性传递。该函数还支持 Lambda 自定义集成。API 设置更简单。您完全无需配置方法响应或集成响应。
使用 AWS CLI 设置 Lambda 代理集成
-
调用
create-rest-api
命令以创建 API:aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)' --region us-west-2
请注意在响应中生成的 API 的
id
值 (te6si5ach7
)。{ "name": "HelloWorldProxy (AWS CLI)", "id": "te6si5ach7", "createdDate": 1508461860 }
您在此部分中需要 API
id
。 -
调用
get-resources
命令以获取根资源id
:aws apigateway get-resources --rest-api-id te6si5ach7 --region us-west-2
成功的响应如下所示:
{ "items": [ { "path": "/", "id": "krznpq9xpg" } ] }
记录根资源
id
值 (krznpq9xpg
)。您在下一个步骤中和以后需要用到它。 -
调用
create-resource
以创建 API Gateway 资源/greeting
:aws apigateway create-resource --rest-api-id te6si5ach7 \ --region us-west-2 \ --parent-id krznpq9xpg \ --path-part {proxy+}
成功响应的形式与下方类似:
{ "path": "/{proxy+}", "pathPart": "{proxy+}", "id": "2jf6xt", "parentId": "krznpq9xpg" }
记录生成的
{proxy+}
资源的id
值 (2jf6xt
)。在下一个步骤中,您需要它在/{proxy+}
资源上创建方法。 -
调用
put-method
以创建ANY
方法的ANY /{proxy+}
请求:aws apigateway put-method --rest-api-id te6si5ach7 \ --region us-west-2 \ --resource-id 2jf6xt \ --http-method ANY \ --authorization-type "NONE"
成功响应的形式与下方类似:
{ "apiKeyRequired": false, "httpMethod": "ANY", "authorizationType": "NONE" }
此 API 方法允许客户端从后端的 Lambda 函数接收或发送问候语。
-
调用
put-integration
以使用名为ANY /{proxy+}
的 Lambda 函数设置HelloWorld
方法的集成。在提供greeter
参数时,此函数使用消息"Hello, {name}!"
响应请求,在未设置查询字符串参数时使用"Hello, World!"
响应。aws apigateway put-integration \ --region us-west-2 \ --rest-api-id te6si5ach7 \ --resource-id 2jf6xt \ --http-method ANY \ --type AWS_PROXY \ --integration-http-method POST \ --uri arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:HelloWorld/invocations \ --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole
重要
对于 Lambda 集成,根据函数调用的 Lambda 服务操作规范,您必须为集成请求使用 HTTP 方法
POST
。apigAwsProxyRole
的 IAM 角色必须具有策略,允许apigateway
服务调用 Lambda 函数。有关 IAM 权限的更多信息,请参阅 用于调用 API 的 API Gateway 权限模型。成功输出的形式与下方类似:
{ "passthroughBehavior": "WHEN_NO_MATCH", "cacheKeyParameters": [], "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:1234567890:function:HelloWorld/invocations", "httpMethod": "POST", "cacheNamespace": "vvom7n", "credentials": "arn:aws:iam::1234567890:role/apigAwsProxyRole", "type": "AWS_PROXY" }
不同于为
credentials
提供 IAM 角色,您可以调用 add-permission 命令以添加基于资源的权限。这是 API Gateway 控制台的功能。 -
调用
create-deployment
以部署 API 到test
阶段:aws apigateway create-deployment --rest-api-id te6si5ach7 --stage-name test --region us-west-2
-
在终端中使用以下 cURL 命令测试 API。
使用查询字符串参数
?greeter=jane
调用 API:curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=jane'
使用
greeter:jane
的标头参数调用 API:curl -X GET https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/hi \ -H 'content-type: application/json' \ -H 'greeter: jane'
使用
{"greeter":"jane"}
的正文调用 API:curl -X POST https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/hi \ -H 'content-type: application/json' \ -d '{ "greeter": "jane" }'
在所有情况下,输出为具有以下响应正文的 200 响应:
Hello, jane!