はじめに
先日、EC2で稼働中のWebサイトで特定の処理が走った際に、ECSタスクを起動してバッチ処理を実行させたいという要件がありました。
この要件をAWS SDKを利用して実装しましたので、そこで得た知見をまとめた記事になります。
本記事は私の備忘録としての意味合いも込めて記録しておきます。
AWS SDKとは
前提として、AWS SDKとは何か。
端的に言うと「AWSサービスをコードで操作するためのツール」です。
詳細については以下を参照ください。
👉 https://aws.amazon.com/jp/what-is/sdk/
やりたいこと
EC2でのスクリプト実行をトリガーにAWS SDKを利用してECSタスクを起動します。
処理の流れは以下の通りです。
EC2(AWS SDK) → EventBridge → ECSタスク
EC2からAWS SDKを利用してEventBridgeに対してイベントを発行し、EventBrdigeルールをトリガーにバッチ用ECSタスクを起動します。
※EC2からAWS SDKを利用して直接ECSタスクを起動する方法もありますが、今回は疎結合性を重視しEventBridgeを挟んでいます。
前提
- ECSクラスター、タスク定義、ECRイメージは準備済み
- EC2は作成済み(Amazon Linux 2023)
手順
1. EC2にEventBridgeを起動する権限を付与
EventBridgeのイベントバスに対してイベントを発行する権限を持ったIAMポリシーを作成し、EC2のIAMロールにアタッチします。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "events:PutEvents", "Resource": "*" } ] }
2. EC2にAWS SDK実行に必要なツールをインストール
sudo yum install -y python3-pip # pipがない場合 pip3 install boto3
3. EventBridgeにイベントを発行するスクリプトを作成
vi send_event.py
スクリプトの中身は以下
※以下はAWS SDK(Boto3)を使って、EventBridge にカスタムイベントを送信するだけのコードです。
import boto3 # AWS SDK for Python(=Boto3)をインポート import json client = boto3.client('events', region_name='ap-northeast-1') # 東京リージョン response = client.put_events( Entries=[ { 'Source': ‘test.batch', 'DetailType': ‘BatchProcessingTriggered', 'Detail': json.dumps({ 'message': ’Test batch process started.' }), 'EventBusName': 'default' # カスタム EventBus を使ってるならここを変更 } ] ) print("Event response:", response)
※「Source」「DetailType」「Detail」は何でもいいので用途に合わせた命名にします。
スクリプトに実行権限を付与します。
chmod 755 send_event.py
4.EventBeridgeルール作成
以下内容でイベントパターンを設定します。
sourceだけでも起動しますが、今回はdetail-typeでもフィルタリングしています。
{ "source": [“test.batch"], "detail-type": [“BatchProcessingTriggered"] }
後はターゲットの選択画面で「ECSタスク」を選択し、事前に用意したECSクラスターやタスク定義を指定してルールを作成します。
ここまで準備ができたらEC2から以下コマンドでスクリプトを実行します。
python3 send_event.py
ECSコンソールからクラスターを確認し、バッチ用のタスクが正常に起動していれば完了です。
おわりに
今回はAWS SDK(Boto3)を利用してECSタスクを起動する方法についてまとめました。S3へのオブジェクトPUTなど、他AWSサービスをトリガーとしたものではなく、
プログラムの処理をトリガーにECSタスクを起動させる際に活用できる仕組みです。
この記事が同様の構成を検討している方の参考になれば幸いです。