検証環境のFargateのタスクを定期停止・定期起動してみた #Fargate

お客様よりFargateを検証環境で複数構築していて、夜間停止したいとご要望をもらいました。 その方法について調査しましたので、ご紹介します。
2019.11.28

コカコーラ大好き、カジです。

お客様より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を作成してください。

以上、どなたかのお役に立てれば光栄です。