Ссылка не разрешается в пользовательских данных при формировании облаков - PullRequest
0 голосов
/ 04 июня 2019

Я создаю том EFS в облачной среде и пытаюсь сослаться на это в пользовательских данных шаблона запуска.

Я пробовал несколько синтаксисов использования Ref в CF, но каждый раз получал одну и ту же ошибку.Я действительно хочу делать разные вещи с EFS, но публикую пример кода, который также не работает

  ClusterFileSystem:
    Type: AWS::EFS::FileSystem
    Properties:
      Encrypted: true

ClusterLaunchTemplate:
  Type: AWS::EC2::LaunchTemplate
  DependsOn: ClusterFileSystem
  Properties:
    LaunchTemplateName: !Sub ${AWS::StackName}
    LaunchTemplateData:
      ImageId: !Ref 'AMIId'
      SecurityGroupIds: [!GetAtt 'ClusterSecurityGroup.GroupId']
      InstanceType: !Ref 'InstanceType'
      BlockDeviceMappings:
      - DeviceName: "/dev/xvda"
        Ebs:
          VolumeSize: "40"
          VolumeType: "gp2"
          Encrypted: true
      - DeviceName: "/dev/xvdcz"
        Ebs:
          VolumeSize: "22"
          VolumeType: "gp2"
          Encrypted: true
      IamInstanceProfile:
        Name: 'ECSHostInstanceProfile'
      Monitoring:
        Enabled: true
      KeyName: !Ref 'Key'
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe

          function setup-efs () {

            {
              mkdir -p /ecs-resources/${AWS::StackName}/environment
              EFS_FILE_SYSTEM_ID= !Ref ClusterFileSystem
              echo ${EFS_FILE_SYSTEM_ID} >> /tmp/xyz.txt
            }

Это ошибка, которую я получаю -

Ошибка формата шаблона: неразрешенные зависимости ресурса [EFS_FILE_SYSTEM_ID]в блоке ресурсов шаблона Произошла ошибка (ValidationError) при вызове операции UpdateStack: Ошибка формата шаблона: неразрешенные зависимости ресурса [EFS_FILE_SYSTEM_ID] в блоке ресурсов шаблона - "

1 Ответ

4 голосов
/ 04 июня 2019

Вам не нужно использовать !Ref внутри !Sub, чтобы получить такое же поведение, вы можете просто ссылаться на логический идентификатор внутри ${}.

Кроме того, вам нужно экранировать ${EFS_FILE_SYSTEM_ID}, поскольку вы хотите напечатать его буквально, а не !Sub анализировать его.

UserData:
  Fn::Base64: !Sub |
    #!/bin/bash -xe

    function setup-efs () {

      {
        mkdir -p /ecs-resources/${AWS::StackName}/environment
        EFS_FILE_SYSTEM_ID= ${ClusterFileSystem}
        echo ${!EFS_FILE_SYSTEM_ID} >> /tmp/xyz.txt
      }

Обратите внимание на ссылку ${ClusterFileSystem} и ! внутри фигурных скобок для EFS_FILE_SYSTEM_ID.

Если вы укажете имена параметров шаблона или логические идентификаторы ресурса, такие как $ {InstanceTypeParameter}, AWS CloudFormation вернет те же значения, что и при использовании встроенной функции Ref. Если вы укажете атрибуты ресурса, такие как $ {MyInstance.PublicIp}, AWS CloudFormation вернет те же значения, что и при использовании встроенной функции Fn :: GetAtt.

И

Чтобы буквально написать знак доллара и фигурные скобки ($ {}), добавьте восклицательный знак (!) После открытой фигурной скобки, например, $ {! Literal}. AWS CloudFormation разрешает этот текст как $ {Literal}.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html

...