構成

2つのAWSアカウントのS3バケット間でファイルをコピーする設定を考える。

構成としては以下のようになる。

構成

権限設定としては以下のようになる。

  • コピー先AWSアカウント: コピー元、コピー先のS3バケットにアクセスするための権限をIAM Userに与える
  • コピー元AWSアカウント: コピー先のAWSアカウントのIAM Userがアクセスできるようにバケットポリシーを設定する

【AWS】他アカウントのS3へアクセスできるようにする の構成に加えて自アカウントのS3バケットにアクセスするための権限をIAM Userに追加した形となる。

コピー先AWSアカウントの設定

コピー先のAWSアカウントにあるIAM Userへ以下の権限を与える。
権限を与えるIAM Userがまだ存在しない場合は作成する。

IAM Roleを作成し、以下のポリシーをアタッチする。

  • コピー元バケットへのアクセス権限
    • s3:GetObject
    • s3:ListBucket
  • コピー先バケットへのアクセス権限
    • s3:GetObject
    • s3:ListBucket
    • s3:PutObject

その他、コピー元のバケットのデータがタグやバージョンを持っている場合は対応するs3:GetObject*s3:PutObject*の権限を与える。

また、アクセスを許可するResourceにはアクセス先のS3バケットを指定する。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObjectTagging",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::コピー元バケット名/*",
        "arn:aws:s3:::コピー先バケット名/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectTagging",
      ],
      "Resource": [
        "arn:aws:s3:::コピー先バケット名/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::コピー元バケット名",
        "arn:aws:s3:::コピー先バケット名"
      ] 
    }
  ]
}

IAM Policyを作成してIAM Roleにアタッチしてもいいし、IAM Roleのインラインとして設定してもいい。

コピー元AWSアカウントの設定

コピー元のS3バケットにコピー先のAWSアカウントのIAM Userがアクセスできるようにバケットポリシーを設定する。

バケットポリシーへ設定する情報は以下のとおり。

  • アクセスを許可するIAM UserのARNをPrincipalで指定
  • アクセスを許可するActionを指定(コピー元なので読み取り権限だけでオーケー)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::コピー先アカウントID:role/コピー先AWSアカウントのロール名"
      },
      "Action": [
        "s3:GetObjectTagging",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::コピー元バケット名/*"
      ]
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::コピー先アカウントID:role/コピー先AWSアカウントのロール名"
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::コピー元バケット名"
      ]
    }
  ]
}

コピーの実行

コピー元のS3バケットからコピー先のS3バケットへファイルをコピーするにはaws s3 cpコマンドやaws s3 syncコマンドを使う。

$ aws s3 cp s3://<コピー元バケット名>/<オブジェクトキー> s3://<コピー先バケット名>/<オブジェクトキー>
$ aws s3 sync s3://<コピー元バケット名> s3://<コピー先バケット名>