尝试理解 UserData 脚本的 Cloudformation 语法

尝试理解 UserData 脚本的 Cloudformation 语法

我正在尝试为 Cloudformation 中的 EC2 实例配置 UserData 属性,当我查看 AWS 示例时,我发现这非常令人困惑。

我正在看的例子来自https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-signal.html

具体来说,YAML 代码片段显示以下示例:

AWSTemplateFormatVersion: 2010-09-09
Description: Simple EC2 instance
Resources:
  MyInstance:
    Type: 'AWS::EC2::Instance'
    Metadata:
      'AWS::CloudFormation::Init':
        config:
          files:
            /tmp/test.txt:
              content: Hello world!
              mode: '000755'
              owner: root
              group: root
    Properties:
      ImageId: ami-a4c7edb2
      InstanceType: t2.micro
      UserData: !Base64 
        'Fn::Join':
          - ''
          - - |
              #!/bin/bash -x
            - |
              # Install the files and packages from the metadata
            - yum install -y aws-cfn-bootstrap
            - '/opt/aws/bin/cfn-init -v '
            - '         --stack '
            - !Ref 'AWS::StackName'
            - '         --resource MyInstance '
            - '         --region '
            - !Ref 'AWS::Region'
            - |+

            - |
              # Signal the status from cfn-init
            - '/opt/aws/bin/cfn-signal -e $? '
            - '         --stack '
            - !Ref 'AWS::StackName'
            - '         --resource MyInstance '
            - '         --region '
            - !Ref 'AWS::Region'
            - |+

    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

现在……让我困惑的主要问题是,为什么有些行不使用引号,而其他行却使用?为什么有些行用“|”字符分隔,而其他行却没有?此外,我找不到任何内容来解释“|+”的含义。

有谁能帮忙解释一下这个例子吗?我试图在 UserData 中运行一些我自己的命令,但我不知道何时使用引号,何时使用 | 或 |+ 等等,我不想在正确之前尝试每一个可能的组合。

提前致谢!

答案1

参考另一个答案这里用于格式化 yaml 文件中的字符串。带有块状填充指示符的块样式(>-、|-、>+、|+)

您可以通过添加块阻塞指示字符来控制字符串中最后一个新行以及任何尾随空行 (\n\n) 的处理:

>,  |: "clip": keep the line feed, remove the trailing blank lines.
>-, |-: "strip": remove the line feed, remove the trailing blank lines.
>+, |+: "keep": keep the line feed, keep trailing blank lines.

对于我在 cloudformation 中运行的所有 bash,我只需使用'!Sub |',然后将 bash 代码放在下一行,如下所示:

UserData:
    Fn::Base64: !Sub |
      #!/bin/bash -xe
      # Pre-Bootstrap Configuration
      yum update -y
      yum install -y aws-cfn-bootstrap git docker
      usermod -a -G docker ec2-user
      systemctl enable docker
      systemctl start docker
      curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/bin/docker-compose
      chmod +x /usr/bin/docker-compose

只要确保你的缩进是正确的。

相关内容