Lambdaで定期的になんらかの処理を実行していて一部の処理をFargateタスクにてバッチ的に実行させたい場合、Fargateタスクの多重起動を防止したい時には以下のようなコードで簡単に制御できます。(ここではPythonを利用)
- 13-16行目: 実行中のFargateタスクを取得
- 19-23行目: 実行中のFargateタスクが1つでもあれば関数を抜ける
- 26-37行目: Fargateタスク起動
import os import boto3 clusterName = os.environ['CLUSTER_NAME'] taskName = os.environ['TASK_NAME'] subnets = os.environ['SUBNETS'].split(',') securityGroups = os.environ['SECURITY_GROUPS'].split(',') client = boto3.client('ecs') def lambda_handler(event, context): # check running task response = client.list_tasks( cluster=clusterName, desiredStatus='RUNNING' ) # if task is already running, then return if 'taskArns' in response: task_arns = response['taskArns'] if task_arns and (len(task_arns) > 0): print('-> Fargate task is already running.') return # run task response = client.run_task( cluster=clusterName, taskDefinition=taskName, launchType='FARGATE', networkConfiguration={ 'awsvpcConfiguration': { 'subnets': subnets, 'securityGroups': securityGroups, 'assignPublicIp': 'ENABLED' } } ) print('-> Fargate task started.') return