タダです.
定期イベントを CloudWatch Events で設定し,定型処理を実行する Lambda をキックすることはよくあることだと思います.今回 CloudWatch Events の定数を使って Lambda の処理を分岐させるのをやってみたのでこの記事にまとめていきます.今回は ECS タスクの数を調整する処理を作ってみました.
ECS のタスク数を調整する Lambda
Lambda のコードは以下のようなコードを書いてます.CloudWatch Events から desired_count
をパラメーターとして渡し,desired_count
が0ならコンテナをなくして,desired_count
を1ならコンテナを1台起動させます.
import json import boto3 import logging from botocore.exceptions import ClientError logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info("Update ECS Task Count") CLUSTER_NAME = 'cluster name' SERVICE_NAME = 'service name' desired_count = event['desired_count'] try: client = boto3.client('ecs') if desired_count == 0: result = client.update_service( cluster = 'cluster name', service = 'service name', desiredCount = desired_count ) return "Stop Complete." elif desired_count == 1: result = client.update_service( cluster = 'cluster name', service = 'service name', desiredCount = desired_count ) return "Start Complete." except ClientError as e: logger.exception("Exception.")
CloudWatch Events の定数
Lambda のコードで設定している desired_count
を定数で定義していきます.イベントのターゲットを指定する箇所で定数を {"desired_count": 0(1)}
と設定します.
コンテナを0台にするイベント
コンテナを1台にするイベント
関連情報
動作テスト
Lambda のテストイベントで次のような設定をして実行してみます.下記のテストでコンテナを起動できるか確認します.1台のコンテナ起動できました.
{ "desired_count": 1 }
次にコンテナをなくしてみます.意図通りコンテナを消せました.
{ "desired_count": 0 }
まとめ
CloudWatch Events の定数を使って ECS タスク数を Lambda 側で処理を分岐させました.この機能を知るまでは Lambda を処理ごとに作ってしまっていたので,管理する関数の数が少なくなるので良かったです.