使用 Amazon API Gateway 阶段变量 - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon API Gateway 阶段变量

您可以使用 API Gateway 阶段变量访问不同 API 部署阶段的 HTTP 和 Lambda 后端。您还可以使用阶段变量将特定于阶段的配置元数据作为查询参数传递给 HTTP 后端,同时作为在输入映射模板中生成的负载传递到 Lambda 函数中。

先决条件

您必须创建两个阶段,并将 url 阶段变量设置为两个不同的 HTTP 端点:一个为分配到两个不同的 Lambda 函数的 function 阶段变量,一个为包含特定于阶段的元数据的 stageName 阶段变量。

使用阶段变量通过 API 访问 HTTP 终端节点

  1. 阶段导航窗格中,选择 beta 阶段。在阶段详细信息下,选择复制图标以复制 API 的调用 URL,然后在 Web 浏览器中输入 API 的调用 URL。这将启动 API 根资源上的 beta 阶段 GET 请求。

    注意

    Invoke URL 链接指向 API 在其 beta 阶段的根资源。在 Web 浏览器中输入 URL 会对根资源调用 beta 阶段 GET 方法。如果方法是在子资源而非根资源本身上定义的,则在 Web 浏览器中输入 URL 将返回 {"message":"Missing Authentication Token"} 错误响应。在这种情况下,您必须将特定子资源的名称附加到 Invoke URL (调用 URL) 链接。

  2. beta 阶段 GET 请求的响应如下所示。您还可以使用浏览器导航到 http://httpbin.org/get,以验证结果。此值已分配到 beta 阶段中的 url 变量。这两个响应完全相同。

  3. 阶段导航窗格中,选择 prod 阶段。在阶段详细信息下,选择复制图标以复制 API 的调用 URL,然后在 Web 浏览器中输入 API 的调用 URL。这将启动 API 根资源上的 prod 阶段 GET 请求。

  4. prod 阶段 GET 请求的响应如下所示。你可以使用浏览器导航到 http://petstore-demo-endpoint.execute-api.com/petstore/pets 来验证结果。此值已分配到 prod 阶段中的 url 变量。这两个响应完全相同。

在查询参数表达式中通过阶段变量将特定于阶段的元数据传递给 HTTP 后端

