在不同 AWS 账户上的 s3 存储桶之间同步时访问被拒绝

Ori*_*Eye 7 permissions synchronization amazon-s3 aws-cli

我正在尝试在不同 AWS 账户上的两个存储桶之间设置同步。

我开始cp工作:

@ubuntu:~$ s3cmd cp -v s3://src/dir/ s3://dest/folder --recursive
Run Code Online (Sandbox Code Playgroud)

我是拥有的用户,/src/dir我添加了:

{
"Version": "2012-10-17",
"Id": "Policy1477299702471",
"Statement": [
    {
        "Sid": "Stmt1477299696163",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::awsid:user/name"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::bucket/*"
    }
]}
Run Code Online (Sandbox Code Playgroud)

测试存储桶上的存储桶权限策略。

现在我要aws sync下班了,因为s3 cp不建议与 cron 一起使用。

我试过

user@ubuntu:~$ aws s3 sync --dryrun s3://src/ s3://dest/ --region eu-central-1
Run Code Online (Sandbox Code Playgroud)

但我访问被拒绝:

致命错误:调用 ListObjects 操作时发生错误 (AccessDenied):拒绝访问

如果这是拥有存储桶的用户,我如何拒绝访问并运行同步?

Joh*_*ein 14

ListObjects错误的原因是您分配了访问存储桶内容的权限( arn:aws:s3:::bucket/*),但您没有授予存储桶本身的权限( arn:aws:s3:::bucket)。该ListObjects命令需要访问存储桶。

为了测试这一点,我做了以下事情:

  • 使用了两个 AWS 账户:账户 A、账户 B
  • bucket-a在账户 A 中创建
  • bucket-b在账户 B 中创建
  • user-a在账户 A 中创建了一个具有访问权限的 IAM 用户bucket-a
  • 将存储桶策略添加到bucket-b

    {
      "Id": "CopyBuckets",
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1",
          "Action": "s3:*",
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::bucket-b",
            "arn:aws:s3:::bucket-b/*"
          ],
          "Principal": {
            "AWS": [
              "arn:aws:iam::<account-a-id>:user/user-a"
            ]
          }
        }
      ]
    }
    
    Run Code Online (Sandbox Code Playgroud)

然后我user-a在账户 A 中使用触发同步:

aws s3 sync s3://bucket-a s3://bucket-b --profile user-a
Run Code Online (Sandbox Code Playgroud)

它工作成功。