我在 API Gateway(与 Lambda 代理集成)中创建了一个私有 REST API,它需要可从 VPC 访问。我已经在 VPC 中为 API Gateway 设置了 VPC Endpoint。正如预期的那样,可以从 VPC 内访问 API。
VPC 端点(实际上是整个 VPC 环境)是通过 CloudFormation 创建的。
API 需要使用Authorization
标头,这不是我可以更改的。该标题的内容是我们公司特有的,不是标准的。问题是,当我Authorization
向请求添加标头时,API Gateway 拒绝它并出现以下错误(来自 CloudWatch 中的 API Gateway 日志):
IncompleteSignatureException
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.
Authorization=[the header content here]
如果我删除了Authorization
标头,请求就会被接受,并且我会从我的 lambda 中得到预期的响应。我正在调用的方法将 Auth 设置为 NONE。
奇怪的是,如果我删除 VPC 端点并通过控制台手动创建它,它会正常工作 -Authorization
标头被传递给我的 lambda,而不是 API Gateway 检查和拒绝它。
我已经拆除了端点,并使用 CloudFormation 手动重新创建了多次,结果是一致的。但我已经将它们相互比较,它们看起来完全一样:相同的设置、相同的子网、相同的安全组、相同的策略。由于我看不出它们之间没有区别,所以我对它为什么不适用于 CloudFormation 版本有点茫然。
我能够找到的唯一区别是每个版本的 aws 标头(Authorization
删除了标头,否则它不会像使用 CF 端点记录标头那样)。对于 CF 端点,标头包括x-amzn-vpce-config=0
和x-amzn-vpce-policy-url=MQ==
. 使用我得到的手动端点x-amzn-vpce-config=1
,并且不包括 policy-url 标头。
我还尝试将 API 更改为设置和删除 VPC 端点(可以在设置部分的 API 上设置),然后重新部署它,但在任何一种情况下它都没有效果 - 请求继续工作/被拒绝和以前一样。
有没有人有任何想法?我也在AWS 论坛上发布了这个,但以防万一这里的任何人以前遇到过这个......
如果有任何兴趣,可以像这样创建端点([]
= 已编辑):
ApiGatewayVPCEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
PolicyDocument:
Statement:
- Action: '*'
Effect: Allow
Resource: '*'
Principal: '*'
ServiceName: !Sub com.amazonaws.${AWS::Region}.execute-api
SecurityGroupIds:
- !Ref [my sec group]
SubnetIds:
- !Ref [subnet a]
- !Ref [subnet b]
- !Ref [subnet c]
VpcEndpointType: Interface
VpcId: !Ref [my vpc]