S3 バケットを異なるアカウント間で共有してみた

# はじめに

Amazon S3 を使っている中で、他の AWS アカウント上にある S3 バケットのデータを利用したくなるときがあります。この時は、主に以下の3つの方法が利用可能です。

- S3 バケットのクロスアカウントレプリケーション
- バケットポリシーと IAM ポリシー
- スイッチロール



今回は、「S3 バケットのクロスアカウントレプリケーション」について、設定手順の確認をしていきます。



# S3 バケットのクロスアカウントレプリケーションの概要図

まず概要図はこんな感じです。

![image-20220402112738910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/354acb1d-91fd-c597-8917-bd8e334580e6.png)



左側にある AWS アカウント1のバケットに格納されたデータが、自動的に右側の AWS アカウント2 のバケットにコピーされます。データのコピーを行うことで、同じデータを双方に持つ形です。料金の観点だと、それぞれのバケットでデータを持つため、単純に料金がそれぞれ掛かってきます。



# アカウント1 : S3 Bucket を準備する

レプリケーション対象の S3 Bucket を用意します。レプリケーションを開始したときに既にファイルが存在する場合、どういった挙動になるのか気になるので、2つのファイルを作成しています。

![image-20220402113847684.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3ca4b5a2-9f65-64d1-09bb-700323802586.png)



S3 レプリケーションを行うには、バージョニングの設定が必要です。デフォルトでは無効になっているので、有効にしていきます。

S3 Bucket の詳細ページにある Properties から、Edit を選択します。

![image-20220402114559433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cf2870dc-ed78-cc82-1cf5-3fd6cb1ed66a.png)



Enable を選択して、Save changes を押します

![image-20220402114704264.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dbfa3a5d-7bbf-bfd9-0c85-2e42106731ae.png)



有効になりました

![image-20220402114831242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4b91ce03-9be1-201a-55c0-88bb1761353f.png)



# アカウント2 : S3 Bucket を準備する

同様に、AWS アカウント 2 でもバケットを準備して、バージョニングを有効化します。

![image-20220402115047427.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9db04c0f-3791-c542-31ba-9a002d6c5d7a.png)



# アカウント1 : IAM Role の作成

レプリケーションを行うために、IAM Role を作成していきます。IAM Role の作成画面で Custom trust policy を選択します。

![image-20220402124922374.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4c809ab6-8499-088b-285e-99e741a742ba.png)



次の trust policy を入力します。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```



次に、作業を簡単にするために次の `AmazonS3FullAccess` を選択します。実際の環境では、厳密な設定をしていくと良いでしょう。

![image-20220402125056425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/912e79c0-eaf8-6166-c840-d91112164b3c.png)



コマかな設定を行う場合、例えば、このようなポリシーを組み立てます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetReplicationConfiguration",
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectRetention",
                "s3:GetObjectLegalHold"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::s3-replicaton-source01",
                "arn:aws:s3:::s3-replicaton-source01/*",
                "arn:aws:s3:::s3-replication-dest01",
                "arn:aws:s3:::s3-replication-dest01/*"
            ]
        },
        {
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ReplicateTags",
                "s3:ObjectOwnerOverrideToBucketOwner"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::s3-replicaton-source01/*",
                "arn:aws:s3:::s3-replication-dest01/*"
            ]
        }
    ]
}
```



IAM Role の名前を指定して保存します

![image-20220402125245899.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fbb29bde-610a-7bca-6478-4c8217c24d12.png)



作成されました。

![image-20220402125342106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/92782d52-7cdf-a99e-fc54-9ff29c26be74.png)



# アカウント2 : レプリケーション許可設定

次のを参照しながら、レプリケーション先の AWS アカウントで、レプリケーション許可のバケットポリシーを設定していきます。

URL : https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/setting-repl-config-perm-overview.html#setting-repl-config-crossacct



Bucket Policy で Edit を押します。

![image-20220402130105979.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/66b7abfb-856a-adf6-f2c8-285c3795644c.png)



AWS アカウント1 で作成した IAM Role の ARN に変更して、以下のJSON Policy を指定します。

```
{
   "Version":"2012-10-17",
   "Id":"PolicyForDestinationBucket",
   "Statement":[
      {
         "Sid":"Permissions on objects",
         "Effect":"Allow",
         "Principal":{
            "AWS":"arn:aws:iam::xxxxxxx:role/S3-Replication-Role"
         },
         "Action":[
            "s3:ReplicateDelete",
            "s3:ReplicateObject"
         ],
         "Resource":"arn:aws:s3:::s3-replication-dest01/*"
      },
      {
         "Sid":"Permissions on bucket",
         "Effect":"Allow",
         "Principal":{
            "AWS":"arn:aws:iam::xxxxxxxx:role/S3-Replication-Role"
         },
         "Action": [
            "s3:List*",
            "s3:GetBucketVersioning",
            "s3:PutBucketVersioning"
         ],
         "Resource":"arn:aws:s3:::s3-replication-dest01"
      }
   ]
}
```





