【发布时间】:2020-09-22 13:37:42
【问题描述】:
我想使用 AWS CDK 定义 API 网关和 APIG 将代理到的 lambda。
OpenAPI 规范支持对 Swagger 规范的 x-amazon-apigateway-integration 自定义扩展(详细信息 here),为此需要 lambda 的调用 URL。如果 lambda 定义在与 API 相同的堆栈中,我看不到如何在 OpenAPI 规范中提供它。我能想到的最好的方法是定义一个包含 lambda 的堆栈,然后从中获取输出并运行 sed 在 OpenAPI 规范中进行查找和替换以插入 uri,然后创建第二个堆栈使用此修改后的 OpenAPI 规范。
例子:
/items:
post:
x-amazon-apigateway-integration:
uri: "arn:aws:apigateway:eu-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:eu-west-2:123456789012:function:MyStack-SingletonLambda4677ac3018fa48679f6-B1OYQ50UIVWJ/invocations"
passthroughBehavior: "when_no_match"
httpMethod: "POST"
type: "aws_proxy"
第一季度。这似乎是一个先有鸡还是先有蛋的问题,以上是唯一的方法吗?
我尝试使用SpecRestApi CDK 构造的defaultIntegration 属性。文档指出:
一个集成,用作在此创建的所有方法的默认值 API,除非指定了集成。
这似乎应该能够使用 CDK 规范中定义的 lambda 定义默认集成,因此所有方法都使用此集成,而无需提前知道 lambda 的 uri。
因此我尝试了这个:
SingletonFunction myLambda = ...
SpecRestApi openapiRestApi = SpecRestApi.Builder.create(this, "MyApi")
.restApiName("MyApi")
.apiDefinition(ApiDefinition.fromAsset("openapi.yaml"))
.defaultIntegration(LambdaIntegration.Builder.create(myLambda)
.proxy(false)
.build())
.deploy(true)
.build();
openapi.yaml 中定义的 OpenAPI 规范不包括 x-amazon-apigateway-integration 节;它只是在标准 OpenApi 3 规范中定义了一个 GET 方法。
但是,当我尝试部署它时,我收到一个错误:
No integration defined for method (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException; Request ID: 56113150-1460-4ed2-93b9-a12618864582)
这似乎是一个错误,所以我提交了一个here。
第二季度。如何使用 CDK 定义 API 网关和 Lambda 并通过 OpenAPI 规范将两者连接在一起?
【问题讨论】:
标签: amazon-web-services aws-lambda swagger aws-api-gateway openapi