AWS boto - upload file to S3 cause S3ResponseError: 403 Forbidden

AWS boto - upload file to S3 cause S3ResponseError: 403 Forbidden

我有一个名为: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": "*"
        }
    ]
}

上传成功。我做错了什么?

如果您只做 s3 "put",您的保单应该给您足够的权利。但是,如果您通过 sdk、cli 调用等列出或获取存储桶对象,您还需要存储桶本身的权限。

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

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

在指定 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