因此,您决定使用CDK的Python风味来构建API网关基础架构。伟大的! Python CDK是我最喜欢管理基础架构作为AWS中的代码的工具。任何了解Python并在AWS控制台中创造资源的人都可以立即使用Python CDK快速起来。但是现在您已经遇到了一个难以置信的调试问题:您已经在另一个CDK堆栈中指定了现有的API网关,现在正在尝试使用aws_apigateway.LambdaRestApi.from_rest_api_attributes
来获取现有的API网关,并使用add_resource和add_method
添加了新的路径。
一切都很好,您的新堆栈部署,然后尝试调用新的API Gateway-> lambda端点。你得到
Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a Date' header.
哦,不。该通用错误可能意味着任何事情。因此,您可以搜索一段时间,试图弄清楚可能出了什么问题。您查看AWS控制台中的API网关。您意识到,即使资源路径被添加到您的网关中,它们也没有被部署到Stage
!
Lambdarestapi类应该自动这样做,对吗?是的,它会,但不幸的是,如果您使用from_rest_api_attributes
函数来获取现有网关。这是一个已知问题:https://github.com/aws/aws-cdk/issues/12417
我鼓励您在上面的GitHub问题上投票,以便CDK团队优先考虑它,但这是Python CDK的解决方法:
import uuid
from aws_cdk import aws_apigateway
api = aws_apigateway.LambdaRestApi.from_rest_api_attributes(self, [gateway id], rest_api_id=[api id], root_resource_id=[gateway root resource id])
r = api.root.add_resource("hello-world")
r.add_method("ANY", aws_apigateway.LambdaIntegration([your previously specified Lambda CDK object])
deployment = aws_apigateway.Deployment(self, f"deployment-{uuid.uuid4().hex}', api=api)
stage = aws_apigateway.Stage(self, [stage id (some string)], deployment=deployment, stage_name = [some string])
api.deployment_stage = stage
现在您的新端点可以正确部署。如您所见,您需要创建许多参数(我将它们放在方括号中),但是要注意的主要内容是我手动将部署和舞台添加到API网关,并添加每次部署堆栈时都会更改部署ID。这迫使部署被推出,没有它的解决方案将无法正常工作。
如果您需要在不同的堆栈中添加多个资源/方法(我自己当前的用例!),我发现的最好方法就是将部署放入单独的堆栈中并在添加/更新任何内容后将其构建您的资源堆栈。这有点毛,但可以防止您不必添加多个阶段名称。
如果您让您的头撞到墙上一段时间,那么您并不孤单。我希望CDK团队能尽快解决此问题,但与此同时,您现在有了解决方案。