AWS boto - 将文件上传到S3会导致S3ResponseError:403 Forbidden

时间:2016-01-06 15:23:00

标签: amazon-web-services amazon-s3 boto

我在区域db-backup-production

中有一个名为Ireland (s3.eu-west-1.amazonaws.com)的存储桶

我正在尝试使用以下政策上传文件:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::db-backup-production/*"
        }
    ]
}

我一直收到以下错误

boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden

当我使用此政策上传时:

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

上传有效。我做错了什么?

2 个答案:

答案 0 :(得分:0)

如果你只是做了一个s3“put”,你的政策应该给你足够的权利。但是,如果您通过sdk,cli调用等列出或获取存储桶对象,则还需要存储桶本身的权限。

要提供这些权限,请将策略的“资源”部分用作数组,并将“arn:aws:s3 ::: db-backup-production”添加为此数组中的资源。我想是这样的:

"Resource": ["arn:aws:s3:::db-backup-production/*", "arn:aws:s3:::db-backup-production" ]

答案 1 :(得分:0)

在指定S3存储区权限时,您需要考虑存储区本身的权限,以及存储区内容的权限。

一种方法是要求为同一个存储桶指定两个资源:

"Resource": ["arn:aws:s3:::db-backup-production","arn:aws:s3:::db-backup-production/*"]

第一个资源指定存储桶级别范围,db-backup-production / *指定对象级别范围。

但是,您可以在两个语句中考虑单独的对象和存储区级别权限,如下所示:

  "Version": "2012-10-17",   "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::db-backup-production"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::db-backup-production/*"]
    }   ] }

此表单可让您更精细地控制存储桶和对象级别的资源。

请参阅Writing IAM Policies: How to Grant Access to an Amazon S3 Bucket