在使用YAML语法的AWS UserData字段中,"!Sub |"是什么意思?

16

在这个来自AWS文档的示例中,我们有一个UserData字段,允许使用以下语法编写多行字符串:

UserData:
  Fn::Base64: !Sub |
     #!/bin/bash -xe
     yum update -y aws-cfn-bootstrap
     /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --region ${AWS::Region}
     /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}

在这里,!Sub |是什么意思,特别是管道字符(|)是什么意思?相应的JSON使用"UserData":{"Fn :: Base64":{"Fn :: Join":["",[而在YAML中,使用了! Sub |。

这个竖杠(pipe)字符表示换行符吗?是否意味着需要使用换行符将行连接起来?


http://www.yaml.org/spec/1.2/spec.html#id2795688 - melpomene
严格来说,那不是“相应的YAML”。您可以使用Sub或Join使用JSON或YAML。 Sub通常更清晰。 - MikeW
2个回答

17
Fn::Sub(YAML !Sub)是一种内置函数,它可以将输入字符串中的变量(例如您示例中的${AWS::StackName}变量)替换为您指定的值。在模板中,您可以使用此函数来构建命令或输出,其中包含在创建或更新堆栈之前不可用的值。
字符“|”(管道符号)表示“字面样式”。这使用了一种更简单、更易读的标量样式。这意味着您可以输入正常的文本,而无需使用诸如“\n”之类的东西来表示行尾。

Fn::Sub

YAML规范


1
如果我可以给这个答案投两票,我一定会这么做。我一直在疯狂地尝试弄清楚为什么我们要将数据从一个命令传输到另一个命令。 - Tim

8
在您的UserData部分中,!Sub函数将UserData字符串中的变量替换为您指定的值或伪参数(如AWS::StackName和AWS::Region)。
此外,YAML中行末的管道符号表示在!Sub |之后缩进的任何文本都应解释为多行标量值。
有关更多详细信息,请参阅内在函数详细信息文档。 documentation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接