Fn::Sub - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Fn::Sub

透過內部函數 Fn::Sub,即可用您指定的值替代輸入字串中的變數。您可以在範本中善用此函數,進而建構命令或輸出,其中包含建立或更新堆疊後才可供使用的數值。

宣告

以下各節會顯示該函數的語法。

JSON

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

如果您只替換 參數中的範本參數IDs、資源邏輯 或資源屬性String,請不要指定變數映射。

{ "Fn::Sub" : String }

YAML

完整函式名稱的語法:

Fn::Sub: - String - Var1Name: Var1Value Var2Name: Var2Value

短格式的語法:

!Sub - String - Var1Name: Var1Value Var2Name: Var2Value

如果您只替換 參數中的範本參數IDs、資源邏輯 或資源屬性String,請不要指定變數映射。

完整函式名稱的語法:

Fn::Sub: String

短格式的語法:

!Sub String

參數

String

具有變數的字串,可在執行時間以其相關聯的值 AWS CloudFormation 取代。請使用 ${MyVarName} 格式編寫變數;變數可以是範本參數名稱、資源邏輯 IDs、資源屬性或索引鍵值映射中的變數。如果您只指定範本參數名稱、資源邏輯 IDs和資源屬性,請不要指定索引鍵值映射。

如果您指定範本參數名稱或資源邏輯 IDs,例如 ${InstanceTypeParameter}, 會 CloudFormation 傳回與使用Ref內部函數相同的值。如果您指定 資源屬性,例如 ${MyInstance.PublicIp}, 會 CloudFormation 傳回與使用Fn::GetAtt內部函數相同的值。

若要撰寫美元符號並實際彎曲括號 (${}),請在開啟的彎曲括號後新增驚嘆號 (!),例如 ${!Literal}. CloudFormation resolve the text as ${Literal}

VarName

String 參數中包含的變數名稱。

VarValue

在執行時間 CloudFormation 取代相關聯變數名稱的值。

傳回值

CloudFormation 會傳回原始字串,取代所有變數的值。

範例

以下範例會示範 Fn::Sub 函數的使用方式。

Fn::Sub 不使用鍵值映射使用

在此簡單範例中,InstanceSecurityGroup資源的描述會使用AWS::StackName虛擬參數動態建立。例如,如果堆疊名稱為 "VPC-EC2-ALB-Stack",產生的描述為 "SSH security group for VPC-EC2-ALB-Stack".

JSON

"InstanceSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : {"Fn::Sub": "SSH security group for ${AWS::StackName}"} }}

YAML

InstanceSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: !Sub "SSH security group for ${AWS::StackName}"

Fn::Sub 搭配索引鍵值映射使用

在此範例中,WWWBucket資源的名稱會使用索引鍵值映射動態建立。Fn::Sub 函數${Domain}會以參考相同堆疊範本中定義之RootDomainName參數的Ref函數www.${Domain}中的值取代輸入字串中的 。例如,如果根網域名稱為 "mydomain.com",此資源的產生名稱為 "www.mydomain.com".

JSON

"WWWBucket":{ "Type":"AWS::S3::Bucket", "Properties":{ "BucketName":{ "Fn::Sub":[ "www.${Domain}", { "Domain":{ "Ref":"RootDomainName" } } ] } } }

YAML

WWWBucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub - 'www.${Domain}' - Domain: !Ref RootDomainName

使用多個變數來建構 ARNs

下列範例使用 Fn::Sub搭配 AWS::AccountId AWS::Region和 虛擬參數和資源邏輯 IDvpc,為 建立 Amazon Resource Name (ARN)VPC。

JSON

{ "Fn::Sub": "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}" }

YAML

!Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'

在使用者資料指令碼中傳遞參數值

以下範例會使用 Fn::Sub,進而將 AWS::StackNameAWS::Region 虛擬參數替換成執行期的實際堆疊名稱和區域。

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} --resource WebServerGroup --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}

使用映射指定條件值

在此範例中,myLogGroup資源的名稱是透過將log_group_name變數替換為函數產生的值來動態建立Fn::FindInMap

JSON

{ "Mappings": { "LogGroupMapping": { "Test": { "Name": "test_log_group" }, "Prod": { "Name": "prod_log_group" } } }, "Resources": { "myLogGroup": { "Type": "AWS::Logs::LogGroup", "Properties": { "LogGroupName": { "Fn::Sub": [ "cloud_watch_${log_group_name}", { "log_group_name": { "Fn::FindInMap": [ "LogGroupMapping", "Test", "Name" ] } } ] } } } } }

YAML

Mappings: LogGroupMapping: Test: Name: test_log_group Prod: Name: prod_log_group Resources: myLogGroup: Type: 'AWS::Logs::LogGroup' Properties: LogGroupName: !Sub - 'cloud_watch_${log_group_name}' - log_group_name: !FindInMap - LogGroupMapping - Test - Name

支援的函數

對於 String 參數,您不能使用任何函數。您必須指定一個字串值。

對於 VarNameVarValue 參數,您可以使用下列函數: