S3から別アカウントのS3バケットへデータ移行（cp/mv/syncコマンドの違い）

# はじめに
S3バケットを別のAWSアカウントへデータ移行したので、
その時に学習した内容（移行方法・cp/mv/syncコマンドの違い）をまとめておきます。

# データ移行方法

##### 1.`` cp ``コマンド
:::note
データをsourceバケットに残したままにしておきたいならcpコマンド
:::

##### 2.``mv``コマンド
:::note
データを移動(sourceからデータが消える)したいならmvコマンド 
※削除権限も付与する必要がある
:::

##### 3.``sync``コマンド
:::note
データを定期的にコピーしたいなら``sync``
※ちなみに、自動でコピーし続けたいならレプリケート機能
:::

# 【手順】データの移行 ``cp/mv/sync``

1. 【sourceアカウント】IAMカスタマーポリシーを作成し、IAMユーザーへアタッチ
2. 【targetアカウント】targetバケットのオブジェクト所有者をバケット所有者が優先される設定か確認 
3. 【targetアカウント】targetバケットのバケットポリシーを変更
4. 【AWS CLI】``cp/mv/sync``コマンド実行

## 1.【sourceアカウント】IAMカスタマーポリシーを作成し、IAMユーザーへアタッチ

1 source下記カスタム管理ポリシーを作成する。
  * ``mv`` コマンドを使用する場合は削除権限も必要

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<souceバケット名>",
                "arn:aws:s3:::<souceバケット名>/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::<targetバケット名>",
                "arn:aws:s3:::<targetバケット名>/*"
            ]
        }
    ]
}
```

2 上記カスタムポリシーをIAMユーザーにアタッチする。

## 2.【targetアカウント】targetバケットのオブジェクト所有者をバケット所有者が優先される設定か確認 

ACLの設定：``バケット所有者の強制``を選択。
→コピー先のバケット所有者が優先されるようになってれば良い。

参考：[S3 のオブジェクトの所有権を使用したアップロードされたオブジェクトの所有権の管理](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/about-object-ownership.html)

## 3.【targetアカウント】targetバケットのバケットポリシーを変更

```json
{
    "Version": "2012-10-17",
    "Id": "Policy1611277539797",
    "Statement": [
        {
            "Sid": "Stmt1611277535086",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<IAM userのARN>"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<targetバケット名>/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "Stmt1611277877767",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<IAM userのARN>"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<targetバケット名>"
        }
    ]
}
```

## 4.【AWS CLI】``cp/mv/sync``コマンド実行

```powershell
# IAMユーザーでログイン（AWSCLI）
$ aws configure
AWS Access Key ID [None]: [アクセスキー]
AWS Secret Access Key [None]: [シークレットアクセスキー]
Default region name [None]: [使用リージョン]
Default output format [None]:

# ログインユーザーの確認
$ aws sts get-caller-identity


# copyコマンド(オブジェクトが全てコピーされる)
$ aws s3 cp s3://<souceバケット名>/ s3://<targetバケット名>/ --acl bucket-owner-full-control --recursive

# mvコマンド(オブジェクトが移動され、sourceのオブジェクトが削除される)
$ aws s3 mv s3://<souceバケット名>/ s3://<targetバケット名>/ --acl bucket-owner-full-control --recursive

# syncコマンド(差分がコピーされる)
$ aws s3 sync s3://<souceバケット名>/ s3://<targetバケット名>/ --acl bucket-owner-full-control

```

## 参考
[別の AWS アカウントから S3 オブジェクトをコピーするにはどうすればよいですか](https://aws.amazon.com/jp/premiumsupport/knowledge-center/copy-s3-objects-account/)