在AWS中使用S3 listObjectVersions需要哪些权限?

11

我目前有一个使用node sdk调用listObjectVersions的lambda函数,以列出特定文件的所有版本。然而,我无法确定我的策略中哪个权限将授予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时,进行调用时出现“访问被拒绝”的错误。我已经更改了我的策略来允许操作s3:*,这使lambda函数可以工作。但是,我不想授予对整个s3的完全访问权限。

我需要添加哪个操作以获得许可?

2个回答

14

来自Amazon S3的操作、资源和条件键 - AWS身份和访问管理

ListBucketVersions: 使用版本子资源列出存储桶中所有对象版本的元数据。

我进行了以下测试:

  • 创建了一个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),但这是要使用的正确权限。


7

您需要在策略中更新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/*"
      }
   ]
}

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


我应该澄清一下,我删除了我的实际资源桶。这不是问题的原因。 - Gary Holiday
然后在“资源”中使用通配符“*”,这样它就可以用于任何S3存储桶,无论是已经存在还是以后创建的。 - Abdullah Khawer
然而问题不在于此。问题是我无法使用listObjectVersions命令,因为我没有正确的操作权限。我的存储桶中列出的资源都很好,我为了清晰起见从问题中删除了它们。当我更改策略以接受s3:*操作时,它可以正常工作。这意味着有一种操作可以允许执行listObjectVersions,但我不知道那个操作是什么。 - Gary Holiday
这是s3:GetObjectVersion。以下是与版本控制相关的所有操作。 "s3:GetObjectVersionTagging", "s3:ListBucketVersions", "s3:GetObjectVersionTorrent", "s3:GetObjectVersionAcl", "s3:GetBucketVersioning", "s3:GetObjectVersionForReplication", "s3:GetObjectVersion"。我已经更新了我的答案。 - Abdullah Khawer
1
您也可以使用 AWS 托管的 AmazonS3ReadOnlyAccess 策略。 - Abdullah Khawer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接