首页 > 解决方案 > 为什么我需要 AWS CloudFormation 中的额外元素来插值变量

问题描述

我正在尝试使用以下命令将用户数据传递给在 Cloudformation 中创建的 EC2 实例:

      UserData: !Base64
        'Fn::Join':
          - ''
          - - |
              #!/bin/bash -xe
              echo '
            - !Ref 'someVar'
            - |
              ' > /tmp/some-content

哪个有效。这是扩展的用户数据(顺便说一句,我也不知道为什么后面有一个新行,echo '但这不是主要问题):

#!/bin/bash -xe
echo '
some string passed as parameter' > /tmp/some-content

但是,如果我-从 !Ref 部分中删除 !Ref ,它会将 !Ref 视为字符串:

      UserData: !Base64
        'Fn::Join':
          - ''
          - - |
              #!/bin/bash -xe
              echo '
              !Ref 'License'
              ' > /tmp/some-content

这是扩展的用户数据。

#!/bin/bash -xe
echo '
!Ref 'someVar'
' > /tmp/some-content

为什么会这样?这是 cloudformation 内部的东西吗,仅当它们单独作为列表中的元素时才会扩展 !Ref 变量?

标签: amazon-web-servicesyamlamazon-cloudformationstring-interpolation

解决方案


这样做会不会更容易:

  UserData: 
    Fn::Base64: !Sub |
          #!/bin/bash -xe 
          echo "${someVar}" > /tmp/some-content

基本上没有必要使用Join和受苦。使用!Sub |起来痛苦得多。该代码更具可读性并且更易于管理。


推荐阅读