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

如何使用AWS CDK在现有ECS集群上运行Fargate任务

基于CDK实现ECS集群前置Fargate独立任务运行方案

核心实现逻辑

你可以直接在ECS集群的CDK栈内定义一次性Fargate任务,通过CDK的自定义资源触发任务运行,确保它在ECS服务栈部署之前执行完成,具体实现步骤如下:

  • 第一步:定义Fargate任务执行角色和任务定义
    提前配置任务所需的权限(比如拉取镜像、读写S3/参数存储来存放生成的构建文件和配置的权限),示例代码如下:

    import * as ecs from 'aws-cdk-lib/aws-ecs';
    import * as iam from 'aws-cdk-lib/aws-iam';
    
    // 任务执行角色
    const taskExecRole = new iam.Role(this, 'BuildTaskExecRole', {
      assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
      managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AmazonECSTaskExecutionRolePolicy')]
    });
    // 给角色附加配置存储/制品存储读写权限,*请根据你的实际需求调整资源范围*
    taskExecRole.addToPolicy(new iam.PolicyStatement({
      actions: ['s3:PutObject', 'ssm:PutParameter'],
      resources: ['你的S3桶ARN', '你的SSM参数ARN前缀']
    }));
    
    // 定义Fargate任务定义
    const buildTaskDef = new ecs.FargateTaskDefinition(this, 'BuildTaskDef', {
      executionRole: taskExecRole,
      taskRole: taskExecRole,
      cpu: 512,
      memoryLimitMiB: 1024
    });
    // 添加任务容器,镜像替换为你实际的构建任务镜像
    buildTaskDef.addContainer('BuildContainer', {
      image: ecs.ContainerImage.fromRegistry('你的构建镜像地址'),
      logging: ecs.LogDrivers.awsLogs({ streamPrefix: 'ecs-build-task' })
    });
    
  • 第二步:使用自定义资源触发任务在集群部署后、ECS服务部署前运行
    用AWS自定义资源调用ECS的RunTask API,同时设置依赖关系确保执行顺序:

    import * as cr from 'aws-cdk-lib/custom-resources';
    import * as ec2 from 'aws-cdk-lib/aws-ec2';
    
    // 假设你已经定义好了ECS集群和关联的VPC、私有子网、安全组
    declare const cluster: ecs.Cluster;
    declare const vpc: ec2.Vpc;
    declare const taskSecurityGroup: ec2.SecurityGroup;
    
    // 自定义资源触发任务运行
    const runBuildTask = new cr.AwsCustomResource(this, 'RunBuildTask', {
      onCreate: {
        service: 'ECS',
        action: 'runTask',
        parameters: {
          cluster: cluster.clusterName,
          taskDefinition: buildTaskDef.taskDefinitionArn,
          launchType: 'FARGATE',
          networkConfiguration: {
            awsvpcConfiguration: {
              subnets: vpc.privateSubnets.map(subnet => subnet.subnetId),
              securityGroups: [taskSecurityGroup.securityGroupId],
              assignPublicIp: 'DISABLED'
            }
          },
          count: 1
        },
        physicalResourceId: cr.PhysicalResourceId.of(`build-task-${Date.now()}`)
      },
      policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE })
    });
    
    // 给自定义资源附加任务运行权限
    runBuildTask.grantPrincipal.addToPolicy(new iam.PolicyStatement({
      actions: ['ecs:RunTask', 'iam:PassRole'],
      resources: [buildTaskDef.taskDefinitionArn, taskExecRole.roleArn]
    }));
    
    // 你的ECS服务定义,添加依赖确保任务跑完才部署服务
    const ecsService = new ecs.FargateService(this, 'AppService', {
      cluster: cluster,
      taskDefinition: yourAppTaskDef,
      // 其他服务配置
    });
    ecsService.node.addDependency(runBuildTask);
    
  • 可选补充:如果需要等待任务执行完成再往下部署,可以在自定义资源里增加轮询逻辑,调用describeTasks接口查询任务状态,直到任务返回SUCCEEDED状态再标记资源创建成功。

注意事项

  • 生成的构建文件和配置建议存放到S3或者SSM参数存储中,后续ECS服务启动的容器可以直接从对应的存储中拉取配置,避免本地存储的文件无法共享的问题
  • 可以根据构建任务的实际资源需求调整Fargate任务的CPU和内存配置
  • 如果需要每次部署都重新运行构建任务,可以修改自定义资源的physicalResourceId生成规则,保证每次部署都生成新的ID触发onCreate逻辑

内容的提问来源于stack exchange,提问作者Shazam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:57:03