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 将保留天数设置为日志流

如何将参数传递给 CloudFormation YAML 中的 Glue 作业?

AWS Cloudformation-如何在 json/yaml 模板中处理字符串大写或小写