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イベント)でいくつかのルールを作成する必要があります。ここで、期待するスケジュールに基づいてトリガーしたいイベントを定義します。これが一例です:
何かが失敗した場合は、作成されたIAMロールに必要なポリシー(例えば ecs:UpdateService
)があることをログから確認する必要があります。
タグを使用してより効率的にすることはできますか?はい、可能です。私はブログでこの代替アプローチに焦点を当てた異なるバージョンを書きました。
フォローしてください:
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/fanmixco/workaround-to-schedule-aws-ecs-services-4m6b