MAGAZINE
ルーターマガジン
AWS S3バケットのミラーリング:オブジェクトを別のバケットに自動バックアップする

こんにちは。アルバイトのハオです。今回はAWS S3バケットのミラーリングについて紹介したいと思います。
ファイルがアップロード/変更されると、コピーが自動的に作成され、一方向に別の場所で保存する、という同期方法は「ミラーリング」といいます。今回はS3バケット間のミラーリング、いわばあるs3バケットにファイルをアップロードするとそのファイルのコピーが自動的に別のバケットに保存される仕組みを、Lambda関数で実現します。
今回執筆させていただいたこのブログは、主にこちらの内容を参考にやってきました。ただこの参考ブログは画像が古く、rootユーザではない場合についても触れていません。
1. lambda関数の中身を入手する
eleven41氏がGitHub上で公開されている、AWSバケットのミラーリング用のlambda関数aws-lambda-copy-s3-objectsのソース一式を取得します。こちらから最新バージョン(現在更新メンテナンスはされていないようです)の.zipファイルをダウンロードします。

2. IAMの設定
AWSコンソールにログインし、IAM権限の設定を行います。
まずIAMポリシーを作成します。以下の設定でポリシーを作成し、自分の使っているユーザーと紐づけます。
ポリシー:{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetBucketTagging", "s3:PutBucketTagging", "s3:ListBucket", "s3:GetBucketNotification" ], "Resource": [ "arn:aws:s3:::bucket-mirroring-test/*", "arn:aws:s3:::bucket-mirroring-test-dest/*", "arn:aws:s3:::bucket-mirroring-test", "arn:aws:s3:::bucket-mirroring-test-dest" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "iam:PassRole", "s3:ListAllMyBuckets", "cloudwatch:*", "logs:*", "lambda:*", "iam:ListRoles" ], "Resource": "*" } ] }ポリシー作成画面:

ユーザを選択:

ポリシーをユーザに紐づける:


次に、Lambda関数を実行するIAMロールを作成し、同じポリシーを紐づけます。
ロール作成画面:

ロール作成画面 ポリシーを紐づける:

3. Lambda関数の作成
AWSコンソールでLambda関数作成の画面に入り、適当な名前を付けましょう。

「デフォルトの実行ロールの変更」をクリックし、「既存のロールを使用する」を選択し、先ほど作成したIAMロールを選択します。

他のフィールドをそのままにして「関数の作成」ボタンを押します。
作成が終わったら、その関数の詳細画面に遷移されると思います。「関数コード」のところに移動します。右上の「アクション」→「.zipファイルをアップロード」をクリックし、先ほどダウンロードした.zipファイルをアップロードします。すると画面真ん中のコードが変わると思います。これで関数の中身が設定完了です。

4. S3バケットの設定
ミラーリング先、ミラーリング元のバケットをまだ作成していないなら、作成してから進みましょう。
ミラーリング元のバケットの詳細画面に行き、「プロパティ」タブ→「タグ」→「編集する」ボタンへ移動します。

キーを「TargetBucket」、値をミラーリング先のバケット名で、タグを追加します。

「プロパティ」に戻り、「イベント通知」まで下にスクロールし、「イベント通知を作成」ボタンをクリックします。

イベント名は適当、プレフィックスもサフィックスも入れなくても良いです。
「イベントタイプ」のところで「すべてのオブジェクト作成イベント」をチェックします。

「送信先」のところで、「Lambda関数」にし、先ほど作成したミラーリング用のLambda関数を選択します。

これでミラーリングの設定が全部完了です!
ミラーリング元のバケットに画像一枚をアップロードしてから、ミラーリング先のバケットに移動し、画像がミラーリングされたのを確認しましょう!
CONTACT
お問い合わせ・ご依頼はこちらから