首页 > 解决方案 > 将 codedeploy 用于 Fargate 计划任务

问题描述

我正在尝试为我们的一个仅包含计划任务的应用程序设置 CI/CD 管道。似乎无法弄清楚这些建议的 CI/CD 工作流程。据我所知,所有在线文档和示例都与服务一起使用。

目前,我的任务配置为使用“最新”标签,但是,我希望能够在特定版本上运行它们,并且随着新版本的发布,使用命名版本。

如果这有所不同,我将使用 CDK 进行所有配置。

任何指针都非常感谢。

标签: scheduled-tasksamazon-ecsaws-cdkaws-fargate

解决方案


我认为构建、测试和部署到 ECR 或 Docker 的 CodePipeline 堆栈将负责 CI/CD 部分。就计划任务部分而言,也许这提供了一些启发:

public class MyWorkloadTaskStack extends Stack {

    public MyWorkloadTaskStack(@Nullable Construct scope, @Nullable String id, @Nullable StackProps props, @NotNull Cluster cluster) {
        super(scope, id, props);

        FargateTaskDefinition task = FargateTaskDefinition.Builder.create(this, "MyWorkloadTask")
                .memoryLimitMiB(1024)
                .cpu(256)
                .build();

        task.addContainer("Workload", ContainerDefinitionOptions.builder()
                .image(fromRegistry("zsquare/my-workload"))
                .logging(AwsLogDriver.Builder.create()
                        .logGroup(LogGroup.Builder.create(this, "LogGroup")
                                .logGroupName("MyWorkloadTaskLogGroup")
                                .removalPolicy(RETAIN)
                                .retention(ONE_MONTH)
                                .build())
                        .streamPrefix("MyWorkloadTask")
                        .build())
                .build());

        Rule rule = Rule.Builder.create(this, "MyWorkloadRule")
                .schedule(cron(CronOptions.builder()
                        .hour("11")
                        .minute("15")
                        .build()))
                .build();

        rule.addTarget(EcsTask.Builder.create()
                .cluster(cluster)
                .subnetSelection(SubnetSelection.builder()
                        .subnetType(PUBLIC)
                        .build())
                .taskDefinition(task)
                .taskCount(1)
                .containerOverrides(asList(ContainerOverride.builder()
                        .containerName("Workload")
                        .build()))
                .build());
    }

}

这将创建一个 EventBridge 规则,以在每天 11:15 UTC 运行名为“工作负载”的任务定义。没有创建正在运行的服务,只是一个启动、完成工作、然后优雅结束的任务。

它使用前缀“MyWorkloadTask”记录到 CloudWatch,以便于查找日志。

在此示例中,任务定义本身从 Docker 中提取,但指定 ECR 是微不足道的。它假设您已经在其他地方创建了一个集群,并将其作为参数传入这里。


推荐阅读