S3のレプリケーション機能を使って、ファイルを別バケットに連携してみる


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

顧客データや売上データ、在庫のデータを効率的にやり取りするためには、ファイル・データ連携ツールやシステムが必要になります。

 

しかし、価格を調べてみると、月額数万から数十万円しますよね。

 

毎日膨大なデータをやりとりするわけではない場合には、コストが見合わないですよね。

 

AWSのストレージサービスであるS3を利用すれば、なんちゃってファイル・データ連携ができちゃいます。

 

今回の記事では、S3のレプリケーション設定を利用して、別バケットにファイル連携をする構築をします。

 

 

S3で別バケットにファイル連携してみる

わたしは今のプロジェクトでファイル連携ツールを使用していますが、AWSのサービスだけでも実現できると考えました。

 

今回の構築では、同一アカウント内の別バケットにレプリケーションすることを想定しています。今後別アカウントのS3バケットを対象にした構築も紹介する予定です。

 

 

■構築図

s3-file-replicate構築図

今回構築する仕組みは、ユーザーが送信元バケットにファイルをアップロードし、S3のレプリケーション機能を使って受信用別バケットに同じファイルを作成します。

 

受信用バケットにファイルが作成されたら、EventoBridgeに通知、ドキュメントを整形したあと、Amazon SNSを呼び出し、ユーザーにメールが来るシステムです。

 

S3からAmazon SNSに直で通知も可能ですが、届くドキュメントが読めたものではないです↓

 

s3-file-replicateメール

 

せっかく通知するなら、内容がわかったほうがいいと思い、Event Bridgeの入力トランスフォーマーでドキュメントを整形し、読みやすくしてからAmazon SNSを呼び出す手順を選択しました。
 

 

【~構築の流れ~】
今回の構築の流れは以下の通りです。
 

  1. S3バケット作成
  2. IAMロール・ポリシー作成
  3. SNSトピック・サブスクリプション作成
  4. EventBridgeルール作成
  5. S3バケット設定変更

 

 

■S3バケット作成

まずはS3バケットを2つ作成します。送信元バケットと受信用バケットです。

 

 

↓Amazon S3のコンソール画面から、[バケット]を押し、[バケットを作成]をクリックします。

 

s3-file-replicateバケット作成

 

↓バケット名を入力し、他の設定は要件に合わせて選択し、[バケットを作成]をクリックしてください。作成が完了したら、もう一つ別名で作成しましょう。

 

s3-file-replicateバケット作成

s3-file-replicateバケット作成

 

↓バケットを2つ作成できたか確認します。※画像を見てもらうとわかるのですが、originをorginと誤字っています。すいません。

 

s3-file-replicateバケット作成

 

↓両バケットにファイル共有用のフォルダを作成します。S3バケットをクリックし、[フォルダの作成]をクリックしてください。

 

s3-file-replicateバケット作成

 

↓フォルダ名を任意で入力し、[フォルダの作成]をクリックします。

 

s3-file-replicateバケット作成

s3-file-replicateバケット作成

s3-file-replicateバケット作成

 

両バケットに"shared"というフォルダを作成しました。

 

S3バケットの作成は以上です。

 

 

■IAMポリシー作成

送信元バケットが受信用バケットにレプリケーション機能でファイルを作成できるように、IAMポリシー・ロールを用意します。

 

 

IAMのコンソール画面で左のおナビゲーションペインから、[ポリシー]をクリックし、[ポリシーを作成]を押してください。

 

s3-file-replicateIAMポリシー作成

 

↓[JSON]タブをクリックし、以下のドキュメントを貼り付けてください。

 

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetReplicationConfiguration",
            "s3:ListBucket"
         ],
         "Resource":[
            "arn:aws:s3:::saitou-s3-orgin"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObjectVersionForReplication",
            "s3:GetObjectVersionAcl",
            "s3:GetObjectVersionTagging"
         ],
         "Resource":[
            "arn:aws:s3:::saitou-s3-orgin/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ReplicateObject",
            "s3:ReplicateDelete",
            "s3:ReplicateTags"
         ],
         "Resource":"arn:aws:s3:::saitou-s3-reseiver/*"
      }
   ]
}

 

 

s3-file-replicateIAMポリシー作成

 

↓貼り付けが完了したら、[次のステップ:タグ]をクリックします。

 

s3-file-replicateIAMポリシー作成

 

↓タグは任意で入力し、[次のステップ:確認]を押します。

 

s3-file-replicateIAMポリシー作成

 

↓[名前]と[説明]を入力し、[ポリシーの作成]をクリックします。

 

s3-file-replicateIAMポリシー作成

 

IAMポリシーの作成は以上です。

 

 

■IAMロール作成

つぎは、先ほど作成したポリシーをアタッチするIAMロールを作成します。

 

 

IAMのコンソール画面で、左のナビゲーションペインから、[ロール]をクリックし、[ロールを作成]を押してください。

 

