使用 Amazon API Gateway 阶段变量
您可以使用 API Gateway 阶段变量访问不同 API 部署阶段的 HTTP 和 Lambda 后端。您还可以使用阶段变量将特定于阶段的配置元数据作为查询参数传递给 HTTP 后端,同时作为在输入映射模板中生成的负载传递到 Lambda 函数中。
Prerequisites
您必须创建两个阶段,并将 url
变量设置为两个不同的 HTTP 终端节点:一个为分配到两个不同的 Lambda 函数的 function
阶段变量,一个为包含特定于阶段的元数据的 version
阶段变量。按照中的说明进行操作使用 Amazon API Gateway 控制台设置阶段变量
使用阶段变量通过 API 访问 HTTP 终端节点
-
在阶段导航窗格中,选择 beta 阶段。在 beta Stage Editor 中,选择 Invoke URL 链接。这将启动 API 根资源上的 beta 阶段
GET
请求。注意 Invoke URL 链接指向 API 在其 beta 阶段的根资源。通过选择该链接导航到 URL,调用根资源上的 beta 阶段
GET
方法。如果方法是在子资源(而非根资源本身)上定义的,则选择 Invoke URL (调用 URL) 链接将返回{"message":"Missing Authentication Token"}
错误响应。在这种情况下,您必须将特定子资源的名称附加到 Invoke URL (调用 URL) 链接。 -
beta 阶段
GET
请求的响应如下所示。您还可以使用浏览器导航到 http://httpbin.org/get,以验证结果。此值已分配到 beta 阶段中的url
变量。这两个响应完全相同。 -
在阶段导航窗格中,选择 prod 阶段。从 prod Stage Editor (prod 阶段编辑器),选择 Invoke URL (调用 URL) 链接。这将启动 API 根资源上的 prod 阶段
GET
请求。 -
prod 阶段
GET
请求的响应如下所示。您可以使用浏览器导航到 http://petstore-demo-endpoint.execute-api.com/petstore/pets,以验证结果。此值已分配到 prod 阶段中的url
变量。这两个响应完全相同。
在查询参数表达式中通过阶段变量将特定于阶段的元数据传递给 HTTP 后端
此过程介绍如何在查询参数表达式中使用阶段变量值将特定于阶段的元数据传递到 HTTP 后端。我们将使用已在 version
中声明的 使用 Amazon API Gateway 控制台设置阶段变量 阶段变量。
-
在资源导航窗格中,选择 GET 方法。要将查询字符串参数添加到方法的 URL 中,请在 Method Request (方法请求) 中选择 Method Execution (方法执行)。输入
version
作为参数名称。 -
在 Method Execution (方法执行) 中,选择 Integration Request (集成请求)。编辑 Endpoint URL (终端节点 URL) 值,以将
附加到之前定义的 URL 值,该值在这种情况下也用?version=${stageVariables.version}
url
阶段变量表示。选择 Deploy API (部署 API),以部署这些更改。 -
在 Stages (阶段) 导航窗格中,选择 beta 阶段。在 beta Stage Editor (beta 阶段编辑器) 中,验证当前阶段是否在最新部署中,然后选择 Invoke URL (调用 URL) 链接。
注意 我们之所以在这里使用测试阶段,是因为 HTTP 终端节点(由
url
变量“http://httpbin.org/get”指定)接受查询参数表达式,并在响应中将其作为args
对象返回。 -
响应如下所示。注意,分配给
v-beta
阶段变量的version
作为version
参数传递到后端。
使用阶段变量通过 API 调用 Lambda 函数
此过程介绍了如何使用阶段变量调用 Lambda 函数作为 API 后端。我们将使用先前声明的 function
阶段变量。有关更多信息,请参阅 使用 Amazon API Gateway 控制台设置阶段变量。
-
在资源窗格中,在根目录下创建 /lambdasv1 子资源,然后在该子资源上创建
GET
方法。将 Integration type (集成类型) 设置为 Lambda Function (Lambda 函数),在 Lambda Function (Lambda 函数) 中,输入${stageVariables.function}
。选择保存。提示 在提示 Add Permision to Lambda Function (将权限添加到 Lambda 函数) 时,在选择 OK (确定) 之前记录Amazon CLI 命令。您必须在每个 Lambda 函数(已分配或即将分配给每个新建 API 方法的
function
阶段变量)上运行命令。例如,如果$stageVariables.function
值为HelloWorld
,而您尚未为此函数添加权限,则必须运行以下 Amazon CLI 命令:aws lambda add-permission --function-name arn:aws:lambda:us-east-1:
account-id
:function:HelloWorld --source-arn arn:aws:execute-api:us-east-1:account-id
:api-id
/*/GET/lambdasv1 --principal apigateway.amazonaws.com --statement-idstatement-id-guid
--action lambda:InvokeFunction否则会导致在调用该方法时出现
500 Internal Server Error
响应。确保将${stageVariables.function}
替换为已分配给阶段变量的 Lambda 函数名称。 -
将 API 部署到可用阶段。
-
在 Stages (阶段) 导航窗格中,选择 beta 阶段。验证您最新的部署在 beta Stage Editor 中。复制 Invoke URL (调用 URL) 链接,将其粘贴到浏览器的地址栏,然后将
附加到该 URL。这将通过 API 的 LambdaSv1 子资源上的/lambdasv1
GET
方法调用底层 Lambda 函数。注意 您的
HelloWorld
Lambda 函数实施了以下代码。exports.handler = function(event, context, callback) { if (event.version) callback(null, 'Hello, World! (' + event.version + ')' ); else callback(null, "Hello, world! (v-unknown)"); };
此实施将产生以下响应。
"Hello, world! (v-unknown)"
通过阶段变量将特定于阶段的元数据传递到 Lambda 函数中
此过程介绍了如何使用阶段变量将特定于阶段的配置元数据传递到 Lambda 函数中。我们将使用 POST
方法和输入映射模板,使用先前声明的 version
阶段变量生成负载。
-
在资源窗格中,选择 /lambdasv1 子资源。在子资源上创建
POST
方法,将 Integration type (集成类型) 设置为 Lambda Function (Lambda 函数),然后在 Lambda Function (Lambda 函数) 中输入
。选择保存。${stageVariables.function}
提示 此步骤类似于我们用于创建
GET
方法的步骤。有关更多信息,请参阅 使用阶段变量通过 API 调用 Lambda 函数。 -
从 /Method Execution (方法执行) 窗格,选择 Integration Request (集成请求)。在 Integration Request(集成请求)窗格中,展开 Mapping Templates(映射模板),然后选择 Add mapping template(添加映射模板)来为
application/json
content-type 添加模板,如下所示。注意 在映射模板中,阶段变量必须在引号中引用(如
"$stageVariables.version"
或"${stageVariables.version}"
中所示)。在其他位置,必须不带引号引用(如${stageVariables.function}
中所示)。 -
将 API 部署到可用阶段。
-
在阶段导航窗格中,选择 beta 阶段。在 beta Stage Editor (beta 阶段编辑器) 中,验证当前阶段是否有最新部署。复制调用 URL 链接,将其粘贴到 REST API 客户端的 URL 输入字段中,将
附加到该 URL,然后向底层 Lambda 函数提交/lambdasv1
POST
请求。注意 您将收到以下响应。
"Hello, world! (v-beta)"