AWS私有API网关-不是有效的密钥=值对(缺少等号)



我有一个遗留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}"
我花了很多时间才弄明白这件事。真不明白为什么这事这么难。

最新更新