異なるアカウントにおけるS3の同期方法

# 目次
[1.はじめに](#1-はじめに)
[2.やりたい事のイメージ](#2-やりたい事のイメージ)
[3.実施内容](#3-実施内容)
　[1.コピー作業用のIAMユーザの作成及びポリシーのアタッチ](#1-コピー作業用のiamユーザの作成及びポリシーのアタッチ)
　[2.コピー元バケットのポリシー設定](#2-コピー元バケットのポリシー設定)
　[3.AWS CLIの設定](#3-aws-cliの設定)
　[4.同期の実行](#4-同期の実行)
[4.最後に](#4-最後に)



# 1. はじめに
AWS初学者向けに別アカウントS3の同期方法を記しておきます。
自身もまた初学者のため間違いがありましたら指摘頂けると幸いです。


# 2. やりたい事のイメージ
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/cc1ba04f-e0ea-e1c0-3f8e-0ea597b4f170.png)
アカウントAのS3からアカウントBのS3へファイルの同期（コピー）を行いたい。
同アカウントであればさほど難しくないのだがアカウント跨ぎが発生すると権限付与をしっかりやる必要がある。

# 3. 実施内容
### 1. コピー作業用のIAMユーザの作成及びポリシーのアタッチ
　まずはIAMユーザーの作成から始める。
　今回はコピー先アカウントBでユーザーを作成する。
　また、アクセスキーとシークレットアクセスキーを持っている既存ユーザーがあればそれを使用することも可能である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/bdab1415-684b-9596-ae2f-dbecd22220ba.png)

次にポリシーの作成を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/daa72d62-e03f-98df-3a97-fbe73323e9d1.png)

ポリシー作成は下記画像のようにコードをコピペで張り付ける。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/ecfc7c95-1ec4-c333-5b3d-88cf2c5927e3.png)

コードサンプル

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<コピー元のS3バケット名>",
                "arn:aws:s3:::<コピー元のS3バケット名>/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::<コピー先のS3バケット名>",
                "arn:aws:s3:::<コピー先のS3バケット名>/*"
            ]
        }
    ]
}
```

コピー元バケットからファイルをコピーしてくる権限とコピー先バケットへファイルを置く権限を記載しています。
以下に変更箇所の記載例を載せておきます。

"arn:aws:s3:::<コピー元のS3バケット名>"　→　例："arn:aws:s3:::bucket_moto/"
"arn:aws:s3:::<コピー先のS3バケット名>"　→　例："arn:aws:s3:::bucket_saki/"

:::note info
初学者が陥りやすいミスとして<>を残したままバケット名を書いてしまうことがあるので注意
:::



作成をしたらポリシーをユーザーへアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/479323b2-a689-54db-766b-07098d6281c3.png)

この後はユーザー作成まで完了させ、最後に作成されるアクセスキーとシークレットアクセスキーが記載されているCSVファイルをダウンロードしておく。


### 2. コピー元バケットのポリシー設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/f0ff7985-09ac-1938-10cc-8ae7c10130e2.png)
アクセス許可のタブからブロックパブリックアクセスを編集する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/3e05d032-5242-c165-3f2c-b8284e492b2d.png)

下2つのチェックを外して変更の保存を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/a6aad202-ec12-7ccb-535c-9a0ebc419586.png)

次にすぐ下にあるバケットポリシーの編集を押します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/30a37b90-6066-e4b5-c557-216f25cd6f3a.png)

コードサンプル <バケットポリシー>

```json
{
    "Version": "2012-10-17",
    "Id": "test",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "<IAMユーザ or IAMロールのARN>"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<コピー元のS3バケット名>/*",
                "arn:aws:s3:::<コピー元のS3バケット名>"
            ]
        }
    ]
}
```

ここについてはIAMロールのARNを記載した場合の例を示す。

"AWS":"< IAMユーザ or IAMロールのARN >"　→　例："AWS": "arn:aws:iam::257*********:user/test1"

:::note info
再度の注意にはなるが<>を残したままARN名を書かないように注意
:::

IAMロールのARNの確認は以下のようにIAM画面から確認可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/5cfbdcf5-d5a7-9a97-bc0b-2a5e57a71ebc.png)

問題なくバケットポリシーの記入ができたら変更の保存を押す。
ここまででバケットポリシーの設定が完了

### 3. AWS CLIの設定

AWS CLIのインストールに関しては、こちらからダウンロードし指示に従ってインストールを実行
https://awscli.amazonaws.com/AWSCLIV2.msi

完了後はインストールできたかを確かめるために下記コマンドを実行する。

```powershell
#aws --version
aws-cli/2.1.29 Python/3.7.4 Windows/10 botocore/2.0.0
```
問題なければversionが表示されるためインストールが完了

次に、アクセスキーとシークレットアクセスキーの設定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/dab85e07-dda8-51c7-1727-5da3b0ceea78.png)

このパス```C:\Users\<ユーザー名>\.aws```にある```credentials```をテキストエディタで開く。

```powershell
#既存のアクセスキー
[default]
aws_access_key_id = b7**********
aws_secret_access_key = la****************

#今回新しく追加するアクセスキー
[test1]　#任意のユーザー名　
aws_access_key_id = <アクセスキー>
aws_secret_access_key = <シークレットアクセスキー>

```

　```1.コピー作業用のIAMユーザの作成及びポリシーのアタッチ```で作成したIAMユーザーのアクセスキーとシークレットアクセスキー(ダウンロードしたCSVファイルに記載)を上記に記載して保存します。

保存が完了したら、ついに別アカウントのS3同期ができます！！

### 4. 同期の実行

コマンドプロンプトに下記コマンドを実行

```powershell
aws s3 sync s3://<コピー元のS3バケット名> s3://<コピー先のS3バケット名> --profile test1
```

ここまでの設定が上手くいっているとこのように大量のファイルも一度に同期可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1706530/8b6d1d86-357b-746f-9531-ed9dfd898619.png)


次回実行時はコピー先バケットにないファイルのみ参照してコピーしてくれるため実行速度も速いです。

# 4. 最後に
今回は、**別アカウントのS3を同期する方法** をご紹介しました。
初学者向けに手順書をイメージして書いていきましたが初めての執筆ということもあり、分かりにくい記事になっているかもしれません。
しかし、私のような初学者だからこそ必要なポイントを書けたのではないかと思いますので、この記事が誰かの助けになれれば幸いです。