AWS CloudFormation
User Guide (API Version 2010-05-15)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

Fn::Sub

内部函数 Fn::Sub 将输入字符串中的变量替换为您指定的值。在您的模板中,可以使用此函数构建命令或输出,其中包含在创建或更新堆栈之前不可用的值。

声明

以下部分显示函数的语法。

JSON

{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }

如果您仅替换 String 参数中的模板参数、资源逻辑 ID 或资源属性,则不要指定变量映射。

{ "Fn::Sub" : String }

YAML

完整函数名称的语法:

Fn::Sub: - String - { Var1Name: Var1Value, Var2Name: Var2Value }

短格式的语法:

!Sub - String - { Var1Name: Var1Value, Var2Name: Var2Value }

如果您仅替换 String 参数中的模板参数、资源逻辑 ID 或资源属性,则不要指定变量映射。

完整函数名称的语法:

Fn::Sub: String

短格式的语法:

!Sub String

参数

String

一个带变量的字符串,AWS CloudFormation 在运行时会将这些变量替换为其关联的值。以 ${MyVarName} 形式编写变量。变量可以是模板参数名、资源逻辑 ID、资源属性或键值映射中的变量。如果您仅指定模板参数名、资源逻辑 ID 和资源属性,则不要指定键值映射。

如果您指定模板参数名或资源逻辑 ID(例如 ${InstanceTypeParameter}),则 AWS CloudFormation 返回的值与您使用 Ref 内部函数时返回的值相同。如果您指定资源属性(例如 ${MyInstance.PublicIp}),则 AWS CloudFormation 返回的值与您使用 Fn::GetAtt 内部函数时返回的值相同。

要按字面书写美元符号和大括号 (${}),请在左大括号后添加感叹号 (!),例如 ${!Literal}。AWS CloudFormation 会将此文本解析为 ${Literal}

VarName

String 参数中包含的变量的名称。

VarValue

AWS CloudFormation 在运行时要将关联的变量名称替换为的值。

返回值

AWS CloudFormation 返回原始字符串,并替换所有变量的值。

示例

下面的示例演示如何使用 Fn::Sub 函数。

UserData 命令

下面的示例使用 Fn::Sub 在运行时将 AWS CloudFormation 堆栈名称和 AWS 区域伪参数替换为实际的堆栈名称和区域。

JSON

为了便于阅读,JSON 示例使用 Fn::Join 函数来分隔每条命令,而不是在单个字符串值中指定整个用户数据脚本。

"UserData": { "Fn::Base64": { "Fn::Join": ["\n", [ "#!/bin/bash -xe", "yum update -y aws-cfn-bootstrap", { "Fn::Sub": "/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}" }, { "Fn::Sub": "/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region}" }]] }}

YAML

YAML 示例使用文字块指定用户数据脚本。

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

带映射的 Fn::Sub

下面的示例使用映射将 ${Domain} 变量替换为来自 Ref 函数的结果值。

JSON

{ "Fn::Sub": [ "www.${Domain}", { "Domain": {"Ref" : "RootDomainName" }} ]}

YAML

Name: !Sub - www.${Domain} - { Domain: !Ref RootDomainName }

支持的函数

您可以在 Fn::Sub 函数中使用以下函数:

  • Fn::Base64

  • Fn::FindInMap

  • Fn::GetAtt

  • Fn::GetAZs

  • Fn::If

  • Fn::Join

  • Fn::Select

  • Ref