Ошибка проверки шаблона: Ошибка шаблона: неразрешенная зависимость условия BackupSize в Fn :: If - PullRequest
0 голосов
/ 05 февраля 2019

Я пишу код CF для запуска экземпляра ec2, вот как выглядит мой код:

Я сталкиваюсь с этими двумя проблемами:

1) Я получаю эту ошибку "Ошибка проверки шаблона: Ошибка шаблона: неразрешенная зависимость условия BackupSize в Fn :: If "

2) Я хочу присоединиться к имени параметра и из сопоставлений 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`  

Я ожидаю, что шаблонСоздайте резервный том, если я поместил какое-либо значение в параметр, и если я оставил значение резервного размера пустым, он не должен создавать этот диск.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019
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] 
0 голосов
/ 05 февраля 2019

Различные версии представленного шаблона имеют основные проблемы с форматированием.Последняя версия (прикрепленная к комментарию под этим ответом):

▶ 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, как я показал выше.

После устранения различных проблем в предоставленном шаблоне (включая новую версию) я не смог воспроизвести ошибку о

неразрешенная зависимость условия BackupSize в Fn :: If

То, что у вас есть в Fn :: If, выглядит нормально для меня.

Что касается того, как интерполировать Fn::Join вUserData:

  1. Я бы подумал о рефакторинге, чтобы сложная логика лежала за пределами Cloudformation.Например, вы можете передать имя хоста в качестве отдельного параметра.

  2. Если вы действительно хотите сделать это таким образом, вы можете сделать это следующим образом:

UserData:
  Fn::Base64: !Sub
    - |
      #!/bin/bash
      NEWHOSTNAME=${newhostname}
      hostname $NEW_HOSTNAME
      myshortname=`hostname -s`
    - newhostname: !Join ["", ["foo", "bar"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...