本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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 取代。請使用
${
格式編寫變數;變數可以是範本參數名稱、資源邏輯 IDs、資源屬性或索引鍵值映射中的變數。如果您只指定範本參數名稱、資源邏輯 IDs和資源屬性,請不要指定索引鍵值映射。MyVarName
}如果您指定範本參數名稱或資源邏輯 IDs,例如
${InstanceTypeParameter}
, 會 CloudFormation 傳回與使用Ref
內部函數相同的值。如果您指定 資源屬性,例如${MyInstance.PublicIp}
, 會 CloudFormation 傳回與使用Fn::GetAtt
內部函數相同的值。若要撰寫美元符號並實際彎曲括號 (
${}
),請在開啟的彎曲括號後新增驚嘆號 (!
),例如${!
. CloudFormation resolve the text asLiteral
}${
。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::StackName
與 AWS::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
參數,您不能使用任何函數。您必須指定一個字串值。
對於 VarName
和 VarValue
參數,您可以使用下列函數: