CloudFormation yaml - 如何强制指定数字类型?

5

我正在尝试作为CloudFormation堆栈的一部分创建ECS任务定义。

到目前为止,我的任务定义如下...

  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转换为字符串,导致堆栈失败。

正确的定义方式是如何使其保持为数字?


1
无法通过CloudFormation YAML创建AWSECS服务。遇到了模型验证问题。 - Pat Myron
验证的完整错误信息是什么?#/ContainerDefinitions/0/MemoryReservation:expected type: Number,found: String 是唯一的验证错误吗?大多数情况下,这可能是由于类型不匹配造成的。例如,使用字符串表示映射或列表。 - Wenbing Li
您可以提供您的栈 ID(或电子邮件至 libruce@amazon.com),以便我帮助您查看根本原因。 - Wenbing Li
感谢@WenbingLi,我已经找到了根本原因。这是日志部分定义的问题。我只能通过首先移除MemoryReservation和PortMappings来找到它,这样它就不会错误地抱怨类型转换了。之后它显示了一个与问题实际相关的错误。 - user1751825
1个回答

9

事实证明,CloudFormation 报告的错误实际上与失败无关。以上代码完全没有问题。

在我的情况下,问题出在我定义模板中稍后出现的日志部分。

从中我们可以得到一个结论,那就是 CloudFormation 调试起来非常费解。如果你收到这样的错误,请不要认为它实际上导致了堆栈失败。

要找到实际问题,我首先必须删除导致类型转换错误的属性(MemoryReservation 和 PortMappings),然后它就显示了一个关于我定义日志部分的错误。修复该问题后,我能够重新添加其他属性,然后一切正常。

我现在怀疑,由于我的日志部分有误,整个 ContainerDefinitions 可能没有被正确解析,可能引起了这个具有误导性的类型不匹配错误。


1
对我来说,问题出在错误使用了DependsOn属性。我将其写在了Properties属性下面,而它应该与Properties处于同一级别。 - Samkit Jain
@SamkitJain 是的,缩进级别经常让我在CloudFormation中出错。通过经验教训,我已经学会了在发生奇怪错误时检查它。当将内容复制并粘贴到模板中时,缩进很容易混乱。 - user1751825

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接