我有一个遗留api,我们正在将api迁移到AWS。api将运行在带有ALB的ECS容器上。
我们希望使用api网关来利用一些特性。因此,我们使用{proxy+}方法资源和VPC链接代理集成(使用带有NLB指向我们的ALB的VPC端点)创建api网关
使用端点类型为区域的api网关工作。但是我们需要同时拥有公共和私有api网关。
所以我们的两个场景是:
公共场景:网络→我们的公共API网关->VPC LINK Proxy集成(Endpoint + NLB) ->铝青铜→ECS容器
私人场景:客户VPC ->客户VPC端点->我们的私有API网关->VPC LINK Proxy集成(Endpoint + NLB) ->铝青铜→ECS容器
问题是当我们使用授权头时,我们得到以下响应:
'hsdasneudos_dummy_token' not a valid key=value pair (missing equal-sign) in Authorization header: 'Bearer hsdasneudos_dummy_token'.
Http Status is 403 Forbidden
响应头->x-amzn-ErrorType: IncompleteSignatureException
请求从未到达ECS容器。此请求可以在公共场景中工作,也可以使用test功能直接在私有api网关aws控制台中工作。
我认为问题是客户VPC端点使用授权头在私有api网关中进行身份验证,如果我在请求上使用此授权头将会混乱。但是这是一个遗留的api,我们需要使用授权头。
在私有API网关中,我们有允许客户VPC端点的资源策略,并且客户VPC端点也有调用API网关的策略。所有没有授权头的请求都可以正常工作。
我该如何解决这个问题?问题是我怀疑(客户VPC端点使用授权头进行身份验证)?如果是,客户VPC端点在api网关中没有授权头进行身份验证还有其他方法吗?
谢谢你的帮助。
我遇到了同样的问题。正如FDS在其他评论中提到的,将标题从Authorization
更改为AppAuthorization
之类的东西确实有效,但显然不是一个好的解决方案。
对于使用CloudFormation的每个人来说,这是一个更好的解决方案:
简短回答
将策略定义为JSON字符串,如下所示:
PolicyDocument: "{n "Statement": [n {n "Action": "*", n "Effect": "Allow", n "Principal": "*", n "Resource": "*"n }n ]n}"
长回答
在与AWS支持联系后,我发现资源策略是真正的问题。似乎对它的格式非常挑剔。
最初我在YAML CloudFormation模板中创建了它,如下所示:
PolicyDocument:
Statement:
- Action: "*"
Effect: "Allow"
Principal: "*"
Resource: "*"
AWS::EC2::VPCEndpoint
的文档说这是可能的:"对于YAML中的CloudFormation模板,您可以以JSON或YAML格式提供策略。在调用API创建或修改VPC端点之前,AWS CloudFormation将YAML策略转换为JSON格式。">
上面提到的转换产生了这个JSON策略,它不起作用并导致错误:
"{"Version":"2012-10-17","Statement":[{"Action":"*","Resource":"*","Effect":"Allow","Principal":"*"}]}"
即使在CloudFormation模板中以JSON字符串的形式提供资源策略也不能工作,如果字符串没有正确格式化。
最后我用:
重置策略aws ec2 modify-vpc-endpoint --vpc-endpoint-id vpce-01234567890abcdefg --reset-policy
然后通过:
读取策略aws ec2 describe-vpc-endpoints
然后我将EXACT策略字符串复制到我的CloudFormation模板中,它工作了!现在看起来是这样的:
PolicyDocument: "{n "Statement": [n {n "Action": "*", n "Effect": "Allow", n "Principal": "*", n "Resource": "*"n }n ]n}"
我花了很多时间才弄明白这件事。真不明白为什么这事这么难。