【问题标题】:Template validation error: Template error: unresolved condition dependency BackupSize in Fn::If模板验证错误:模板错误:Fn::If 中未解决的条件依赖 BackupSize
【发布时间】:2021-07-12 04:45:19
【问题描述】:

我正在编写 CF 代码来启动 ec2 实例,这就是我的代码的样子:

我面临这两个问题:

1) 我收到此错误“模板验证错误:模板错误:Fn::If 中未解决的条件依赖 BackupSize”

2) 我想加入 Parameter Name 和 Mappings USERDATA。 (剩余的 userdata 工作正常,但这个连接不起作用,只是将相同的代码放在 userdata 中。

谁能帮帮我?

AWSTemplateFormatVersion: "2010-09-09"  
Description: "This template should be used to deploy ONLY test servers"  

Mappings:  

    Regions:  
    us-east-1:  
           "AMI": "ami-x"  
           "VPC": "vpc-x"  
           "SUBNET": "subnet-x"  
           "USERDATA": ".example.com"  
           "SHARE": "server1:/share"  
           "SecurityGroups": "sg-x"  
           "SecurityGroups2": "sg-y"  

Parameters:  

      ApplSize:  
      Description: "Please enter application vol. size"  
      Type: "String"  
      BackupSize:  
      Description: "Please enter backup vol. size"  
      Type: "String"  


Resources:  

      EC2Instance:  
      Type: "AWS::EC2::Instance"  
      Properties:  
            ImageId: !FindInMap [Regions, !Ref "AWS::Region", AMI]  
            InstanceType: !Ref InstanceType  
            SubnetId: !FindInMap [Regions, !Ref "AWS::Region", SUBNET]  
            SecurityGroupIds:  
                - !FindInMap [Regions, !Ref "AWS::Region", SecurityGroups]  
                - !FindInMap [Regions, !Ref "AWS::Region", SecurityGroups2]  
            BlockDeviceMappings:  
                -   
                 DeviceName : "/dev/sda1"  
                 Ebs:  
                    VolumeSize: "20"  
                    VolumeType: gp2  
                -  
                 DeviceName : "/dev/sde"  
                 Ebs:  
                    VolumeSize: !Ref ApplSize  
                    VolumeType: gp2  
                -  
                 DeviceName : "/dev/sdc"  
                 Ebs:  
                    VolumeSize: "5"  
                    VolumeType: gp2  

                - Fn::If:  
                   - BackupSize  
                   -   
                     DeviceName : "/dev/sdg"  
                     Ebs:  
                       VolumeSize: !Ref BackupSize  
                       VolumeType: gp2  
                   - !Ref "AWS::NoValue"  

      UserData:   
              Fn::Base64: !Sub |  
                #!/bin/bash  
                NEW_HOSTNAME=Fn::Join: [ " ", [ !Ref Name, Fn::FindInMap: 
                                    [Regions, !Ref "AWS::Region", USERDATA] ] ]  
                hostname $NEW_HOSTNAME  
                myshortname=`hostname -s`  

如果我在参数中输入任何值,我希望模板创建备份卷,如果我将备份大小值留空,它不应该创建这个磁盘。

【问题讨论】:

  • 您必须提供格式正确的实际模板(必须是有效的 YAML),因为我无法重现您所看到的内容。
  • 这里:ufile.io/2liuv
  • 好的,我同意您在该文件中的模板与上述模板相同。而且,正如我所说,这是一个无效的模板。缩进到处都是错误的。你需要给我们真正的产生Template validation error: Template error: unresolved condition dependency BackupSize in Fn::If
  • 修复缩进问题后,模板生成Unresolved resource dependencies [InstanceType] in the Resources block of the template

标签: amazon-cloudformation


【解决方案1】:
AWSTemplateFormatVersion: "2010-09-09"  
Description: "This template should be used to deploy ONLY test servers"  

Mappings:  

    Regions:  
    us-east-1:  
           "AMI": "ami-x"  
           "VPC": "vpc-x"  
           "SUBNET": "subnet-x"  
           "USERDATA": ".example.com"  
           "SHARE": "server1:/share"  
           "SecurityGroups": "sg-x"  
           "SecurityGroups2": "sg-y"  

Parameters:  

      ApplSize:  
        Description: "Please enter application vol. size"  
        Type: "String"  
      BackupSize:
        Description: "Please enter backup vol. size"
        Type: "String"
      VaultSize:
        Description: "Please enter secret vol. size"
        Type: "String"
      InstanceType:
        Description: "Please select the instance type"
        Type: "String"
      Name:
        Description: "Please mention server name"
        Type: "String"
      CustomerName:
        Description: "Please mention customer name"
        Type: "String"
      Url:
        Description: "Please mention url without the domain name"
        Type: "String"


Conditions:
    BackupVol: !Equals [!Ref BackupSize, ""]


Resources:  

      EC2Instance:  
      Type: "AWS::EC2::Instance"  
      Properties:  
            ImageId: !FindInMap [Regions, !Ref "AWS::Region", AMI]  
            InstanceType: !Ref InstanceType  
            SubnetId: !FindInMap [Regions, !Ref "AWS::Region", SUBNET]  
            SecurityGroupIds:  
                - !FindInMap [Regions, !Ref "AWS::Region", SecurityGroups]  
                - !FindInMap [Regions, !Ref "AWS::Region", SecurityGroups2]  
            BlockDeviceMappings:  
                -   
                 DeviceName : "/dev/sda1"  
                 Ebs:  
                    VolumeSize: "20"  
                    VolumeType: gp2  
                -  
                 DeviceName : "/dev/sde"  
                 Ebs:  
                    VolumeSize: !Ref ApplSize  
                    VolumeType: gp2  
                -  
                 DeviceName : "/dev/sdc"  
                 Ebs:  
                    VolumeSize: "5"  
                    VolumeType: gp2  

               - Fn::If:
                   - BackupVol
                   - !Ref "AWS::NoValue"
                   - DeviceName : "/dev/sdg"
                     Ebs:
                       VolumeSize: !Ref BackupSize
                       VolumeType: gp2  

      UserData: 
              Fn::Base64: !Sub
               - |+
                  #!/bin/bash -xe
                  NEW_HOSTNAME=${test}
               - test: 
                    Fn::FindInMap: [Regions, !Ref "AWS::Region", Name] 

【讨论】:

  • 这也是一个无效的模板。如果您通过 Linked In 与我联系,我将帮助您了解为什么您在此处粘贴的模板无效。
【解决方案2】:

呈现的各种版本的模板都有基本的格式问题。最新版本(附在此答案下方的评论中):

▶ aws cloudformation validate-template --template-body file://cloudformation.yml 
An error occurred (ValidationError) when calling the ValidateTemplate operation: [/Mappings/Regions] 'null' values are not allowed in templates

格式问题包括重复键、不正确的缩进等。这些问题不能通过简单地检查文件是否为有效的 YAML 来检测。它可以是有效的 YAML,但对于 Cloudformation 仍然无效。您需要使用上面显示的validate-template 命令。

修复提供的模板中的各种问题(包括新版本)后,我无法重现有关的错误

Fn::If 中未解决的条件依赖 BackupSize

你在 Fn::If 中的内容在我看来没问题。

至于如何在UserData中插入Fn::Join

  1. 我会考虑重构,以便复杂逻辑位于 Cloudformation 之外。例如,您可以将主机名作为单独的参数传递。

  2. 如果你真的想这样做,你可以这样做:

UserData:
  Fn::Base64: !Sub
    - |
      #!/bin/bash
      NEWHOSTNAME=${newhostname}
      hostname $NEW_HOSTNAME
      myshortname=`hostname -s`
    - newhostname: !Join ["", ["foo", "bar"]]

【讨论】:

  • 我有 100 行 bash 代码,我必须在所有行周围加上引号吗?但是那个依赖问题呢?我也上传了具有实例类型的代码,下面是它的链接。 ufile.io/bwoti
  • 我将使用第1点作为解决方案,忘记之前的回复,我已经再次发布了所有细节的代码,希望对您有所帮助
  • 兄弟,非常感谢您的帮助。我设法用 If 条件解决了这个问题,现在我正在尝试处理那个 UserData 部分。很快就会上传代码
  • 我也弄清楚了 UserData 部分,我在上面编辑了正确的代码现在唯一的挑战是如何添加除 url 之外的另一个变量,我想这是开发人员会知道的事情
【解决方案3】:

简单的ans..IF的第一个条件应该是CONDITIONS..创建一个条件块并在IF中使用它......示例:

条件: 我的条件:等等等等

IF [mycondition: blah1, blah2]

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2019-04-26
    • 2015-06-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多