使用 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
-
创建
VpcLink定位到指定的 Network Load Balancer。在此讨论中,我们假设 Network Load Balancer 的 ARN 为
arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/net/my-vpclink-test-nlb/1f8df693cd094a72。aws apigateway create-vpc-link \ --name my-test-vpc-link \ --target-arns arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/net/my-vpclink-test-nlb/1f8df693cd094a72之前的命令立即返回以下响应,确认收到请求,并为所创建的
PENDING显示VpcLink状态。{ "status": "PENDING", "targetArns": [ "arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/net/my-vpclink-test-nlb/1f8df693cd094a72" ], "id": "gim7c3", "name": "my-test-vpc-link" }API Gateway 需要 2-4 分钟才能完成创建
VpcLink。操作成功完成后,status为AVAILABLE。您可以通过调用以下 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 资源集成。记录新创建
id的VpcLink值 (之前输出中的gim7c3)。设置私有集成时需要该值。 -
通过创建 API Gateway
RestApi资源设置 API:aws apigateway create-rest-api --name 'My VPC Link Test'我们已删除
endpoint-url和region的输入参数,以使用在 Amazon 配置中指定的默认区域。请记录返回结果中
RestApi的id值。在本例中,我们假设它为abcdef123。您需要此值在 API 上进一步执行操作,包括设置方法和集成。为了方便说明,我们将在根资源 (
GET) 上创建仅具有/方法的 API,并将方法与VpcLink集成。 -
设置
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"要使用 IAM 权限、Lambda 授权方或 Amazon Cognito 用户池对调用方进行身份验证,请将
authorization-type分别设置为AWS_IAM、CUSTOM或COGNITO_USER_POOLS。如果您不将代理集成用于
VpcLink,则还必须至少设置一个200状态代码的方法响应。我们在这里使用代理集成。 -
设置
HTTP_PROXY类型的私有集成,并按以下所示调用put-integration命令:aws apigateway put-integration \ --rest-api-id abcdef123 \ --resource-id skpp60rab7 \ --uri 'http://myApi.example.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的标识符或引用VpcLinkID 的阶段变量。uri参数不用于将请求路由到终端节点,而是用于设置Host标头和证书验证。如果成功,该命令会返回以下输出:
{ "passthroughBehavior": "WHEN_NO_MATCH", "timeoutInMillis": 29000, "connectionId": "gim7c3", "uri": "http://myApi.example.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://myApi.example.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参数值。使用阶段变量设置
connectionId值的优点在于,可以通过重置阶段变量值,将相同 API 集成到不同VpcLink。这在将 API 切换到不同 VPC 链接以迁移到不同 Network Load Balancer 或者不同 VPC 时非常有用。由于我们使用了私有代理集成,API 现已准备好,可用于部署和测试运行。使用非代理集成,您还必须设置方法响应和集成响应,就像您在使用 HTTP 自定义集成设置 API 时一样。
-
测试 API 需要部署 API。如果您使用了阶段变量作为
VpcLinkID 的占位符,则这是必需的。要使用阶段变量部署 API,请按以下所示调用create-deployment命令:aws apigateway create-deployment \ --rest-api-id abcdef123 \ --stage-name test \ --variables vpcLinkId=gim7c3要使用不同
VpcLinkID 更新阶段变量 (例如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 命令调用它:
curl -X GET https://abcdef123.execute-api.us-east-1.amazonaws.com/test此外,您可以在 Web 浏览器中键入 API 的调用 URL 来查看结果。
当您使用
connection-idID 文本硬编码VpcLink时,您还可以调用test-invoke-method,在部署 API 之前进行测试。