如何基于已定义的AWS定时Fargate任务创建可按需启动的一次性任务?
实现可复用配置的按需Fargate一次性任务(基于Python CDK)
完全可以实现复用现有定时任务配置、支持环境变量覆盖且能从AWS控制台手动触发的一次性任务。核心思路是通过AWS Systems Manager(SSM)自动化文档预设所有复用的配置(VPC、子网、安全组、任务定义),仅留环境变量作为可输入参数,用户只需在控制台执行文档即可启动任务,无需重复填写固定配置。
具体实现步骤
1. 复用现有资源
假设你已经通过CDK定义了以下定时任务相关资源:
task_definition: ECS任务定义(ecs.TaskDefinition)vpc: 任务运行的VPC(ec2.Vpc)subnet_selection: 定时任务使用的子网选择规则(ec2.SubnetSelection)security_group: 任务关联的安全组(ec2.SecurityGroup)ecs_cluster: 任务所属的ECS集群(ecs.Cluster)
2. CDK代码实现SSM自动化文档
以下代码会创建一个SSM自动化文档,预设所有复用配置,并支持传入自定义环境变量:
from aws_cdk import ( aws_ssm as ssm, aws_ecs as ecs, aws_iam as iam, aws_ec2 as ec2, Stack ) class EcsOnDemandTaskStack(Stack): def __init__(self, scope, construct_id, task_definition: ecs.TaskDefinition, vpc: ec2.Vpc, subnet_selection: ec2.SubnetSelection, security_group: ec2.SecurityGroup, **kwargs): super().__init__(scope, construct_id, **kwargs) # 创建SSM文档的执行角色 ssm_exec_role = iam.Role( self, "SSMECSRunTaskExecutionRole", assumed_by=iam.ServicePrincipal("ssm.amazonaws.com"), managed_policies=[ iam.ManagedPolicy.from_aws_managed_policy_name("AmazonEC2ContainerServiceforEC2Role"), iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSSMAutomationRole") ] ) # 添加上ecs:RunTask权限,限定到目标任务定义和集群 ssm_exec_role.add_to_policy(iam.PolicyStatement( actions=["ecs:RunTask"], resources=[task_definition.task_definition_arn], conditions={ "ArnEquals": { "ecs:cluster": task_definition.cluster.cluster_arn } } )) # 定义SSM自动化文档内容 automation_doc_content = { "schemaVersion": "0.3", "description": "复用定时任务配置,按需启动Fargate任务(支持覆盖环境变量)", "parameters": { "EnvironmentVariables": { "type": "StringList", "description": "需要覆盖的环境变量,格式为 KEY=VALUE,KEY2=VALUE2", "default": [] } }, "mainSteps": [ { "name": "LaunchFargateTask", "action": "aws:executeAwsApi", "inputs": { "Service": "ecs", "Api": "RunTask", "cluster": task_definition.cluster.cluster_name, "taskDefinition": task_definition.task_definition_arn, "launchType": "FARGATE", "networkConfiguration": { "awsvpcConfiguration": { "subnets": [subnet.subnet_id for subnet in vpc.select_subnets(subnet_selection).subnets], "securityGroups": [security_group.security_group_id], "assignPublicIp": "ENABLED" # 与你的定时任务配置保持一致,按需调整为DISABLED } }, "overrides": { "containerOverrides": [ { "name": task_definition.default_container.container_name, "environment": [ {"name": kv.split("=")[0], "value": kv.split("=")[1]} for kv in "{{ EnvironmentVariables }}" ] } ] } }, "outputs": [ { "name": "TaskARN", "selector": "$.tasks[0].taskArn" } ] } ] } # 创建SSM自动化文档 ssm.Document( self, "EcsOnDemandRunTaskDoc", document_type=ssm.DocumentType.AUTOMATION, content=automation_doc_content, document_name="EcsOnDemandRunTask" )
3. 控制台触发方式
部署上述CDK栈后,按以下步骤手动启动任务:
- 进入AWS Systems Manager控制台,导航到文档 > 自动化,找到名为
EcsOnDemandRunTask的文档。 - 点击执行,在参数栏的
EnvironmentVariables中输入需要覆盖的环境变量(例如START_TIMESTAMP=2024-01-01T00:00:00,END_TIMESTAMP=2024-01-07T00:00:00)。 - 点击执行即可启动复用了定时任务所有配置的一次性Fargate任务。
关键注意事项
- 确保
assignPublicIp的配置与你的定时任务完全一致(如果任务通过NAT网关访问外部,需设为DISABLED)。 - 如果任务定义包含多个容器,需修改
containerOverrides中的name参数为对应容器的名称。 - 验证SSM执行角色的权限,确保能正常调用ECS的
RunTask接口。
内容的提问来源于stack exchange,提问作者Harm van den Brand
相关产品推荐
相关产品推荐

