この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コカコーラ大好き、カジです。
お客様よりFargateを検証環境で複数構築していて、夜間停止したいとご要望をもらいました。 その方法について調査しましたので、ご紹介します。
参考元
以下のブログが大変参考になりました。ありがとうございました。
【小ネタ】FargateのAutoScallingをスケジュールベースで動かす方法 - Qiita
上記ブログでは、1つのFargateのECSクラスタ、サービスの停止起動ですが、私の方で、複数Fargateに対応できるようLambdaを修正しました。 (私は、Python素人なので、社内のPython詳しいメンバーにも助けてもらいました。感謝)
構築するもの
以下の3つでできます。
- ECSのタスク起動数を変更するLambda
- 上記Lambda実行用のIAM Role
- 上記Lambdaを実行する(キックする)CloudWatch Events
前提条件
Fargateのタスクスケジューリングを行いたい場合は、こちらで構築できます。
Fargateの環境が、以下の2つあるとします。それぞれタスク数は1にしています。
そのタスク数を0にして停止します。ALBは停止(削除)しません。
以前のこちらのブログのCloudFormationを利用して、Fargateを複数構築しています。
sample-fargate-cluster、sample-fargate-service
sample-fargate2-cluster、sample-fargate2-service
ECSのタスク起動数を変更するLambdaの構築
初心者向けに、細かく説明しています。 Lambdaを知っている人は、コードと、Lambda用のIAM Role部分があれば十分だと思いますので、読み飛ばしてください。
では、Lamdbaのコンソールから構築します。関数名、Pythonを選び、実行ロールは新規作成します。
ECSのタスク起動数を変更するLambdaのFunctionコード
For文のFargateのクラスタ名、サービス名を適時書き換えて利用してください。
import boto3
from botocore.exceptions import ClientError
def lambda_handler(event, context):
try:
client = boto3.client('ecs')
for cluster_name, service_name in [('sample-fargate-cluster', 'sample-fargate-service'),
('sample-fargate2-cluster', 'sample-fargate2-service')]:
service_update_result = client.update_service(
cluster = cluster_name,
service = service_name,
desiredCount = 0 # ここの数を増減させる
)
print(service_update_result)
except ClientError as e:
print("exceptin: %s" % e)
ECSのタスク起動数を変更するLambda実行用のIAM Role修正
自動作成された、IAMロールを表示して、ECSを許可する設定を追加修正します。
ポリシーの編集をクリックします。
Lambda実行用のIAM Role
IAM Roleを修正します。
デフォルトで作成されるIAM RoleにECS許可部分を追加します。(削除して以下をコピーアンドペーストで上書きでOK)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:DescribeServices",
"ecs:UpdateService"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
反映されていることを確認します。
テスト実行
Fargateのタスク数が0になり、停止になるのでご注意ください。
テストを押して、テスト名を設定して保存します。
テストをクリックして実行します。正常に実行できると、このように表示されます。
詳細を確認するには、CloudWatch Logsのログも確認しましょう。
Fargateのタスク数が0になっていることをECSのコンソールで確認します。
LambdaのコードのdesiredCountを書き換えて保存し、再度実行するとその台数に戻ります。
定期実行するCloudwatch Eventsの作成
Lambdaのコンソールで、今回作成したLambda(fargate-stop)で、トリガー追加クリック
Cloudwatch Eventsを選んで、ルール名を設定しCron形式に実行したい時間を入力します。
あとは、実行時間に正常動作するか確認します。
最後に、もう一つ起動用のLambdaを作成
同様の手順で、起動用のLambdaを作成してください。
以上、どなたかのお役に立てれば光栄です。