s3-file-replicateIAMロール作成

 

↓[信頼されたエンティティタイプ]で[カスタム信頼ポリシー]を選択します。

 

s3-file-replicateIAMロール作成

 

↓[カスタム信頼ポリシー]の項目で、以下のドキュメントを貼り付け、[次へ]をクリックします。

 

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

 

s3-file-replicateIAMロール作成

 

↓作成したIAMポリシーを検索し、☑を入れ、[次へ]を押します。

 

s3-file-replicateIAMロール作成

 

↓[ロール名]・[説明]を入力し、[ロールを作成]をクリックしてください。

 

s3-file-replicateIAMロール作成

s3-file-replicateIAMロール作成

 

IAMロールの作成は以上です。

 

 

■SNSトピック作成

受信用バケットにファイルが作成されたことをメールで通知できるように、Amazon SNSトピックとサブスクリプションを作成します。

 

 

設定値は以下の通りです。

 

項目 設定値
タイプ スタンダード
名前 任意
表示名 File Replicate

 

 

s3-file-replicateSNSトピック作成

s3-file-replicateSNSトピック作成

 

↓入力が完了したら、[トピックの作成]を押します。

 

s3-file-replicateSNSトピック作成

 

SNSトピックの作成は以上です。

 

 

■サブスクリプション作成

サブスクリプションを作成します。

 

設定値は以下の通りです。

 

項目 設定値
トピックARN 作成したトピック
プロトコル Eメール
エンドポイント 任意のメールアドレス

 

 

作成したSNSトピックをクリックし、[サブスクリプション]タブから[サブスクリプションの作成]をクリックします。

 

s3-file-replicateSNSサブスクリプション作成

 

↓設定値を入力し、[サブスクリプションの作成]を押します。

 

s3-file-replicateSNSサブスクリプション作成

 

↓サブスクリプションを作成すると、登録したメールアドレスに確認メールが来ます。

 

s3-file-replicateSNSサブスクリプション作成

 

↓メールを確認し、[Confirm subscription]をクリックしてください。

 

s3-file-replicateSNSサブスクリプション作成

 

↓[Subscription confirmed!]と表示されれば完了です。

 

s3-file-replicateSNSサブスクリプション作成

 

サブスクリプション作成は以上です。

 

 

■EventBridgeルール作成

つづいて、S3バケットからの通知を受けるEventBridgeルールを作成します。

 

設定値は以下の通りです。

 

項目 設定値
タイプ スタンダード
名前 任意
説明 任意
イベントバス default
ルールタイプ イベントパターンを持つルール

 

 

Amazon EventBridgeのコンソール画面で、左のナビゲーションペインから、[ルール]をクリックします。

 

s3-file-replicateEventBridgeルール作成

 

↓[ルールを作成]をクリックします。

 

s3-file-replicateEventBridgeルール作成

 

↓設定値を入力し、[次へ]をクリックします。

 

s3-file-replicateEventBridgeルール作成

 

↓[イベントソース]で[AWSイベントまたはEventBridgeパートナーイベント]を選択します。

 

s3-file-replicateEventBridgeルール作成

 

↓[イベントタイプ]は[AWSイベント]を選択し、[サンプルイベント]ではS3の[Object Created]を選択します。

 

s3-file-replicateEventBridgeルール作成

 

↓[メソッド]では[カスタムパターン]を選択します。

 

s3-file-replicateEventBridgeルール作成

 

↓イベントパターンに以下のドキュメントを貼り付け、[次へ]をクリックしてください。ドキュメントの"name"や"prefix"は自身の環境に合わせてください。

 

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["受信用バケット名"]
    },
    "object": {
      "key": [{
        "prefix": "フォルダ名/"
      }]
    }
  }
}

 

 

s3-file-replicateEventBridgeルール作成

 

↓ターゲットの選択画面では、以下の設定値を入力してください。

 

項目 設定値
ターゲットタイプ AWS のサービス
ターゲットを選択 SNSトピック
トピック 作成したトピック

 

 

s3-file-replicateEventBridgeルール作成

 

↓[追加設定]で[ターゲット入力を設定]の[入力トランスフォーマー]を選択し、[入力トランスフォーマーを設定]をクリックしてください。

 

s3-file-replicateEventBridgeルール作成

 

↓[サンプルイベントタイプ]は[AWSイベント]を選択し、[サンプルイベント]ではS3の[Object Created]を選択します。

 

s3-file-replicateEventBridgeルール作成

s3-file-replicateEventBridgeルール作成

 

↓[入力パス]で以下のドキュメントを貼り付けてください。

 

{"backetName":"$.detail.bucket.name","eventTime":"$.time","fileName":"$.detail.object.key","fileSize":"$.detail.object.size","awsRegion":"$.region"}

 

 

s3-file-replicateEventBridgeルール作成

 

↓[テンプレート]には以下のドキュメントを貼り付けてください。項目名は自分のわかりやすい名前に変更しましょう。

 

