node.js - AWS CDK 以及如何在不卡住的情况下更新 ECS
问题描述
我有一个简单的 CDK 堆栈来通过ApplicationLoadBalancedEc2Servic
. 部署效果很好。但是当我升级时,例如通过将 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
我认为这与将desiredCapacity 和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 分钟
推荐阅读
- r - 每次 r 启动时,它都会在 GUI 中读取此错误消息:错误:找不到函数“libPaths”
- javascript - 如何在两个客户端上从服务器接收数据
- javascript - 直接从服务器将 csv 文件上传到 aws s3 存储桶
- sql - GPG 加密在 SSMS 作业代理中失败并在 SSIS 中成功
- python-3.x - “FusedBatchNorm 的 CPU 实现目前仅支持 NHWC 张量格式。”
- prolog - 如何让 swi prolog 解释解决方案
- node.js - 在 NodeJS 中将频繁更改的 JavaScript 对象写入文件的最有效方法是什么?
- python-3.x - 在 Python 中从外部文件调用函数
- java - 线程没有在我的程序中按顺序打印
- c# - Selenium 等到两个元素之一可见