Amazon-Web-Services

嘗試了解 UserData 腳本的 Cloudformation 語法

  • September 21, 2022

我正在嘗試為 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 中執行一些我自己的命令,但我不知道何時使用引號或何時使用 | 或 |+ 以及所有這些,我寧願在正確之前不要嘗試所有可能的組合。

提前致謝!

在此處引用另一個答案來格式化 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

只要確保你的縮進是正確的。

引用自:https://serverfault.com/questions/1111256