"バケット名:<backetName>に<fileName>が追加されました"
"AWS リージョン : <awsRegion> "
"発生時間 : <eventTime> "
"バケット名 : <backetName> "
"追加ファイル名 : <fileName>"
"ファイルサイズ : <fileSize>"

 

 

s3-file-replicateEventBridgeルール作成

 

↓[出力を生成]をクリックしてみると、サンプルイベントから[入力パス]で定義された変数をテンプレート通りに出力してくれます。

 

s3-file-replicateEventBridgeルール作成

 

↓[次へ]をクリックしてください。

 

s3-file-replicateEventBridgeルール作成

 

↓内容に問題がなければ、[ルールの作成]をクリックします。

 

s3-file-replicateEventBridgeルール作成

s3-file-replicateEventBridgeルール作成

 

Amazon EventBridgeルールの作成は以上です。

 

 

■S3バケット設定変更

構築最後の手順です。作成したS3バケットの設定を変更します。

 

設定は2つで、送信元バケットでレプリケーションの設定と、受信用バケットではEventBridgeへの通知を設定です。

 

■レプリケーション設定

 

まずは送信元バケットでレプリケーションの設定をお子います。設定値は以下の通りです。

 

項目 設定値
レプリケーションルール名 任意
[Status (ステータス)] Enabled (有効)
ルールスコープを選択 1つ以上のフィルターを使用してこのルールのスコープを制限する
プレフィックス shared/
送信先 このアカウントのバケットを選択する
バケット名 受信用バケット名
IAMロール 既存のIAMロールから選択
IAMロール 作成したIAMロール

 

 

↓送信元のバケットの[管理] タブをクリックし、[レプリケーションルール] までスクロールして、[レプリケーションルールを作成] を選択します。

 

s3-file-replicateS3設定変更

s3-file-replicateS3設定変更

s3-file-replicateS3設定変更

 

↓[バケットのバージョニングを有効にする]をクリックします。

 

s3-file-replicateS3設定変更

 

↓設定値を入力します。

 

s3-file-replicateS3設定変更

s3-file-replicateS3設定変更

 

↓[バケットのバージョニングを有効にする]をクリックします。

 

s3-file-replicateS3設定変更

s3-file-replicateS3設定変更

s3-file-replicateS3設定変更

 

↓作成したIAMロールを選択します。

 

s3-file-replicateS3設定変更

 

↓要件がなければ、[保存]をクリックします。

 

s3-file-replicateS3設定変更

 

↓新しく作成したバケットなのでファイルはありませんが、[いいえ、既存のオブジェクトをレプリケートしません。]を選択し、[送信]をクリックします。

 

s3-file-replicateS3設定変更

 

 

■EventBridge通知設定

受信用バケットでEventBridge通知設定を行います。

 

 

↓受信用バケットをクリックし、[プロパティ]タブを押します。

 

s3-file-replicateS3設定変更

 

↓[イベント通知]欄で[Amazon EventBridge]の[編集]をクリックします。

 

s3-file-replicateS3設定変更

 

↓[オン]を選択し、[変更の保存]を押します。

 

s3-file-replicateS3設定変更

s3-file-replicateS3設定変更

 

 

構築は以上です。

 

■動作確認

s3-file-replicate構築図

動作確認を行いましょう。

 

 

↓送信元バケットの[shared]というフォルダに適当なファイルをアップロードします。

 

s3-file-replicate動作確認

s3-file-replicate動作確認

s3-file-replicate動作確認

s3-file-replicate動作確認

 

↓受信用バケットを見てみましょう。ファイルが確認できます。

 

s3-file-replicate動作確認

 

↓登録したメールアドレスの受信トレイも確認してみましょう。

 

s3-file-replicate動作確認

 

メールが届きましたね。

 

もしメールが届かない場合は、IAMポリシーやEventBridgeのカスタムイベントパターンを見直してみましょう。

 

 

■まとめ:S3のレプリケーション機能を使って、ファイルを別バケットに連携してみる

AWSには200以上のサービスがあります。組み合わせ次第で現在しようしているツールを代替し、かつ、コストを下げられるかもしません。

 

今後もAWS体操と思い、既存のツールをAWSに置き換える構築をやっていきます。

 

 

参考リンク:AWS公式webサイト
 

 

↓ほかの協栄情報メンバーもS3に関する記事を公開しています。ぜひ参考にしてみてください。

 

■LambdaでS3署名付きURLを発行してSNS送信する構築ハンズオン(INAMURA)
https://cloud5.jp/lambda-by-presignedurl/

 

■S3バケットポリシー誤ってアクセス不可時の対処(liyo)
https://cloud5.jp/s3-deny-policy/

 

■CloudFormation を使用して、既存の S3 バケットで Lambda 用の Amazon S3 通知設定を作成してみました。(小林 剛)
https://cloud5.jp/cloudformation-s3-notification-lambda/

 

Last modified: 2023-02-26

Author