AWS内でECSサービスを簡単にスケジュールする方法(開始/停止)

これは素晴らしいAWS社員(Alfredo J)に大いに基づいている私の解決策です。

この記事を読んでいるとしたら、AWSでは回避策なしには不可能なことを知っているかもしれません。スケジュールされたタスクや複雑なソリューションを考えているかもしれませんが、しばらくすると、メキシコのAlfredoが私をサポートして、この解決策を皆さんに提供しました。

まず、次の設定でJSONオプションを使ってポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecs:DescribeServices",
                "ecs:UpdateService"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

これはservicesschedulerと呼ばれることがあります。

ポリシーが作成されたら、新しいポリシー(servicesscheduler) を使ってIAMロールを作成する必要があります。これはECSSchedulerと呼ばれることができます。

次に、新しいIAMロール ECSSchedulerを使用して実行されるLambda関数を作成する必要があります。関数が作成されたら、このPython(3.8)スクリプトを追加します:

import json
import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

client = boto3.client('ecs')

def lambda_handler(event, context):
    cluster = event["cluster"]
    service_names = event["service_names"]
    service_desired_count = int(event["service_desired_count"])

    for service_name in service_names.split(","):
        response = client.update_service(
            cluster=cluster,
            service=service_name,
            desiredCount=service_desired_count
            )

        logger.info("Updated {0} service in {1} cluster with desire count set to {2} tasks".format(service_name, cluster, service_desired_count))

    return {
        'statusCode': 200,
        'new_desired_count': service_desired_count
    }

スクリプトは、JSON形式で次の変数を期待しています:

{
  "cluster": "clusterName",
  "service_names": "service1,service2",
  "service_desired_count": "0"
}

ここで:

  • clusterは変更したいクラスターの名前です。
  • service_namesはサービスのコレクション用の配列です。
  • service_desired_countは希望のサービス数です。0はサービス/サービスの停止、任意の他の数値はサービス/サービスの開始です。

すべてが作成された後、Amazon EventBridge(以前はCloudWatchイベント)でいくつかのルールを作成する必要があります。ここで、期待するスケジュールに基づいてトリガーしたいイベントを定義します。これが一例です:

aws example

何かが失敗した場合は、作成されたIAMロールに必要なポリシー(例えば ecs:UpdateService)があることをログから確認する必要があります。

タグを使用してより効率的にすることはできますか?はい、可能です。私はブログでこの代替アプローチに焦点を当てた異なるバージョンを書きました。

フォローしてください:

sponsor me

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/fanmixco/workaround-to-schedule-aws-ecs-services-4m6b