AWS CDK Init 容器依赖与 Fargate 模式

AWS CDK Init Container dependency with Fargate Pattern

我正在尝试使用 CDK 来定义一个 ApplicationLoadBalancedFargateService,如下所示:

const cluster = new ecs.Cluster(this, 'Cluster', { vpc });
const loadBalancedService = new ecs_patterns.ApplicationLoadBalancedFargateService(this, "FargateService", {
      cluster,
      taskImageOptions: {
        image: ecs.ContainerImage.fromRegistry("public.ecr.aws/XXXXXXXX/my-node-app:latest"),
        environment: {
          DATABASE_HOST: rdsCluster.attrEndpointAddress,
          DATABASE_NAME: databaseName,
          DATABASE_USERNAME: databaseCredentialsSecret.secretValueFromJson('username').toString(),
          DATABASE_PASSWORD: databaseCredentialsSecret.secretValueFromJson('password').toString(),
        }
      },
    });

我之前已经在应用程序中创建了一个 RDS 集群。在启动此 Fargate 服务之前,我想 运行 一个初始化容器,但我不太确定如何。我知道 aws-ecs 构造中有一个 ContainerDependency,但我认为我不能在这里应用它。

ECS 容器 can have dependencies. In the CDK, you can add a dependency to a ContainerDefinition construct using its addContainerDependencies 方法。

当您使用 L3 ecs_patterns.ApplicationLoadBalancedFargateService 构造时,您的第一步是通过任务定义的 defaultContainer 属性 获取对基础服务 ContainerDefinition 的引用:

const serviceContainer: : ecs.ContainerDefinition | undefined = loadBalancedService.taskDefinition.defaultContainer;
if (!serviceContainer) throw new Error('LB Service default container must be defined!');

然后将init容器添加到任务定义中:

const initContainer = loadBalancedService.taskDefinition.addContainer('init', {
  image: ecs.ContainerImage.fromRegistry('init/my-image'),
  essential: false,
});

最后,创建具有 SUCCESS 条件的依赖项。 condition 在允许其他容器启动之前验证依赖容器运行完成(并以 0 退出):

serviceContainer.addContainerDependencies({
  container: initContainer,
  condition: ecs.ContainerDependencyCondition.SUCCESS,
});