AWS CDK以及如何更新ECS而不被卡住

问题描述

我有一个简单的CDK堆栈,用于通过ApplicationLoadBalancedEc2Servic部署docker容器。部署效果很好。但是当我升级时通过将docker容器设置为hasura/graphql-engine:v1.3.1-beta.1,更新将永久进行,最后输出如下:

12:23:01 | UPDATE_IN_PROGRESS   | AWS::CloudFormation::Stack
| HasuraStack
12:23:32 | UPDATE_IN_PROGRESS   | AWS::ECS::Service
| Hasura/Service/Service

我认为这与将CapacityCapacity和minCapacity设置为1有关。一旦我进入AWS控制台并将其手动设置为0,更新就可以工作了。我尝试了不同的minCapacity / maxCapacity / desiredCapacity配置,但没有成功。

最好的结果是让2个实例运行,旧实例缓慢消耗掉,新实例将所有新流量重定向到。有什么简单的方法可以实现相同目标并获得更新吗?短暂的停机时间也是可以接受的。

代码如下:

const cluster = new Cluster(this,'Cluster',{
  vpc: props.vpc,});

cluster.addCapacity('ASGroupCapacity',{
  instanceType: new InstanceType(props.instanceType || 't3.micro'),});

this.service = new ApplicationLoadBalancedEc2Service(this,'Hasura',{
  publicLoadBalancer: true,cluster,// assignPublicIp: props.hasuraServiceProps?.assignPublicIp || true,domainName: `${props.subDomain}.${props.zone.zoneName}`,domainZone: props.zone,protocol: ApplicationProtocol.HTTPS,memoryReservationMiB: 512,desiredCount: 1,taskImageOptions: {
    image: ContainerImage.fromregistry('hasura/graphql-engine:v1.3.0'),containerPort: 8080,environment: {
      HASURA_GRAPHQL_DATABASE_URL: props.connectionString,HASURA_GRAPHQL_ENABLE_TELEMETRY: 'true',HASURA_GRAPHQL_ENABLE_CONSOLE: 'true',HASURA_GRAPHQL_JWT_SECRET: `{"type": "HS256","key": "${this.jwtSecret.secretValue.toString()}"}`,},secrets: {
      HASURA_GRAPHQL_ADMIN_SECRET: Secret.fromSecretsManager(this.secret),});

解决方法

分享一下,我遇到了类似的情况。

对于群集容量,我设置了以下内容:

    cluster.addCapacity("my-scaling-group",{
      instanceType: ec2.InstanceType.of(
        ec2.InstanceClass.T3A,ec2.InstanceSize.SMALL
      ),minCapacity: 1,maxCapacity: 3
    });

我发现最重要的一点是与注销延迟有关,默认值为5分钟(= 300秒)。

service.targetGroup.setAttribute("deregistration_delay.timeout_seconds","30")

整个重新部署大约需要10分钟