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