如何使用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
相关产品推荐
相关产品推荐

