You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于已定义的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栈后,按以下步骤手动启动任务:

  1. 进入AWS Systems Manager控制台,导航到文档 > 自动化,找到名为EcsOnDemandRunTask的文档。
  2. 点击执行,在参数栏的EnvironmentVariables中输入需要覆盖的环境变量(例如START_TIMESTAMP=2024-01-01T00:00:00,END_TIMESTAMP=2024-01-07T00:00:00)。
  3. 点击执行即可启动复用了定时任务所有配置的一次性Fargate任务。

关键注意事项

  • 确保assignPublicIp的配置与你的定时任务完全一致(如果任务通过NAT网关访问外部,需设为DISABLED)。
  • 如果任务定义包含多个容器,需修改containerOverrides中的name参数为对应容器的名称。
  • 验证SSM执行角色的权限,确保能正常调用ECS的RunTask接口。

内容的提问来源于stack exchange,提问作者Harm van den Brand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:11:14