インフラ

【CloudWatch Events】S3へのファイル配置をトリガーにECSタスクを実行する!【CloudTrail】

execute-ecs-triggered-by-s3

こんばんは!光です。

大手グローバル企業でWebエンジニアをやっています。

Webエンジニアを目指してプログラミングを勉強している初心者の方向けに情報を発信しています。

経歴や実績はこちら

システム開発のお仕事の依頼もお待ちしております。

お問い合わせページTwitterのDMからお気軽にお問い合わせください!

今回はこのような質問をいただきました。

S3にCSVが配置されたらECSでバッチを実行して取り込みたい!

今回はECSでバッチ処理を行う方法ですね。

定期実行でも良いのですが、無駄がないようにファイル配置をトリガーにしてみます。

メインはCloudWatch EventsとCloudTrailの設定になるので、その他はざっくりと解説します!

S3バケットを作成する!

特に設定は不要で任意の名前でバケットを作成します。

このS3バケットにCSVファイル配置することにします。

VPCとECSクラスターを用意しておく!

私は既存のVPCとECSクラスターを利用したので作成しなかったのですが、作成していない方は作成しておきましょう!

今回動かすバッチサーバー用のサブネットやセキュリティグループも必要になります。

RDSを使う場合はこのバッチサーバーからのアクセスを許可しておく必要がありますね。

ECSのタスク定義を作成する!

ECRにイメージをプッシュして、そのイメージをFargateで動かすためのタスク定義を作ります。

それほど難しくないので詳細はこちらの記事を参考にしていただければ良いと思います。

イメージは好きな言語で好きなように作ってもらえれば良いと思います。

S3にアクセスして特定のディレクトリ or 名前のファイルを取得して取り込む感じですね。

IAMロールを使ってS3にアクセスする場合はタスク定義で指定したタスクロールにS3へのアクセス権限を付与することを忘れずに!

CloudWatch Eventsでトリガーを作成する!

事前準備は完了したのでトリガーを作成しましょう!

CloudWatchのイベント→ルールからルールを作成します。

イベントソースは以下のように設定します。

イベントソース
  • イベントパターン
    • サービス名:S3
    • イベントタイプ:オブジェクトレベルのオペレーション
    • 特定のオペレーション:PutObject
    • 名前別の特定のバケット:作成したバケット(CSVが配置されるバケット)

次にターゲットの設定です。

ターゲット

基本的には作ったものを割り当てていきます。

特に指定がない項目は未入力で大丈夫です。

  • クラスター:作成したクラスター
  • タスク定義:作成したタスク定義
  • 起動タイプ:FARGATE
  • サブネット:作成したサブネット
  • セキュリティグループ:作成したセキュリティグループ
  • 自動割り当てパブリックIP:DISABLED
  • この特定のリソースに対して新しいロールを作成する:任意の名前

ここまで入力したら設定の詳細へと進み、ルールの名前と説明を入力して作成します。

直ぐに動作確認をする場合は有効化しておきましょう!

CloudTrailで証跡を作成する!

CloudWatch Eventsの設定までで動作すると思っていたのですが、CloudTrailの設定も必要でした。

対象のS3の証跡を作成しておきます。

CloudTrailの「証跡の作成」から作成します。

証跡の作成

証跡名を設定して対象のS3バケットを指定します。

証跡の設定

ログのプレフィックスはご自由に!

暗号化等の設定は不要なのですべてチェックを外しておきます。

次へ進み、イベントタイプはデータイベントを選択!

ログイベントの選択

「現在および将来のすべてのS3バケット」の読み取りと書き込みはチェックを外し、個々のバケットで対象のバケットを選択して書き込みにチェックを入れる。

データイベントの設定

特定のディレクトリを対象にしたい(特定のディレクトリにファイルが配置される)場合はプレフィックスを付与する。

例:sample-bucket/main

 確認して問題なければ作成!

動作確認!

これでS3へのファイル配置をトリガーにECSタスクを実行できると思います!

S3の指定したディレクトリにファイルを配置して、ECSタスクが実行される確認してみてください。

あとがき

今までは定期実行でファイルを取り込んでいたのですが、このほうが無駄がなくて良いですね。

サーバー料金もかからないし、即時で取り込めるしデメリットがない!

バッチ処理はECSと組み合わせてスマートに行いたいですね!