【发布时间】:2020-12-31 16:42:52
【问题描述】:
我正在尝试了解 AWS 中的一般资源策略和权限。 最初的想法很简单,API 网关拒绝访问同一 VPC 中除其他资源之外的所有内容,但最终却是一场噩梦。
我想要什么:我的 API 只允许对同一 VPC 上的资源进行流量/调用。
所以我创建了 2 个子网和一个开放的安全组(所有入站和出站流量仅用于测试目的)
我创建了一个集成到 Lambda 函数和另一个 lambda 函数的 API 网关,并将它们部署到该 VPC。
API 网关有一个资源 /hi 并且只允许 GET。 当您点击该路径时,它会代理 Lambda,后者会返回一条简单消息:嗨。
另一个 lambda(位于同一 VPC 上)调用 API 并返回错误或响应。
到目前为止,一切正常。 lambda 函数命中 API 网关,该网关会攻击 lambda 并返回 Hi。
但是,正如我所说,我想使用权限。所以我决定将对 API Gateway 的调用锁定到两者所在的 VPC。
所以我将此资源策略添加到 API Gateway:
{
"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",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*"
}
]
}
然后我去了 lambda(不是服务的一部分,如果不是调用 API 网关的那个)并添加托管策略
- AWSLambdaVPCAccessExecutionRole
- 还有一个内联策略,允许在资源 arn:aws:execute-api:us-east-1:account-id:api-id///* 上调用 execute-api:Invoke李>
当我再次运行 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 Gateway 中删除了资源策略,它会再次起作用...只要我添加它,它就会检索到相同的错误。
有人知道为什么会这样吗? 我快疯了。我将不胜感激。
版本:尝试 IAM 角色和资源策略
我也尝试使用角色。 为此,我在 API 中设置了以下资源策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-id:role/my-role-for-API-Gateway"
},
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*"
}
]
}
然后,我将该角色附加到我的 lambda 函数(应该能够调用 API 的函数)。 重要提示:该 lambda 不是服务的一部分。它是一个单独的 Lambda,应该能够调用 API Gateway,它将请求代理到作为服务一部分的 lambda。
我为该角色附加了以下政策。
- AWSLambdaVPCAccessExecutionRole(因为我也在同一个 VPC 中尝试过)
- AmazonAPIGatewayInvokeFullAccess(打开权限以确保我没有遗漏任何内容)
- 允许通过资源 ARN 调用 API 的内联策略:arn:aws:execute-api:us-east-1:account-id:api-id///*
我什至尝试将 AdministratorAccess 授予该角色,只是为了耗尽可能性。
我通过 API Gateway 控制台进行测试,我收到了正确的控制台。 当我通过 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 具有的特定角色的访问?
【问题讨论】:
-
你能说清楚吗?您正在使用私有 API?您的第二个 lambda 究竟如何从 VPC 调用 api?通过 NAT 网关?
-
非常感谢,@Marcin 我没有使用私有 API,只是一个区域性的。 lambda 只是获取 API 网关提供的 dns 端点,我将不胜感激。我完全迷路了。
标签: amazon-web-services aws-lambda aws-api-gateway amazon-iam