同一VPC上的Lambda和API网关导致用户:匿名无权执行:execute-api:在资源上调用

问题描述

我正在尝试了解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。但是,如果仅对基于资源的策略有学习经验,那么最简单的学习方法就是使用存储桶策略

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...