使用 Amazon CLI 设置具有私有集成的 API Gateway API - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Amazon CLI 设置具有私有集成的 API Gateway API

使用私有集成创建 API 之前,您必须已设置 VPC 资源,已创建 Network Load Balancer 并已使用 VPC 源作为目标进行配置。如果未满足要求,请按照为 API Gateway 私有集成设置 Network Load Balancer安装 VPC 资源,创建 Network Load Balancer,设置 VPC 资源作为网络负载均衡器的目标。

注意

Network Load Balancer 和 API 必须归同一个 Amazon 账户所有。

为了能够创建和管理 VpcLink,您还必须具有适当的权限。有关更多信息,请参阅授予创建 VPC 链接的权限

注意

您只需要具有在 API 中创建 VpcLink 的权限。您不需要具有使用 VpcLink 的权限。

创建 Network Load Balancer 之后,记录其 ARN。您需要它来为私有集成创建 VPC 链接。

使用 Amazon CLI 设置具有私有集成的 API
  1. 创建 VpcLink 定位到指定的 Network Load Balancer。

    aws apigateway create-vpc-link \ --name my-test-vpc-link \ --target-arns arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/net/my-vpclink-test-nlb/1234567890abcdef

    此命令的输出确认收到请求并显示正在创建的 VpcLinkPENDING 状态。

    { "status": "PENDING", "targetArns": [ "arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/net/my-vpclink-test-nlb/1234567890abcdef" ], "id": "gim7c3", "name": "my-test-vpc-link" }

    API Gateway 需要 2-4 分钟才能完成创建 VpcLink。操作成功完成后,statusAVAILABLE。您可以通过调用以下 CLI 命令验证这一点:

    aws apigateway get-vpc-link --vpc-link-id gim7c3

    如果操作失败,您将收到 FAILED 状态,以及包含错误消息的 statusMessage。例如,如果您尝试使用已经与 VPC 终端节点关联的 Network Load Balancer 创建 VpcLink,在 statusMessage 属性上将获得以下内容:

    "NLB is already associated with another VPC Endpoint Service"

    在成功创建 VpcLink 之后,您可以创建 API 并通过 VpcLink 将其与 VPC 资源集成。

    记录新创建 VpcLinkid 值 (之前输出中的 gim7c3)。设置私有集成时需要该值。

  2. 通过创建 API Gateway RestApi 资源设置 API:

    aws apigateway create-rest-api --name 'My VPC Link Test'

    请记录返回结果中 RestApiid 值。您需要该值才能在 API 上进一步执行操作。

    为了方便说明,我们将在根资源 (/) 上创建仅具有 GET 方法的 API,并将方法与 VpcLink 集成。

  3. 设置 GET / 方法。首先获取根资源 (/) 的标识符:

    aws apigateway get-resources --rest-api-id abcdef123

    在输出中,记录 id 路径的 / 值。在本例中,我们假设它为 skpp60rab7

    为 API 方法 GET / 设置方法请求:

    aws apigateway put-method \ --rest-api-id abcdef123 \ --resource-id skpp60rab7 \ --http-method GET \ --authorization-type "NONE"

    如果您不将代理集成用于 VpcLink,则还必须至少设置一个 200 状态代码的方法响应。我们在这里使用代理集成。

  4. 设置 HTTP_PROXY 类型的私有集成,并按以下所示调用 put-integration 命令:

    aws apigateway put-integration \ --rest-api-id abcdef123 \ --resource-id skpp60rab7 \ --uri 'http://my-vpclink-test-nlb-1234567890abcdef.us-east-2.amazonaws.com' \ --http-method GET \ --type HTTP_PROXY \ --integration-http-method GET \ --connection-type VPC_LINK \ --connection-id gim7c3

    对于私有集成,请将 connection-type 设置为 VPC_LINK,将 connection-id 设置为 VpcLink 的标识符或引用 VpcLink ID 的阶段变量。uri 参数不用于将请求路由到终端节点,而是用于设置 Host 标头和证书验证。

    该命令将返回以下输出:

    { "passthroughBehavior": "WHEN_NO_MATCH", "timeoutInMillis": 29000, "connectionId": "gim7c3", "uri": "http://my-vpclink-test-nlb-1234567890abcdef.us-east-2.amazonaws.com", "connectionType": "VPC_LINK", "httpMethod": "GET", "cacheNamespace": "skpp60rab7", "type": "HTTP_PROXY", "cacheKeyParameters": [] }

    使用阶段变量,在创建集成时设置 connectionId 属性:

    aws apigateway put-integration \ --rest-api-id abcdef123 \ --resource-id skpp60rab7 \ --uri 'http://my-vpclink-test-nlb-1234567890abcdef.us-east-2.amazonaws.com' \ --http-method GET \ --type HTTP_PROXY \ --integration-http-method GET \ --connection-type VPC_LINK \ --connection-id "\${stageVariables.vpcLinkId}"

    请确保使用双引号括起阶段变量表达式 (${stageVariables.vpcLinkId}) 并转义 $ 字符。

    或者,您可以更新集成以使用阶段变量重置 connectionId 值:

    aws apigateway update-integration \ --rest-api-id abcdef123 \ --resource-id skpp60rab7 \ --http-method GET \ --patch-operations '[{"op":"replace","path":"/connectionId","value":"${stageVariables.vpcLinkId}"}]'

    请确保使用字符串化的 JSON 列表作为 patch-operations 参数值。

    您可以使用阶段变量,通过重置 VpcLinks 阶段变量值,将您的 API 与其他 VPC 或网络负载均衡器集成。

    由于我们使用了私有代理集成,API 现已准备好,可用于部署和测试运行。使用非代理集成,您还必须设置方法响应和集成响应,就像您在使用 HTTP 自定义集成设置 API 时一样。

  5. 测试 API 需要部署 API。如果您使用了阶段变量作为 VpcLink ID 的占位符,则这是必需的。要使用阶段变量部署 API,请按以下所示调用 create-deployment 命令:

    aws apigateway create-deployment \ --rest-api-id abcdef123 \ --stage-name test \ --variables vpcLinkId=gim7c3

    要使用不同 VpcLink ID 更新阶段变量 (例如 asf9d7),请调用 update-stage 命令:

    aws apigateway update-stage \ --rest-api-id abcdef123 \ --stage-name test \ --patch-operations op=replace,path='/variables/vpcLinkId',value='asf9d7'

    使用以下命令来调用 API:

    curl -X GET https://abcdef123.execute-api.us-east-2.amazonaws.com/test

    此外,您可以在 Web 浏览器中键入 API 的调用 URL 来查看结果。

    当您使用 VpcLink ID 文本硬编码 connection-id 时,您还可以调用 test-invoke-method,在部署 API 之前进行测试。