Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Amazon API Gateway 阶段变量

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

先决条件

您必须创建两个阶段,并将 url 变量设置为两个不同的 HTTP 终端节点:一个为分配到两个不同的 Lambda 函数的 function 阶段变量,一个为包含特定于阶段的元数据的 version 阶段变量。按照使用 Amazon API Gateway 控制台设置阶段变量中的说明进行操作。

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

  1. 阶段导航窗格中,选择 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) 链接。

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

  3. 阶段导航窗格中,选择 prod 阶段。从 prod Stage Editor (prod 阶段编辑器),选择 Invoke URL (调用 URL) 链接。这将启动 API 根资源上的 prod 阶段 GET 请求。

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

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

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

  1. 资源导航窗格中,选择 GET 方法。要将查询字符串参数添加到方法的 URL 中,请在 Method Request (方法请求) 中选择 Method Execution (方法执行)。键入 version 作为参数名称。

  2. Method Execution (方法执行) 中,选择 Integration Request (集成请求)。编辑 Endpoint URL (终端节点 URL) 值,以将 ?version=${stageVariables.version} 附加到之前定义的 URL 值,该值在这种情况下也用 url 阶段变量表示。选择 Deploy API (部署 API),以部署这些更改。

  3. Stages (阶段) 导航窗格中,选择 beta 阶段。在 beta Stage Editor (beta 阶段编辑器) 中,验证当前阶段是否在最新部署中,然后选择 Invoke URL (调用 URL) 链接。

    注意

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

  4. 响应如下所示。注意,分配给 v-beta 阶段变量的 version 作为 version 参数传递到后端。

    
              使用 beta 阶段具有 url 阶段变量的 HTTP 终端节点的代理从 API 的 GET 方法获取响应

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

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

  1. 资源窗格中,在根目录下创建 /lambdasv1 子资源,然后在该子资源上创建 GET 方法。将 Integration type (集成类型) 设置为 Lambda Function,在 Lambda Function 中,键入 ${stageVariables.function}。选择 Save (保存)

    
              按照 function 阶段变量指定的方式,创建与 Lambda 函数集成的 GET 方法。

    提示

    在提示 Add Permision to Lambda Function (将权限添加到 Lambda 函数) 时,在选择 OK (确定) 之前记录 AWS CLI 命令。您必须在每个 Lambda 函数(已分配或即将分配给每个新建 API 方法的 function 阶段变量)上运行命令。例如,如果 $stageVariables.function 值为 HelloWorld,而您尚未为此函数添加权限,则必须运行以下 AWS 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-id statement-id-guid --action lambda:InvokeFunction

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

    
                运行 AWS CLI 命令,以便为要由您刚创建的方法调用的 Lambda 函数添加权限。
  2. 将 API 部署到可用阶段。

  3. Stages (阶段) 导航窗格中,选择 beta 阶段。验证您最新的部署在 beta Stage Editor 中。复制 Invoke URL (调用 URL) 链接,将其粘贴到浏览器的地址栏,然后将 /lambdasv1 附加到该 URL。这将通过 API 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 阶段变量生成负载。

  1. 资源窗格中,选择 /lambdasv1 子资源。在子资源上创建 POST 方法,将 Integration type (集成类型) 设置为 Lambda Function,然后在 Lambda Function 中键入 ${stageVariables.function}。选择 Save (保存)

    提示

    此步骤类似于我们用于创建 GET 方法的步骤。有关更多信息,请参阅 使用阶段变量通过 API 调用 Lambda 函数

  2. /Method Execution (方法执行) 窗格,选择 Integration Request (集成请求)。在 Integration Request (集成请求) 窗格中,展开 Mapping Templates (映射模板),然后选择 Add mapping template (添加映射模板) 来为 application/json content-type 添加模板,如下所示。

    
              生成 POST 方法负载,其中包含以 version 阶段变量值表示的特定于阶段的配置元数据,将其作为后端 Lambda 函数的输入。

    注意

    在映射模板中,必须使用引号引用阶段变量 (例如 "$stageVariables.version""${stageVariables.version}"),而在其他位置则不得使用引号进行引用 (例如 ${stageVariables.function})。

  3. 将 API 部署到可用阶段。

  4. 阶段导航窗格中,选择 beta 阶段。在 beta Stage Editor (beta 阶段编辑器) 中,验证当前阶段是否有最新部署。复制 Invoke URL (调用 URL) 链接,将其粘贴到 REST API 客户端的 URL 输入字段中,将 /lambdasv1 附加到该 URL,然后向底层 Lambda 函数提交 POST 请求。

    注意

    您将收到以下响应。

    "Hello, world! (v-beta)"