在 AWS 中使用 S3 listObjectVersions 需要什么权限?

What permission is needed to use S3 listObjectVersions in AWS?

我目前有一个 lambda,它使用节点 sdk 调用 listObjectVersions 来列出特定文件的所有版本。但是,我无法弄清楚我的策略中的哪些权限会​​授予 lambda 进行此调用的权限。我搜索了 AWS 文档,但找不到任何信息。

以下是我策略中的当前权限:

- PolicyName: S3Policy
  PolicyDocument:
    Version: 2012-10-17
    Statement:
      - Effect: Allow
        Action:
          - s3:PutObject
          - s3:PutObjectAcl
          - s3:GetObject
          - s3:GetObjectVersion
          - s3:ListObjectVersions
          - s3:DeleteObject
          - s3:ListBucket

当我执行 lambda 时,我在调用时得到一个 Access Denied。我已更改策略以允许操作 s3:* 并且 lambda 有效。但是,我不想授予对 s3 的完全访问权限。

我需要添加什么操作才能允许?

您需要在政策中更新您的 Resource

s3:ListBucketVersions 是您要查找的操作。

应该是这样的:

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListAllMyBuckets"
         ],
         "Resource":"arn:aws:s3:::*"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket",
            "s3:GetBucketLocation",
            "s3:ListBucketVersions",
            "s3:GetBucketVersioning"
         ],
         "Resource":"arn:aws:s3:::examplebucket"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:DeleteObject",
            "s3:GetObjectVersionTagging",
            "s3:GetObjectVersionTorrent",
            "s3:GetObjectVersionAcl",
            "s3:GetObjectVersionForReplication",
            "s3:GetObjectVersion"
         ],
         "Resource":"arn:aws:s3:::examplebucket/*"
      }
   ]
}

尝试相应地更改您的政策。

来自Actions, Resources, and Condition Keys for Amazon S3 - AWS Identity and Access Management

ListBucketVersions: Use the versions subresource to list metadata about all of the versions of objects in a bucket.

我测试如下:

  • 创建了一个 IAM 用户
  • 分配了以下政策
  • 运行 命令:aws s3api list-object-versions --bucket my-bucket

成功了。

政策是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListBucketVersions",
            "Resource": "*"
        }
    ]
}

所以,虽然命名看起来有点奇怪(List Object Versions vs List Bucket Versions),但它是正确的权限使用。