LoginSignup
5
5

More than 1 year has passed since last update.

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

Posted at

はじめに

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

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

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

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

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

image-20220402112738910.png

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

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

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

image-20220402113847684.png

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

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

image-20220402114559433.png

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

image-20220402114704264.png

有効になりました

image-20220402114831242.png

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

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

image-20220402115047427.png

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

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

image-20220402124922374.png

次の trust policy を入力します。

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

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

image-20220402125056425.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

作成されました。

image-20220402125342106.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

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

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

all-replicaton-to-another-account01

image-20220402115818842.png

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

image-20220402115848551.png

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

image-20220402120659209.png

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

image-20220402130452877.png

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

image-20220402121159422.png

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

image-20220402121649984.png

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

image-20220402123739948.png

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

image-20220402123827738.png

作成されました。

image-20220402122618507.png

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

image-20220402130817232.png

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

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

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

image-20220402131031800.png

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

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

image-20220402131303644.png

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

image-20220402131332605.png

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

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

image-20220402131443480.png

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

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

参考URL

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5