CloudFormation yaml - 如何强制数字类型?
Posted
技术标签:
【中文标题】CloudFormation yaml - 如何强制数字类型?【英文标题】:CloudFormation yaml - How to force number type? 【发布时间】:2021-01-27 08:43:44 【问题描述】:我正在尝试创建一个 ECS 任务定义作为 CloudFormation 堆栈的一部分。
到目前为止,我的任务定义如下所示...
TaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
RequiresCompatibilities:
- EC2
ExecutionRoleArn: !Ref MyTaskRole
ContainerDefinitions:
- Name: !Ref ServiceName
Image: amazon/amazon-ecs-sample
PortMappings:
- ContainerPort: 3000
HostPort: 0
Protocol: tcp
MemoryReservation: 128
当我尝试运行它时,我收到以下错误...
#/ContainerDefinitions/0/MemoryReservation: expected type: Number, found: String
看来CloudFormation是在将128转成字符串,然后栈失败了。
定义此值以使其保持数字的正确方法是什么?
【问题讨论】:
类似于***.com/questions/64246726/… 验证的完整错误信息是什么?#/ContainerDefinitions/0/MemoryReservation: expected type: Number, found: String
是唯一的验证错误吗?主要是由于类型不匹配。例如使用字符串作为地图或列表。
您可以提供您的堆栈 ID(或发送电子邮件至 (libruce AT amazon.com)),以便我帮助您找出根本原因。
感谢@WenbingLi 我实际上找到了根本原因。这是日志记录部分定义的问题。我只能通过首先删除 MemoryReservation 和 PortMappings 才能找到它,因此它不会错误地抱怨类型转换。之后,它显示了一个与问题实际相关的错误。
【参考方案1】:
事实证明,CloudFormation 报告的错误实际上与失败无关。上面的代码非常好。
就我而言,问题在于我定义稍后出现在模板中的日志记录部分的方式。
从中得出的结论是,CloudFormation 调试起来非常混乱,如果您收到这样的错误,请不要认为它实际上是导致堆栈失败的原因。
要找到实际问题,我必须首先删除导致类型转换错误的属性 MemoryReservation 和 PortMappings,然后它显示了关于我定义日志记录部分的方式的错误。修复该故障后,我能够重新添加其他属性,并且效果很好。
我现在怀疑由于我的日志记录部分不正确,整个 ContainerDefinitions 可能没有被正确解析,可能导致误导性类型不匹配错误。
【讨论】:
对我来说,原因是错误地使用了DependsOn 属性。我在Properties
属性下编写了它,而它应该与Properties
处于同一级别。
@SamkitJain 是的,缩进级别经常让我对 CloudFormation 感到困惑。我从经验中学到了在发生奇怪错误时检查它。复制和粘贴到模板时,缩进很容易搞砸。以上是关于CloudFormation yaml - 如何强制数字类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 cloudformation yaml 中配置路由规则?
如何调试cloudformation模板?策略中的语法错误。 YAML 文件
如何在 AWS CloudFormation YAML 模板中转义策略变量
如何使用 cloudformation 或 yaml 将保留天数设置为日志流