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