问题描述
我正在尝试了解AWS中的资源策略和权限。 API网关最初拒绝任何人访问同一VPC中的其他资源,但从一开始就很容易。
我想要的是:我的API仅允许对同一VPC上的资源进行流量/调用。
所以我创建了2个子网和一个开放的安全组(所有入站和出站流量仅用于测试目的)
我创建了一个API网关,其中集成了一个Lambda函数和另一个lambda函数,并将它们部署到该VPC。
API网关具有一个资源/ hi,仅允许GET。 当您点击该路径时,它会代理到Lambda并返回一条简单消息:Hi。
另一个lambda(位于同一VPC上)调用该API,并返回错误或响应。
直到现在,一切正常。 lambda函数会访问API网关,该网关会欺骗lambda并返回Hi。
但是,正如我所说,我想在获得许可的情况下进行比赛。因此,我决定将对API网关的调用锁定到两者都驻留的VPC。
因此,我将此资源策略添加到了API网关:
{
"Version": "2012-10-17","Statement": [
{
"Effect": "Deny","Principal": "*","Action": "execute-api:Invoke","Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*","Condition": {
"StringNotEquals": {
"aws:sourceVpc": "vpc-id"
}
}
},{
"Effect": "Allow","Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*"
}
]
}
然后我进入了lambda(不是该服务的一部分,如果不是调用API网关的那个),并添加了托管策略
- AWSLambdaVPCAccessExecutionRole
- 还有一个内联策略,允许execute-api:调用资源arn:aws:execute-api:us-east-1:account-id:api-id / / / *
当我再次运行lambda函数(以前同时与我的API网关和https://jsonplaceholder.typicode.com/之类的虚拟api一起使用)时,出现以下错误:
INFO json {
Message: 'User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:account-id:api-id/dev/GET/hi with an explicit deny'
}
如果我在API网关中删除了资源策略,它将再次起作用...添加后,它会检索到相同的错误。
有人知道为什么会这样吗? 我快疯了。我将不胜感激。
版本:尝试使用IAM角色和资源策略
我也尝试使用角色。 为此,我在API中设置了以下资源策略:
{
"Version": "2012-10-17","Statement": [
{
"Effect": "Allow","Principal": {
"AWS": "arn:aws:iam::account-id:role/my-role-for-API-Gateway"
},"Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*"
}
]
}
然后,我将该角色附加到我的lambda函数(应该能够调用API的函数)上。 重要:该lambda不属于服务范围。这是一个单独的Lambda,应该能够调用API网关,该API网关会将请求代理到作为服务一部分的Lambda。
我对该职位附加了以下政策。
- AWSLambdaVPCAccessExecutionRole(因为我也在同一VPC中尝试过)
- AmazonAPIGatewayInvokeFullAccess(开放权限只是为了确保我没有丢失任何内容)
- 允许资源ARN调用API的内联策略:arn:aws:execute-api:us-east-1:account-id:api-id / / / *
我什至尝试为AdministratorAccess赋予该角色以耗尽所有可能性。
我通过API网关控制台进行测试,并且收到了正确的控制台。 通过Lambda控制台进行测试时,出现以下错误:
INFO json {
Message: 'User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:account-id:api-id/dev/GET/hi'
}
因此,此块的问题是:lambda如何调用API网关,从而限制对lambda具有的特定角色的访问?
解决方法
部分问题是aws:SourceVpc
条件只能用于私有API 。来自docs:
aws:SourceVpc-此密钥只能用于专用API 。
由于您使用的是区域性 API,因此您的StringNotEquals
无法正常工作,并且您会得到明确拒绝。
如果要使用aws:SourceVpc
,则必须将api修改为私有API。但是,如果仅对基于资源的策略有学习经验,那么最简单的学习方法就是使用存储桶策略。