允许 Lambda 的 S3 策略

Posted

技术标签:

【中文标题】允许 Lambda 的 S3 策略【英文标题】:S3 Policy to Allow Lambda 【发布时间】:2017-12-30 03:38:37 【问题描述】:

我在使用 AWS 策略生成器创建的 S3 存储桶上具有以下策略,以允许以特定角色运行的 lambda 访问存储桶中的文件。但是,当我执行 Lambda 时,我得到 403 权限被拒绝:

"errorMessage": "Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: <requestId>)",
  "errorType": "com.amazonaws.services.s3.model.AmazonS3Exception",

关于 S3 存储桶的政策:


"Version": "2012-10-17",
"Id": "Policy<number>",
"Statement": [
    
        "Sid": "Stmt<number>",
        "Effect": "Allow",
        "Principal": 
            "AWS": "arn:aws:iam::<account>:role/<roleName>"
        ,
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::<bucketName>/*"
    
]

政策有什么问题? Lamba 正在使用策略中配置的角色运行。

【问题讨论】:

我将首先修改此策略以将所有权限授予所有 .. 基本上删除 Principal 和 bucketname.. 这将告诉您问题是在您的 s3 策略中还是与 lambda 相关。 为什么不将 S3 存储桶权限添加到分配给 Lambda 函数的 IAM 角色,而不是尝试通过存储桶策略执行此操作? 你对 Lambda 的存储桶做了什么?某些操作需要资源在末尾排除/*,其他操作需要包含:"Resource": [ "arn:aws:s3:::&lt;bucketName&gt;", "arn:aws:s3:::&lt;bucketName&gt;/*" ] 【参考方案1】:

分配给 AWS Lambda 函数的角色应使用 AWS Lambda 角色创建(在 IAM 控制台中创建角色时选择该角色)。

角色没有委托人,因为权限分配给使用该角色的任何服务(在本例中为 Lambda 函数)。

此外,您应该为存储桶本身(例如,列出内容)和存储桶的内容(例如,GetObject)分配权限。

应该是这样的:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "AllowS3Access",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::123XXX:role/service-role/LAMBDA_ROLE_NAME"
            ,
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        
    ]

【讨论】:

感谢您的回复。我在存储桶本身上设置的策略是正确的。缺少的是卷本身需要通过 IAM 附加 AmazonS3FullAccess 策略。 @FiguringThisOut:将 AmazonS3FullAccess 策略附加到角色也对我有用。请发布您自己的答案并将其标记为已接受的答案!【参考方案2】:

在循环 for I 后,我可以让它工作,过程是:

    创建 s3 存储桶。 创建 IAM 策略(需要存储桶名称) 创建 IAM 角色(需要 IAM 策略) 创建 lambda 函数(需要 IAM 角色) 创建 s3 存储桶策略(需要 lambda 函数名称)

IAM 政策:

 
"Version": "2012-10-17",
"Statement": [
    
        "Sid": "Stmt*******",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:PutObjectTagging",
            "s3:PutObjectVersionAcl",
            "s3:PutObjectVersionTagging"
        ],
        "Resource": [
            "arn:aws:s3:::<bucket-name>"
        ]
    
]

我在 s3 存储桶上使用此策略


"Id": "Policy************",
"Version": "2012-10-17",
"Statement": [

  "Sid": "Stmt********",
  "Action": [
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectTagging",
    "s3:PutObjectVersionAcl",
    "s3:PutObjectVersionTagging"
  ],
  "Effect": "Allow",
  "Resource": "arn:aws:s3:::<bucket-name>/*",
  "Principal": 
    "AWS": [
      "arn:aws:iam::*********:role/<lambda-function-name>"
          ]
          
        
     ]

【讨论】:

我认为这不应该是&lt;lambda-function-name&gt;,而是角色名称,或者换句话说,只是完整的角色arn。 我只需要第 2 步和第 3 步就能让它工作。当然,这假设您有一个现有的存储桶(第 1 步)和现有的函数(第 4 步)。如果执行角色已被授予对存储桶的权限,我认为不需要第 5 步。对于我的用例,我需要读取和写入存储桶,所以我有两个语句,一个带有 "Action": ["s3:ListBucket"] 和一个带有 "Action": "s3:*Object" 以允许 Get 和提出行动。

以上是关于允许 Lambda 的 S3 策略的主要内容,如果未能解决你的问题,请参考以下文章

允许 lambda 函数访问 S3 存储桶但阻止外部 IP

为啥我的 lambda 函数在尝试访问 S3 存储桶时会被拒绝访问?

AWS Lambda使用S3

另一个账户中来自 Lambda 的 AWS 跨账户 S3 PutObject

Paramiko连接在Lambda内失败

AWS - Serverless 和 lambda