此过程介绍如何在查询参数表达式中使用阶段变量值将特定于阶段的元数据传递到 HTTP 后端。我们将使用已在 stageName 中声明的 使用 Amazon API Gateway 控制台设置阶段变量 阶段变量。

  1. 资源导航窗格中,选择 GET 方法。

    要向方法的 URL 添加查询字符串参数,请选择方法请求选项卡,然后在方法请求设置部分中选择编辑

  2. 选择 URL 查询字符串参数并执行以下操作:

    1. 选择 Add query string (添加查询字符串)

    2. 名称中,输入 stageName

    3. 保持必填缓存为已关闭状态。

  3. 选择保存

  4. 选择集成请求选项卡,然后在集成请求设置部分中,选择编辑

  5. 对于端点 URL,将 ?stageName=${stageVariables.stageName} 附加到先前定义的 URL 值,因此整个端点 URLhttp://${stageVariables.url}?stageName=${stageVariables.stageName}

  6. 选择部署 API,然后选择 beta 阶段。

  7. 在主导航窗格中,选择阶段。在阶段导航窗格中,选择 beta 阶段。在阶段详细信息下,选择复制图标以复制 API 的调用 URL,然后在 Web 浏览器中输入 API 的调用 URL。

    注意

    我们之所以在这里使用测试阶段,是因为 HTTP 终端节点(由 url 变量“http://httpbin.org/get”指定)接受查询参数表达式,并在响应中将其作为 args 对象返回。

  8. 您将收到以下响应。注意,分配给 beta 阶段变量的 stageName 作为 stageName 参数传递到后端。

使用阶段变量通过 API 调用 Lambda 函数

此过程介绍了如何使用阶段变量调用 Lambda 函数作为 API 后端。我们将使用先前声明的 function 阶段变量。有关更多信息,请参阅使用 Amazon API Gateway 控制台设置阶段变量

  1. 使用默认 Node.js 运行时系统创建名为 HelloWorld 的 Lambda 函数。代码必须包含以下内容:

    export const handler = function(event, context, callback) { if (event.stageName) callback(null, 'Hello, World! I\'m calling from the ' + event.stageName + ' stage.'); else callback(null, 'Hello, World! I\'m not sure where I\'m calling from...'); };

    有关如何创建 Lambda 函数的更多信息,请参阅 REST API 控制台入门

  2. 资源窗格中,选择创建资源,然后执行以下操作:

    1. 对于资源路径,选择 /

    2. 对于资源名称,输入 lambdav1

    3. 选择创建资源

  3. 选择 /lambdav1 资源,然后选择创建方法。

    然后执行以下操作:

    1. 对于方法类型,选择 GET

    2. 对于集成类型,选择 Lambda 函数

    3. 保持 Lambda 代理集成处于关闭状态。

    4. 对于 Lambda function(Lambda 函数),输入 ${stageVariables.function}

      提示

      当提示使用添加权限命令时,复制 Amazon CLI 命令。对将分配给 function 阶段变量的每个 Lambda 函数运行此命令。例如,如果$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/lambdav1 --principal apigateway.amazonaws.com --statement-id statement-id-guid --action lambda:InvokeFunction

      否则会导致在调用该方法时出现 500 Internal Server Error 响应。将 ${stageVariables.function} 替换为已分配给阶段变量的 Lambda 函数名称。

    5. 选择创建方法

  4. 将 API 部署到 prodbeta 阶段。

  5. 在主导航窗格中,选择阶段。在阶段导航窗格中,选择 beta 阶段。在阶段详细信息下,选择复制图标以复制 API 的调用 URL,然后在 Web 浏览器中输入 API 的调用 URL。在按 Enter 之前,将 /lambdav1 附加到 URL。

    您将收到以下响应。

    "Hello, World! I'm not sure where I'm calling from..."

通过阶段变量将特定于阶段的元数据传递到 Lambda 函数中

此过程介绍了如何使用阶段变量将特定于阶段的配置元数据传递到 Lambda 函数中。您创建 POST 方法和输入映射模板,以使用先前声明的 stageName 阶段变量生成负载。

  1. 选择 /lambdav1 资源,然后选择创建方法。

    然后执行以下操作:

    1. 对于方法类型,选择 POST

    2. 对于集成类型,选择 Lambda 函数

    3. 保持 Lambda 代理集成处于关闭状态。

    4. 对于 Lambda function(Lambda 函数),输入 ${stageVariables.function}

    5. 当提示使用添加权限命令时,复制 Amazon CLI 命令。对将分配给 function 阶段变量的每个 Lambda 函数运行此命令。

    6. 选择创建方法

  2. 选择集成请求选项卡,然后在集成请求设置部分中,选择编辑

  3. 选择映射模板,然后选择添加映射模板

  4. 对于内容类型,输入 application/json

  5. 对于模板正文,输入以下模板:

    #set($inputRoot = $input.path('$')) { "stageName" : "$stageVariables.stageName" }
    注意

    在映射模板中,阶段变量必须在引号中引用(如 "$stageVariables.stageName""${stageVariables.stageName}" 中所示)。在其他位置,必须不带引号引用(如 ${stageVariables.function} 中所示)。

  6. 选择保存

  7. 将 API 部署到 betaprod 阶段。

  8. 要使用 REST API 客户端传递特定于阶段的元数据,请执行以下操作:

    1. 阶段导航窗格中,选择 beta 阶段。在阶段详细信息下,选择复制图标以复制 API 的调用 URL,然后在 REST API 客户端的输入字段中输入 API 的调用 URL。在提交请求之前附加 /lambdav1

      您将收到以下响应。

      "Hello, World! I'm calling from the beta stage."
    2. 阶段导航窗格中,选择 prod。在阶段详细信息下,选择复制图标以复制 API 的调用 URL,然后在 REST API 客户端的输入字段中输入 API 的调用 URL。在提交请求之前附加 /lambdav1

      您将收到以下响应。

      "Hello, World! I'm calling from the prod stage."
  9. 要使用测试特征传递特定于阶段的元数据,请执行以下操作:

    1. 资源导航窗格中,选择测试选项卡。您可能需要选择右箭头按钮以显示该选项卡。

    2. 对于 function,请输入 HelloWorld

    3. 对于 stageName,请输入 beta

    4. 选择测试。您无需将正文添加到您的 POST 请求。

      您将收到以下响应。

      "Hello, World! I'm calling from the beta stage."
    5. 您可以重复前面的步骤来测试 Prod 阶段。对于 stageName,请输入 Prod

      您将收到以下响应。

      "Hello, World! I'm calling from the prod stage."