こんにちは、CI部技術5課の村上です。
今回は、S3にあるオブジェクトを異なるアカウントと共有する方法を紹介します。3パターンほど検証したのですが、全部を紹介すると長くなってしまうので、この記事ではレプリケーションによって実現する方法を紹介します。
やりたいこと
図にすると、以下のような感じです。
前提として、アカウントAのIAMユーザーであるuser-aがS3にオブジェクトを保存しているとします。このオブジェクトをアカウントBのIAMユーザーであるuser-bが参照または取得する方法を3つ検証してみましたので、手順と検証してみた所感について紹介します。
検証した3つの方法
- バケットのレプリケーションで実現する
- バケットポリシーとIAMポリシーで実現する
- IAMロールで実現する(スイッチロール)
この記事では1の方法を紹介します。
1.バケットのレプリケーションで実現する
【手順】
①user-aがbucket-aのバージョニングを有効化する。
②user-bはレプリケーション先となるバケット(bucket-b)を作成し、バージョニングを有効化する。
③レプリケーションを実行する。
【特徴・所感】
- 簡単な操作で実現可能
- bucket-aにオブジェクトを保存すると、数秒程度でbucket-bへの同期が開始
設定手順
レプリケーションを実行するためには、前提としてバケットのバージョニングを有効化しておく必要があります。
バケットのプロパティの画面から「バージョニングの有効化」を選択します。この設定はレプリケーション元のbucket-aだけでなく、レプリケーション先のbucket-bでも必要です。忘れずに設定してください。
次にbucket-aのレプリケーションを実行します。管理タブのレプリケーションから「今すぐ始める」を選択します。
ソースの設定ですが、今回はbucket-aのすべてのコンテンツをレプリケートします。
次に送信先の設定で「別のアカウントのバケット」を選択し、アカウントBのアカウントIDとバケット名(bucket-b)を入力します。
次に、規則のオプションの構成です。ここではオブジェクトをレプリケートできるようIAMロールを設定します。
また、ここでbucket-bへ設定すべきバケットポリシーが参照できるので、後でこれをbucket-bに設定します。
最後に全体を確認し、「保存する」を選択します。
ちなみに、レプリケーション先であるbucket-bのバージョニングが有効化されていないと、ここで以下のようなエラーが表示されてしまいます。
アカウントBでは、bucket-bにバケットポリシーを設定する必要があるので、アクセス権限タブからバケットポリシーを選択し、先ほどコピーしたバケットポリシーをそのまま貼り付けます。
設定したバケットポリシーは以下のとおりです。principal要素のアカウントIDのみ変更していますので、ポリシー作成の際は適宜、設定してください。
{ "Version": "2008-10-17", "Id": "S3-Console-Replication-Policy", "Statement": [ { "Sid": "S3ReplicationPolicyStmt1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::アカウントid:root" }, "Action": [ "s3:GetBucketVersioning", "s3:PutBucketVersioning", "s3:ReplicateObject", "s3:ReplicateDelete" ], "Resource": [ "arn:aws:s3:::bucket-b", "arn:aws:s3:::bucket-b/*" ] } ] }
実行結果
以上の手順を終えると、bucket-bへのレプリケーションが実行されます。
まとめ
今回はレプリケーション機能を使った方法をご紹介しました。ポリシーを直接編集することもなく、簡単な操作で実現できるのがこの方法のメリットだと思います。
また別の記事では、今回と違った方法でS3にあるオブジェクトを共有する方法を紹介しますので、ぜひご覧ください。