この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
顧客データや売上データ、在庫のデータを効率的にやり取りするためには、ファイル・データ連携ツールやシステムが必要になります。
しかし、価格を調べてみると、月額数万から数十万円しますよね。
毎日膨大なデータをやりとりするわけではない場合には、コストが見合わないですよね。
AWSのストレージサービスであるS3を利用すれば、なんちゃってファイル・データ連携ができちゃいます。
今回の記事では、S3のレプリケーション設定を利用して、別バケットにファイル連携をする構築をします。
S3で別バケットにファイル連携してみる
わたしは今のプロジェクトでファイル連携ツールを使用していますが、AWSのサービスだけでも実現できると考えました。
今回の構築では、同一アカウント内の別バケットにレプリケーションすることを想定しています。今後別アカウントのS3バケットを対象にした構築も紹介する予定です。
■構築図
今回構築する仕組みは、ユーザーが送信元バケットにファイルをアップロードし、S3のレプリケーション機能を使って受信用別バケットに同じファイルを作成します。
受信用バケットにファイルが作成されたら、EventoBridgeに通知、ドキュメントを整形したあと、Amazon SNSを呼び出し、ユーザーにメールが来るシステムです。
S3からAmazon SNSに直で通知も可能ですが、届くドキュメントが読めたものではないです↓
せっかく通知するなら、内容がわかったほうがいいと思い、Event Bridgeの入力トランスフォーマーでドキュメントを整形し、読みやすくしてからAmazon SNSを呼び出す手順を選択しました。
【~構築の流れ~】
今回の構築の流れは以下の通りです。
- S3バケット作成
- IAMロール・ポリシー作成
- SNSトピック・サブスクリプション作成
- EventBridgeルール作成
- S3バケット設定変更
■S3バケット作成
まずはS3バケットを2つ作成します。送信元バケットと受信用バケットです。
↓Amazon S3のコンソール画面から、[バケット]を押し、[バケットを作成]をクリックします。
↓バケット名を入力し、他の設定は要件に合わせて選択し、[バケットを作成]をクリックしてください。作成が完了したら、もう一つ別名で作成しましょう。
↓
↓バケットを2つ作成できたか確認します。※画像を見てもらうとわかるのですが、originをorginと誤字っています。すいません。
↓両バケットにファイル共有用のフォルダを作成します。S3バケットをクリックし、[フォルダの作成]をクリックしてください。
↓フォルダ名を任意で入力し、[フォルダの作成]をクリックします。
↓
↓
両バケットに"shared"というフォルダを作成しました。
S3バケットの作成は以上です。
■IAMポリシー作成
送信元バケットが受信用バケットにレプリケーション機能でファイルを作成できるように、IAMポリシー・ロールを用意します。
IAMのコンソール画面で左のおナビゲーションペインから、[ポリシー]をクリックし、[ポリシーを作成]を押してください。
↓[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/*"
}
]
}
↓貼り付けが完了したら、[次のステップ:タグ]をクリックします。
↓タグは任意で入力し、[次のステップ:確認]を押します。
↓[名前]と[説明]を入力し、[ポリシーの作成]をクリックします。
IAMポリシーの作成は以上です。
■IAMロール作成
つぎは、先ほど作成したポリシーをアタッチするIAMロールを作成します。
IAMのコンソール画面で、左のナビゲーションペインから、[ロール]をクリックし、[ロールを作成]を押してください。
↓[信頼されたエンティティタイプ]で[カスタム信頼ポリシー]を選択します。
↓[カスタム信頼ポリシー]の項目で、以下のドキュメントを貼り付け、[次へ]をクリックします。
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service":"s3.amazonaws.com"
},
"Action":"sts:AssumeRole"
}
]
}
↓作成したIAMポリシーを検索し、☑を入れ、[次へ]を押します。
↓[ロール名]・[説明]を入力し、[ロールを作成]をクリックしてください。
↓
IAMロールの作成は以上です。
■SNSトピック作成
受信用バケットにファイルが作成されたことをメールで通知できるように、Amazon SNSトピックとサブスクリプションを作成します。
設定値は以下の通りです。
項目 | 設定値 |
---|---|
タイプ | スタンダード |
名前 | 任意 |
表示名 | File Replicate |
↓
↓入力が完了したら、[トピックの作成]を押します。
SNSトピックの作成は以上です。
■サブスクリプション作成
サブスクリプションを作成します。
設定値は以下の通りです。
項目 | 設定値 |
---|---|
トピックARN | 作成したトピック |
プロトコル | Eメール |
エンドポイント | 任意のメールアドレス |
作成したSNSトピックをクリックし、[サブスクリプション]タブから[サブスクリプションの作成]をクリックします。
↓設定値を入力し、[サブスクリプションの作成]を押します。
↓サブスクリプションを作成すると、登録したメールアドレスに確認メールが来ます。
↓メールを確認し、[Confirm subscription]をクリックしてください。
↓[Subscription confirmed!]と表示されれば完了です。
サブスクリプション作成は以上です。
■EventBridgeルール作成
つづいて、S3バケットからの通知を受けるEventBridgeルールを作成します。
設定値は以下の通りです。
項目 | 設定値 |
---|---|
タイプ | スタンダード |
名前 | 任意 |
説明 | 任意 |
イベントバス | default |
ルールタイプ | イベントパターンを持つルール |
Amazon EventBridgeのコンソール画面で、左のナビゲーションペインから、[ルール]をクリックします。
↓[ルールを作成]をクリックします。
↓設定値を入力し、[次へ]をクリックします。
↓[イベントソース]で[AWSイベントまたはEventBridgeパートナーイベント]を選択します。
↓[イベントタイプ]は[AWSイベント]を選択し、[サンプルイベント]ではS3の[Object Created]を選択します。
↓[メソッド]では[カスタムパターン]を選択します。
↓イベントパターンに以下のドキュメントを貼り付け、[次へ]をクリックしてください。ドキュメントの"name"や"prefix"は自身の環境に合わせてください。
{
"source": ["aws.s3"],
"detail-type": ["Object Created"],
"detail": {
"bucket": {
"name": ["受信用バケット名"]
},
"object": {
"key": [{
"prefix": "フォルダ名/"
}]
}
}
}
↓ターゲットの選択画面では、以下の設定値を入力してください。
項目 | 設定値 |
---|---|
ターゲットタイプ | AWS のサービス |
ターゲットを選択 | SNSトピック |
トピック | 作成したトピック |
↓[追加設定]で[ターゲット入力を設定]の[入力トランスフォーマー]を選択し、[入力トランスフォーマーを設定]をクリックしてください。
↓[サンプルイベントタイプ]は[AWSイベント]を選択し、[サンプルイベント]ではS3の[Object Created]を選択します。
↓
↓[入力パス]で以下のドキュメントを貼り付けてください。
{"backetName":"$.detail.bucket.name","eventTime":"$.time","fileName":"$.detail.object.key","fileSize":"$.detail.object.size","awsRegion":"$.region"}
↓[テンプレート]には以下のドキュメントを貼り付けてください。項目名は自分のわかりやすい名前に変更しましょう。
"バケット名:<backetName>に<fileName>が追加されました"
"AWS リージョン : <awsRegion> "
"発生時間 : <eventTime> "
"バケット名 : <backetName> "
"追加ファイル名 : <fileName>"
"ファイルサイズ : <fileSize>"
↓[出力を生成]をクリックしてみると、サンプルイベントから[入力パス]で定義された変数をテンプレート通りに出力してくれます。
↓[次へ]をクリックしてください。
↓内容に問題がなければ、[ルールの作成]をクリックします。
↓
Amazon EventBridgeルールの作成は以上です。
■S3バケット設定変更
構築最後の手順です。作成したS3バケットの設定を変更します。
設定は2つで、送信元バケットでレプリケーションの設定と、受信用バケットではEventBridgeへの通知を設定です。
■レプリケーション設定
まずは送信元バケットでレプリケーションの設定をお子います。設定値は以下の通りです。
項目 | 設定値 |
---|---|
レプリケーションルール名 | 任意 |
[Status (ステータス)] | Enabled (有効) |
ルールスコープを選択 | 1つ以上のフィルターを使用してこのルールのスコープを制限する |
プレフィックス | shared/ |
送信先 | このアカウントのバケットを選択する |
バケット名 | 受信用バケット名 |
IAMロール | 既存のIAMロールから選択 |
IAMロール | 作成したIAMロール |
↓送信元のバケットの[管理] タブをクリックし、[レプリケーションルール] までスクロールして、[レプリケーションルールを作成] を選択します。
↓
↓
↓[バケットのバージョニングを有効にする]をクリックします。
↓設定値を入力します。
↓
↓[バケットのバージョニングを有効にする]をクリックします。
↓
↓
↓作成したIAMロールを選択します。
↓要件がなければ、[保存]をクリックします。
↓新しく作成したバケットなのでファイルはありませんが、[いいえ、既存のオブジェクトをレプリケートしません。]を選択し、[送信]をクリックします。
■EventBridge通知設定
受信用バケットでEventBridge通知設定を行います。
↓受信用バケットをクリックし、[プロパティ]タブを押します。
↓[イベント通知]欄で[Amazon EventBridge]の[編集]をクリックします。
↓[オン]を選択し、[変更の保存]を押します。
↓
構築は以上です。
■動作確認
動作確認を行いましょう。
↓送信元バケットの[shared]というフォルダに適当なファイルをアップロードします。
↓
↓
↓
↓受信用バケットを見てみましょう。ファイルが確認できます。
↓登録したメールアドレスの受信トレイも確認してみましょう。
メールが届きましたね。
もしメールが届かない場合は、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/