

これは新しい CloudFormation テンプレートリファレンスガイドです。ブックマークとリンクを更新してください。CloudFormation の開始方法については、『[AWS CloudFormation ユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)』を参照してください。

# `Fn::Sub`
<a name="intrinsic-function-reference-sub"></a>

組み込み関数 `Fn::Sub` は、入力文字列の変数を、指定した値に置き換えます。テンプレートで、スタックを作成または更新するまで使用できない値を含むコマンドまたは出力を作成するために、この関数を使用できます。

## 宣言
<a name="intrinsic-function-reference-sub-declaration"></a>

以下のセクションでは、関数の構文を示します。

### JSON
<a name="intrinsic-function-reference-sub-syntax.json"></a>

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

`String` パラメーターのテンプレートパラメーター、リソースの論理 ID、またはリソース属性のみを置き換える場合、変数マップを指定しないでください。

```
{ "Fn::Sub" : String }
```

### YAML
<a name="intrinsic-function-reference-sub-syntax.yaml"></a>

完全関数名の構文:

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

短縮形の構文:

```
!Sub
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value
```

`String` パラメーターのテンプレートパラメーター、リソースの論理 ID、またはリソース属性のみを置き換える場合、変数マップを指定しないでください。

完全関数名の構文:

```
Fn::Sub: String
```

短縮形の構文:

```
!Sub String
```

## パラメータ
<a name="w2aac24c66b7"></a>

`String`  
ランタイムに、CloudFormation が関連する値と置き換わる変数のある文字列。変数を `${MyVarName}` として書き込みます。変数は、テンプレートパラメーター名、リソースの論理 ID、リソース属性、またはキー/値マップの変数です。テンプレートパラメーター名、リソースの論理 ID、およびリソース属性のみを指定する場合、キー/値マップを指定しないでください。  
テンプレートパラメータ名、または `${InstanceTypeParameter}` などのリソースの論理 ID を指定すると、CloudFormation は `Ref` 組み込み関数を使用した場合と同じ値を返します。`${MyInstance.PublicIp}` などのリソース属性を指定すると、CloudFormation は `Fn::GetAtt` 組み込み関数を使用した場合と同じ値を返します。  
USD 記号と中括弧 (`${}`) をそのまま書き込むには、最初の中括弧の後に感嘆符 (`!`) を追加します (`${!Literal}` など)。CloudFormation は、このテキストを `${Literal}` として解決します。  
起動テンプレートを使用している場合は、`\${!Literal}` などのドル記号の前にバックスラッシュ `\` を追加します。追加しないと、その文字は空の文字列として解決されます。

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

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

## 戻り値
<a name="w2aac24c66b9"></a>

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

## 例
<a name="w2aac24c66c11"></a>

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

### key-value マップなしで `Fn::Sub` を使用する
<a name="w2aac24c66c11b5"></a>

このシンプルな例では、`InstanceSecurityGroup` リソースの説明は `AWS::StackName` 疑似パラメータを使用して動的に作成されます。例えば、スタック名が「VPC-EC2-ALB-Stack」の場合、結果の説明は「SSH security group for VPC-EC2-ALB-Stack」になります。

#### JSON
<a name="intrinsic-function-reference-sub-example-1.json"></a>

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

#### YAML
<a name="intrinsic-function-reference-sub-example-1.yaml"></a>

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

### key-value マップを使用して `Fn::Sub` を使用する
<a name="w2aac24c66c11b7"></a>

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

#### JSON
<a name="intrinsic-function-reference-sub-example-2.json"></a>

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

#### YAML
<a name="intrinsic-function-reference-sub-example-2.yaml"></a>

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

### 複数の変数を使用して ARN を構築する
<a name="w2aac24c66c11b9"></a>

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

#### JSON
<a name="intrinsic-function-reference-sub-example-3.json"></a>

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

#### YAML
<a name="intrinsic-function-reference-sub-example-3.yaml"></a>

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

### ユーザーデータスクリプトでパラメータ値を渡す
<a name="w2aac24c66c11c11"></a>

以下の例では、`Fn::Sub` を使用して、実行時に実際のスタック名とリージョンに `AWS::StackName` と `AWS::Region` 擬似パラメータを置き換えます。

#### JSON
<a name="intrinsic-function-reference-sub-example.json"></a>

読みやすくするため、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
<a name="intrinsic-function-reference-sub-example.yaml"></a>

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}
```

### マッピングを使用した条件値を指定する
<a name="w2aac24c66c11c13"></a>

この例では、`log_group_name` 変数を `Fn::FindInMap` 関数の結果の値に置き換えることで、`myLogGroup` リソースの名前が動的に作成されます。

#### JSON
<a name="intrinsic-function-reference-sub-example-5.json"></a>

```
{
  "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
<a name="intrinsic-function-reference-sub-example-5.yaml"></a>

```
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
```

## サポートされている関数
<a name="intrinsic-function-reference-sub-supported-functions"></a>

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

`VarName` および `VarValue` パラメータに対して、以下の関数を使用できます。
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Sub`](#intrinsic-function-reference-sub)
+ [`Ref`](intrinsic-function-reference-ref.md)