# アカウント1 : レプリケーションの設定

S3 Bucket の詳細ページで、Management から Create replication rule を選択します。

![image-20220402115336827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/241150db-5721-cbf5-9eb0-ddefbdafad48.png)



レプリケーションルールに好きな名前を指定できます

```
all-replicaton-to-another-account01
```

![image-20220402115818842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bfb65807-d163-ec49-4941-45b69c7a93f3.png)



すべてのオブジェクトをレプリケーションの対象にします。プレフィックスなどを指定して、レプリケーション対象を指定することも可能です。

![image-20220402115848551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a1b03e54-f9ba-aadb-9b41-16a2407aa6f5.png)



宛先の S3 Bucket を指定します。AWS アカウント2 側の アカウントID と バケット名を指定します。

![image-20220402120659209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/acb6b427-dd3e-81c4-453a-f165b170be63.png)



アカウント1 で作成した IAM Role を指定します。

![image-20220402130452877.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bb7b2e3f-b93f-3dcd-03bf-e0361f368063.png)



追加のオプション設定が出来ます。Metrics のみ有効にして Save を押します。

- Replication Time Control (RTC) : RTC を有効にすることで、ほとんどのオブジェクトは数秒でレプリケーションが完了します。99.99% のオブジェクトは 15 分以内にレプリケートします。
  - https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-time-control.html
- Delete marker replication : チェックをオンにすると、レプリケート元での削除がれプリケート先に反映します
  - https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/delete-marker-replication.html
- Replica modification sync : タグや ACL などのメタデータレプリケーション設定
  - https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-for-metadata-changes.html

![image-20220402121159422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/eecc869d-a560-db7e-70a5-2aecbc4141c1.png)



既に存在するオブジェクトもコピーするか聞かれるので、Submit を押します

![image-20220402121649984.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/95ea5c02-80b4-d74b-cd54-e84f06c06b6f.png)



既存のオブジェクトのコピーを有効化したため、Batch Operations の作成画面に遷移します。

![image-20220402123739948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/28e723db-f6ac-991d-6416-08b4d10b7ee0.png)



Report の設定をしたうえで、Save を押します。

![image-20220402123827738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1580c0ec-aec9-c81a-2ba8-d516a70631cb.png)





作成されました。

![image-20220402122618507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8c4ac8af-553b-80e5-e6d1-ae431fc9af94.png)



一定時間後、Batch Operation が処理されていることがわかります。この記事の環境では、4分ほどで処理が完了しました。

![image-20220402130817232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/33a274b9-1654-b5cc-ba4e-1c6ea9efd546.png)



# アカウント2 : 初期ファイル レプリケーション確認

レプリケーションを設定するときに、既に存在していたファイルが正常にレプリケーション先にコピーされているか確認します。AWS アカウント2 側の S3 Bucket を確認しましょう。

想定通り、正常にコピーされています。

![image-20220402131031800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f0fdbe94-20b4-7469-5bbb-13d09df554a0.png)



# アカウント1 : 新しくファイルをアップロード

初期のコピーが済んだので、新しくファイルをアップロードしてみましょう。まず、新しいファイルのアップロード前の状況です。

![image-20220402131303644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/00faae8a-1266-c649-7594-7d46aa53eb9b.png)



NewFile01.txt という名前のファイルをアップロードしました。

![image-20220402131332605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/88544b8e-998d-580d-56d2-1828adddfb49.png)



# アカウント2 : レプリケーション確認

レプリケーション先の S3 Bucket に、正常にコピーされています！記事の環境では数秒でレプリケーションされていました。

![image-20220402131443480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/743ef44f-2a52-b471-f511-7515f97bffc2.png)



# 検証を通じてわかったこと

- S3 Bucket のレプリケーション先は、異なるリージョンでも設定可能
- レプリケーション設定時に既に存在しているファイルも、レプリケーションの対象にすることが出来る
- Replication Time Control (RTC) を有効にすることで、ほとんどのオブジェクトは数秒でレプリケーションが完了する。99.99% のオブジェクトは 15 分以内にレプリケートと説明されている。
  - https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-time-control.html



# 参考URL

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html

https://blog.serverworks.co.jp/tech/2020/04/27/s3-share/

https://blog.serverworks.co.jp/tech/2020/04/28/s3-share2/