異なるAWSアカウント間のS3内データを移動する方法

# はじめに

以下のように、Bucket_A(以下copy-from-bucketとする)にあるデータを異なるAWSアカウントにあるBucket_B(以下copy-to-bucketとする)にコピーするための設定方法について説明します。

![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550851/eebeffae-beb2-599d-1d67-5812b1b751cc.png)


こうした設定を使う状況としては、異なるアカウントのデータを移動させるのに、大容量すぎて一度ローカルに落としてから再度別アカウントバケットへ移動などという操作が困難なときなどが考えられるでしょう。

# 手順

## 1.コピー先となるアカウントに、コピー専用ユーザーを作成する

異なるアカウントのデータをいじるのは、オペミスで大事なデータを消去してしまったりする危険性もあるので、権限を最小限にしたコピー専用ユーザーを作成したほうがいいです。ここでは新規に専用ユーザーを作る前提で話を進めます。
**※ここからの作業はコピー先アカウント内での操作となります。**

### コピー専用ユーザー新規作成
コピーに必要な権限を持たせるため、以下のポリシーを記載したJSONファイルを作成してください。
※「copy-from-bucket」はコピー元バケット名に、「copy-to-bucket」はコピー先バケット名に置き換えること。

```copy_only_user_policy.json
{
  "Statement": [
    {
      "Action": ["s3:ListBucket", "s3:GetObject"],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::copy-from-bucket",
        "arn:aws:s3:::copy-from-bucket/*"
      ]
    },
    {
      "Action": ["s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl"],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::copy-to-bucket",
        "arn:aws:s3:::copy-to-bucket/*"
      ]
    }
  ],
 "Version": "2012-10-17"
}
```


次にユーザーを新規作成します。
※AWSコンソールからやってもOKです。

```create_user.sh
# ユーザー作成
$ aws iam create-user --user-name copy_only_user 

# 作成したユーザーを任意のグループに追加【必須ではない】
$ aws iam add-user-to-group \
 --group-name HOGEGROUP \
 --user-name copy_only_user

```

### ユーザー設定
コピー専用ユーザーと、普段の作業をするユーザーは異なりますね。
AWS CLIで任意でユーザーを切り替えられるような設定をしておきましょう。
アクセスキーとシークレットアクセスキーを発行し、設定します。
（アクセスキー＝ユーザーアカウントID、シークレットアクセスキー＝パスワードのようなものです）

```create_access_key.sh
# アクセスキーとシークレットアクセスキーを発行する。
$ aws iam create-access-key --user-name copy_only_user
```

#### 出力結果
以下のSecretAccessKey(????????????の部分)とAccessKeyId(!!!!!!!!!!!!の部分)をどこかに保存しておきましょう。

```
{
    "AccessKey": {
        "UserName": "ユーザー名", 
        "Status": "Active", 
        "CreateDate": "2015-04-03T04:10:43.927Z", 
        "SecretAccessKey": "????????????", 
        "AccessKeyId": "!!!!!!!!!!!!"
    }
}
```

次にAWS CLIのユーザー設定をします。
一行目のコマンドを押すと以下四つの情報を聞かれるので、それぞれ入力していきます。

```set_copy_only_user_info.sh
$ aws configure --profile copy_only_user
AWS Access Key ID [None]: !!!!!!!!!!!!
AWS Secret Access Key [None]: ????????????
Default region name [None]: ap-northeast-1
Default output format [None]: text
```

コピー専用ユーザーにポリシーを付与します。

```create-and-
$ aws iam create-policy --policy-name \
    copy_user_policy --policy-document \
    file://copy_only_user_policy.json

# 123456789012のところは現在作業中のAWSアカウントIDに読み替えてください。
$ aws iam attach-user-policy --user-name copy_only_user \
    --policy-arn arn:aws:iam::123456789012:policy/copy_user_policy
```

これでいつでもprofileオプションをセットすることでこのユーザーとしてコマンドが打てます。

```ls_s3_as_copy_only_user.sh
$ aws s3 ls s3://copy-to-bucket/ --profile copy_only_user
```

【補足】各ユーザーとアクセスキー/シークレットアクセスキーは以下の場所をみると確認できます。

```Chk_user_credentials.sh
$ cat ~/.aws/credentials
```

次にコピー元バケットに以上のポリシーを設定します。

## 2.コピー元バケットのバケットポリシー設定
コピー元のバケットに、異なるアカウントからのアクセス許可の設定を付与します。まずは以下のJSONファイルを作成します。
**※ここからの作業はコピー元アカウント内での操作となります。**

```copy_from_bucket_policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ReadAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "325045486985"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::copy-from-bucket/*",
                "arn:aws:s3:::copy-from-bucket"
            ]
        }
    ]
}
```

このバケットポリシーを設定しましょう。

```put-bucket-policy.sh
$ aws s3api put-bucket-policy --bucket copy-from-bucket --policy file://copy_from_bucket_policy.json
```

最後に以下のコマンドでデータが移動できたら成功です。

```copy_data.sh
$ aws s3 sync s3://copy-from-bucket/ s3://copy-to-bucket/ --profile copy_only_user
```

おしまい