【问题标题】:S3 Policy to Allow Lambda允许 Lambda 的 S3 策略
【发布时间】:2026-01-28 11:10:02
【问题描述】:

我在使用 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;/*" ]

标签: amazon-web-services amazon-s3 aws-lambda aws-sdk


【解决方案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 后,我可以让它工作,过程是:

  1. 创建 s3 存储桶。
  2. 创建 IAM 策略(需要存储桶名称)
  3. 创建 IAM 角色(需要 IAM 策略)
  4. 创建 lambda 函数(需要 IAM 角色)
  5. 创建 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 和提出行动。