引用未在云形成的用户数据中解析

时间:2019-06-04 07:20:48

标签: amazon-web-services amazon-cloudformation amazon-efs

我正在以云的形式创建一个EFS卷,并尝试在启动模板的用户数据中引用它。

我尝试了在CF中使用Ref的多种语法,但每次都会遇到相同的错误。 我实际上想用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
            }

这是越来越错误-

模板格式错误:模板的Resources块中未解决的资源依赖项[EFS_FILE_SYSTEM_ID]调用UpdateStack操作时发生错误(ValidationError):模板格式错误:模板Resources块中的未解决资源依赖项[EFS_FILE_SYSTEM_ID]- “

1 个答案:

答案 0 :(得分:4)

您不需要在!Ref内使用!Sub,而要获得相同的行为,您只需引用${}内的逻辑ID即可。

另外,您需要转义${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

  

如果您指定模板参数名称或资源逻辑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