Fn::Sub - AWS CloudFormation

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、およびリソース属性のみを指定する場合、キー/値マップを指定しないでください。

テンプレートパラメータ名、または ${InstanceTypeParameter} などのリソースの論理 ID を指定すると、CloudFormation は Ref 組み込み関数を使用した場合と同じ値を返します。${MyInstance.PublicIp} などのリソース属性を指定すると、CloudFormation は Fn::GetAtt 組み込み関数を使用した場合と同じ値を返します。

USD 記号と中括弧 (${}) をそのまま書き込むには、最初の中括弧の後に感嘆符 (!) を追加します (${!Literal} など)。CloudFormation は、このテキストを ${Literal} として解決します。

VarName

String パラメーターに含めた変数の名前。

VarValue

実行時に CloudFormation が関連する変数の名前と置き換える値。

戻り値

CloudFormation は、すべての変数の値を置き換え、元の文字列を返します。

次の例では、Fn::Sub 関数を使用する方法を示します。

key-value マップなしで 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}"

key-value マップを使用して Fn::Sub を使用する

この例では、WWWBucket リソースの名前は key-value マップを使用して動的に作成されます。Fn::Sub 関数は、入力文字列 www.${Domain}${Domain} を、同じスタックテンプレート内で定義されている RootDomainName パラメータを参照する Ref 関数の値に置き換えます。例えば、ルートドメイン名が「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

複数の変数を使用して ARN を構築する

次の例では、VPC の Amazon リソースネーム (ARN) を作成するために、AWS::RegionAWS::AccountId 擬似パラメータ、および vpc リソース論理 ID とともに Fn::Sub を使用します。

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}

サポートされている関数

String パラメータには、関数を使用できません。文字列値を指定する必要があります。

VarName および VarValue パラメータに対して、以下の関数を使用できます。