Go CDK中ECS TaskDefinition容器定义缺失StopTimeout属性的解决咨询
Go版AWS CDK ECS栈设置StopTimeout属性的解决方案
问题背景
用Go语言构建AWS CDK的ECS栈时,需要给容器配置StopTimeout属性,但TaskDefinition.AddContainer方法的ContainerDefinitionOptions参数里没有这个选项(Python版CDK却支持)。因为现有栈结构复杂,不想切换到CfnTaskDefinition重构,需要用简便的逃逸舱方案解决。
之前尝试把containerDefinition.Node().DefaultChild()转成CfnTaskDefinition_ContainerDefinitionProperty修改属性,但这个结构体是只读配置属性,无法直接生效。
解决方案
正确的做法是修改TaskDefinition对应的底层CloudFormation资源,直接更新容器定义中的StopTimeout属性:
代码示例
// 1. 正常创建容器定义 containerDefinition := taskDefinition.AddContainer(jsii.String(deploymentEnv+service.Tag+"ContainerDef"), &awsecs.ContainerDefinitionOptions{ Essential: jsii.Bool(true), Image: awsecs.AssetImage_FromEcrRepository(ecrRepository, aws.String("latest")), ContainerName: jsii.String(service.Name + "-" + deploymentEnv), MemoryReservationMiB: &service.MemoryReservation, PortMappings: &[]*awsecs.PortMapping{ &awsecs.PortMapping{ContainerPort: &service.ContainerPort}, }, Logging: awsecs.AwsLogDriver_AwsLogs(&awsecs.AwsLogDriverProps{ StreamPrefix: aws.String("ecs"+service.Name), LogGroup: cwLogGroup, }), }) // 2. 获取TaskDefinition对应的底层CloudFormation对象 cfnTaskDef := taskDefinition.Node().DefaultChild().(awsecs.CfnTaskDefinition) // 3. 遍历容器定义列表,定位目标容器并设置StopTimeout(单位:秒) for _, container := range cfnTaskDef.ContainerDefinitions { if *container.ContainerName == *containerDefinition.ContainerName { container.StopTimeout = aws.Int(699) break } }
说明
- Go版CDK高层API暂未覆盖
StopTimeout属性,属于SDK的功能缺口,需通过逃逸舱操作底层CloudFormation资源补全配置。 CfnTaskDefinition的ContainerDefinitions是可修改的容器配置数组,直接修改目标容器的StopTimeout字段即可生效。StopTimeout单位为秒,类型是整数,需用aws.Int()传入值,不能用浮点数。
内容的提问来源于stack exchange,提问作者Trevor Griffiths
相关产品推荐
相关产品推荐

