

# CloudFormation テンプレートの Parameters 構文
<a name="parameters-section-structure"></a>

オプションの `Parameters` セクションを使用して、テンプレートをカスタマイズします。パラメータを使用すると、スタックを作成または更新するたびにテンプレートにカスタム値を入力できます。テンプレートでパラメータを使用することで、特定のシナリオに合わせて調整できる再利用可能で柔軟なテンプレートを構築できます。

適切なタイプのパラメータを定義することにより、コンソールを使用してスタックを作成するとき、既存リソースの識別子のリストから選択できるようになります。詳細については、「[CloudFormation が提供するパラメータタイプを使用して、実行時に既存のリソースを指定する](cloudformation-supplied-parameter-types.md)」を参照してください。

パラメータは、スタックリソースのプロパティ値を指定する一般的な方法です。ただし、リージョンに依存する設定もあれば、他の条件や依存関係のためにユーザーには理解しにくい複雑な設定もあります。このような場合、マッピングを使用するなどして、ユーザーがより単純な値を指定して (またはまったく値を指定しないで) 必要な結果を得ることができるように、テンプレート自体に何らかのロジックを組み込むことをお勧めします。詳細については、「[CloudFormation テンプレートの Mappings 構文](mappings-section-structure.md)」を参照してください。

## 構文
<a name="parameters-section-structure-syntax"></a>

テンプレートの `Parameters` セクションでパラメータを宣言します。これは、次の一般的な構文を使用します。

### JSON
<a name="parameters-section-structure-syntax.json"></a>

```
"Parameters" : {
  "ParameterLogicalID" : {
    "Description": "Information about the parameter",
    "Type" : "DataType",
    "Default" : "value",
    "AllowedValues" : ["value1", "value2"]
  }
}
```

### YAML
<a name="parameters-section-structure-syntax.yaml"></a>

```
Parameters:
  ParameterLogicalID:
    Description: Information about the parameter
    Type: DataType
    Default: value
    AllowedValues:
      - value1
      - value2
```

パラメーターは、値と値に対する制約を定義する属性のリストを含みます。必須属性は `Type` だけで、`String` や `Number` のほか、CloudFormation に用意されているパラメータタイプを設定できます。どのような値を指定するかを説明する `Description` 属性を追加することもできます。**[Create Stack]** ウィザードでテンプレートを使用すると、パラメータの名前と説明が **[Specify Parameters]** ページに表示されます。

**注記**  
デフォルトでは、CloudFormation コンソールでは入力パラメータが論理 ID によりアルファベット順に一覧表示されます。このデフォルトの順序付けを上書きし、関連するパラメータをグループ化するには、テンプレートで `AWS::CloudFormation::Interface` メタデータキーを使用します。詳細については、「[`AWS::CloudFormation::Interface` メタデータを使用した CloudFormation パラメータの整理](aws-cloudformation-interface.md)」を参照してください。

デフォルト値を持つパラメータについては、ユーザーが別の値を指定しない限り、CloudFormation でデフォルト値が使用されます。デフォルトの属性を省略する場合は、ユーザーにそのパラメータの値を指定するよう求める必要があります。ただし、ユーザーに値を指定するよう求めた場合、その値の有効性は保証されません。パラメータの値を検証するには、制限を宣言するか、AWS 固有のパラメータタイプを指定することができます。

デフォルト値のないパラメータの場合、ユーザーはスタックの作成時にキー名の値を指定する必要があります。指定しないと、CloudFormation はスタックを作成できないため、例外をスローします。

```
Parameters: [KeyName] must have values
```

## プロパティ
<a name="parameters-section-structure-properties"></a>

`AllowedPattern`  
`String` または `CommaDelimitedList` タイプに使用できるパターンを表す正規表現。タイプ `String` のパラメータに適用される場合、パターンは指定されたパラメータ値全体と一致する必要があります。タイプ `CommaDelimitedList` のパラメータに適用される場合、パターンはリスト内の各値と一致する必要があります。  
*必須:* いいえ

`AllowedValues`  
パラメーターに許容される一連の値を含む配列。タイプ `String` のパラメータに適用する場合、パラメータ値は許可された値のいずれかである必要があります。タイプ `CommaDelimitedList` のパラメータに適用される場合、リスト内の各値は、指定および許可された値のいずれかである必要があります。  
*必須:* いいえ  
YAML を使用していて、`AllowedValues` に `Yes` と `No` 文字列を使用する場合、一重引用符を使用して YAML パーサーがこれらのブール値を考慮することを防ぎます。

`ConstraintDescription`  
制約が違反された場合に、制約について説明する文字列。たとえば、制約の説明を指定しないとき、許容されているパターンが `[A-Za-z0-9]+` であるパラメーターの場合、ユーザーが無効な値を指定すると次のエラーメッセージが表示されます。  
`Malformed input-Parameter MyParameter must match pattern [A-Za-z0-9]+`  
*must only contain letters (uppercase and lowercase) and numbers* などの制約の説明を追加することによって、次のようにカスタマイズされたエラーメッセージを表示することができます。  
`Malformed input-Parameter MyParameter must only contain uppercase and lowercase letters and numbers`  
*必須:* いいえ

`Default`  
スタックの作成時に値を指定しなかった場合に、テンプレートで使用される適切な型の値。パラメーターの制約を定義する場合は、これらの制約に従う値を指定する必要があります。  
*必須:* いいえ

`Description`  
パラメーターについて説明する最大 4000 文字の文字列。  
*必須:* いいえ

`MaxLength`  
`String` 型に使用できる最大文字数を決定する整数値。  
*必須:* いいえ

`MaxValue`  
`Number` 型に使用できる数値の最大値を決定する数値。  
*必須:* いいえ

`MinLength`  
`String` 型に使用できる最小文字数を決定する整数値。  
*必須:* いいえ

`MinValue`  
`Number` 型に使用できる数値の最小値を決定する数値。  
*必須:* いいえ

`NoEcho`  
パラメータ値をマスクして、コンソール、コマンドラインツール、または API に表示されないようにするかどうか。`NoEcho` 属性を `true` に設定すると、CloudFormation は、スタックまたはスタックイベントを記述するすべての呼び出しに対して、アスタリスク (\$1\$1\$1\$1\$1) としてマスクされたパラメータ値を返します。ただし、以下に指定された場所に保存されている情報は除きます。  
*必須:* いいえ  
`NoEcho` 属性を使用しても、以下に保存されている情報はマスクされません。  
+ `Metadata` テンプレートセクション。CloudFormation は、`Metadata` セクションに含める情報の変換、変更、または編集を行いません。詳細については、「[メタデータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html)」を参照してください。
+ `Outputs` テンプレートセクション。詳細については、「[出力](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)」を参照してください。
+ リソース定義の `Metadata` 属性。詳細については、「[`Metadata` 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html)」を参照してください。
パスワードやシークレットなどの機密情報を含めるには、これらのメカニズムを使用しないことを強くお勧めします。
機密情報は、CloudFormation テンプレートに直接埋め込むのではなく、スタックテンプレートの動的パラメータを使用して CloudFormation の外部 (AWS Systems Manager パラメータストアや AWS Secrets Manager など) に保存して管理した上で 参照することをお勧めします。  
詳細については、「[テンプレートに認証情報を埋め込まない](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds)」のベストプラクティスを参照してください。
リソースのプライマリ識別子の一部であるリソースプロパティには、`NoEcho` パラメータや機密データを含めないことを強くお勧めします。  
プライマリリソース識別子を形成するプロパティに `NoEcho` パラメータが含まれている場合、CloudFormation はプライマリリソース識別子に*実際の平文値*を使用する場合があります。このリソース ID は、派生した出力または送信先に表示されます。  
リソースタイプのプライマリ識別子を構成するリソースプロパティを確認するには、「[AWS リソースおよびプロパティタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)」でそのリソースのリソースリファレンスドキュメントを参照してください。**[Return values]** (戻り値) セクションの `Ref` 関数の戻り値は、リソースタイプのプライマリ識別子を構成するリソースプロパティを表します。

`Type`  <a name="parameters-section-structure-properties-type"></a>
パラメーターのデータ型 (`DataType`)。  
*必須:* はい  
CloudFormation では次のパラメータタイプをサポートしています。    
`String`  
リテラル文字列。`MinLength`、`MaxLength`、`Default`、`AllowedValues`、`AllowedPattern` の各属性を使用して制約を宣言できます。  
たとえば、次のように指定します。`"MyUserName"`  
`Number`  
整数または浮動小数点値。CloudFormation は、このパラメータを数値として検証しますが、テンプレート内の他の場所で使用した場合には (`Ref` 組み込み関数を使用した場合など) 文字列として扱います。  
`MinValue`、`MaxValue`、`Default`、`AllowedValues` の各属性を使用して制約を宣言できます。  
たとえば、次のように指定します。`"8888"`  
`List<Number>`  
カンマで区切られた整数または浮動小数点値の配列。CloudFormation は、このパラメータを数値として検証しますが、テンプレート内の他の場所で使用した場合には (`Ref` 組み込み関数を使用した場合など) 文字列のリストとして扱います。  
たとえば、`"80,20"` と指定し、`Ref` を使用した場合には `["80","20"]` となります。  
`CommaDelimitedList`  
カンマで区切られたリテラル文字列の配列。文字列の合計数は、カンマの合計数よりも 1 つ多いはずです。また、各メンバー文字列の前後の空白は削除されます。  
たとえば、`"test,dev,prod"` と指定し、`Ref` を使用した場合には `["test","dev","prod"]` となります。  
AWS 固有のパラメータタイプ  
Amazon EC2 キーペアの名前や VPC の ID などの AWS の値です。詳細については、「[実行時に既存のリソースを指定する](cloudformation-supplied-parameter-types.md)」を参照してください。  
Systems Manager パラメータタイプ  
Systems Manager パラメーターストア内の既存のパラメーターに対応するパラメーター。Systems Manager パラメータキーは Systems Manager パラメータタイプの値として指定します。CloudFormation は Parameter Store から最新の値を取得し、スタックに使用します。詳細については、「[実行時に既存のリソースを指定する](cloudformation-supplied-parameter-types.md)」を参照してください。

## パラメーターの一般要件
<a name="parameters-section-structure-requirements"></a>

パラメーターを使用するときに以下の要件が適用されます。
+ CloudFormation テンプレートに指定できるパラメータは最大 200 個です。
+ 各パラメータには、英数字でテンプレート内のどの論理名とも重複しない論理名 (論理 ID と呼ばれます) を指定する必要があります。
+ 各パラメータには、CloudFormation でサポートされているパラメータタイプを割り当てる必要があります。詳細については、「[Type](#parameters-section-structure-properties-type)」を参照してください。
+ CloudFormation がスタックを正常にプロビジョニングするには、各パラメータに実行時に値を割り当てる必要があります。別の値が指定されている場合を除き、必要に応じて、使用する CloudFormation のデフォルト値を指定できます。
+ パラメーターは、同じテンプレート内から宣言および参照する必要があります。テンプレートの `Resources` および `Outputs` セクションのパラメーターを参照できます。

## 例
<a name="parameters-section-examples"></a>

**Topics**
+ [シンプルな文字列パラメータ](#parameters-section-structure-example-1)
+ [パスワードパラメータ](#parameters-section-structure-example-2)
+ [パラメータの参照](#parameters-section-structure-example-3)
+ [カンマ区切りリストのパラメータ](#parameters-section-structure-example-4)
+ [カンマ区切りリストのパラメータから値を返します](#parameters-section-structure-example-5)

### シンプルな文字列パラメータ
<a name="parameters-section-structure-example-1"></a>

以下の例では、`String` タイプの `InstanceTypeParameter` というパラメータを宣言します。このパラメータを使用すると、スタックの Amazon EC2 インスタンスタイプを指定できます。スタックの作成時または更新時に値が指定されていない場合、CloudFormation はデフォルト値の `t2.micro` を使用します。

#### JSON
<a name="parameters-section-structure-example-1.json"></a>

```
"Parameters" : {
  "InstanceTypeParameter" : {
    "Description" : "Enter t2.micro, m1.small, or m1.large. Default is t2.micro.",
    "Type" : "String",
    "Default" : "t2.micro",
    "AllowedValues" : ["t2.micro", "m1.small", "m1.large"]
  }
}
```

#### YAML
<a name="parameters-section-structure-example-1.yaml"></a>

```
Parameters:
  InstanceTypeParameter:
    Description: Enter t2.micro, m1.small, or m1.large. Default is t2.micro.
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - m1.small
      - m1.large
```

### パスワードパラメータ
<a name="parameters-section-structure-example-2"></a>

次の例では、デフォルト値のない `String` タイプの `DBPwd` というパラメータを宣言します。`NoEcho` プロパティは `true` に設定され、スタックの説明にパラメータ値が表示されないようにします。指定できる最小値は `1`、最大値は `41` です。パターンには、英文字の大文字と小文字、および数字を使用できます。この例では、`AllowedPattern` プロパティに正規表現を使用する方法も示しています。

#### JSON
<a name="parameters-section-structure-example-2.json"></a>

```
"Parameters" : {
  "DBPwd" : {
    "NoEcho" : "true",
    "Description" : "The database admin account password",
    "Type" : "String",
    "MinLength" : "1",
    "MaxLength" : "41",
    "AllowedPattern" : "^[a-zA-Z0-9]*$"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-2.yaml"></a>

```
Parameters: 
  DBPwd: 
    NoEcho: true
    Description: The database admin account password
    Type: String
    MinLength: 1
    MaxLength: 41
    AllowedPattern: ^[a-zA-Z0-9]*$
```

### パラメータの参照
<a name="parameters-section-structure-example-3"></a>

パラメータを参照するには、`Ref` 組み込み関数を使用します。CloudFormation は、パラメータの値を使用してスタックをプロビジョニングします。同じテンプレートの `Resources` および `Outputs` セクションのパラメーターを参照できます。

次の例では、EC2 インスタンスリソースの `InstanceType` プロパティが `InstanceTypeParameter` パラメーター値を参照します。

#### JSON
<a name="parameters-section-structure-example-3.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance",
  "Properties" : {
    "InstanceType" : { "Ref" : "InstanceTypeParameter" },
    "ImageId" : "ami-0ff8a91507f77f867"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-3.yaml"></a>

```
Ec2Instance:
  Type: AWS::EC2::Instance
  Properties:
    InstanceType:
      Ref: InstanceTypeParameter
    ImageId: ami-0ff8a91507f77f867
```

### カンマ区切りリストのパラメータ
<a name="parameters-section-structure-example-4"></a>

`CommaDelimitedList` パラメータタイプは、1 つのプロパティに複数の値を指定する必要がある場合に役立ちます。次の例では、デフォルト値 (3 つの CIDR ブロックがカンマで区切られている) を使用した `DbSubnetIpBlocks` というパラメータを宣言します。

#### JSON
<a name="parameters-section-structure-example-4.json"></a>

```
"Parameters" : {
  "DbSubnetIpBlocks": {
    "Description": "Comma-delimited list of three CIDR blocks",
    "Type": "CommaDelimitedList",
    "Default": "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-4.yaml"></a>

```
Parameters: 
  DbSubnetIpBlocks: 
    Description: "Comma-delimited list of three CIDR blocks"
    Type: CommaDelimitedList
    Default: "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
```

### カンマ区切りリストのパラメータから値を返します
<a name="parameters-section-structure-example-5"></a>

パラメータのカンマ区切りリストから特定の値を参照するには、テンプレートの `Resources` セクションで、`Fn::Select` 組み込み関数を使用します。次の例のように、必要なオブジェクトのインデックス値とオブジェクトのリストを渡します。

#### JSON
<a name="parameters-section-structure-example-5.json"></a>

```
{
    "Parameters": {
        "VPC": {
            "Type": "String",
            "Default": "vpc-123456"
        },
        "VpcAzs": {
            "Type": "CommaDelimitedList",
            "Default": "us-west-2a, us-west-2b, us-west-2c"
        },
        "DbSubnetIpBlocks": {
            "Type": "CommaDelimitedList",
            "Default": "172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26"
        }
    },
    "Resources": {
        "DbSubnet1": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Select": [
                      0,
                      { 
                        "Ref": "VpcAzs" 
                      }
                   ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        0,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet2": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    1,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        1,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet3": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    2,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        2,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        }
    }
}
```

#### YAML
<a name="parameters-section-structure-example-5.yaml"></a>

```
Parameters:
  VPC:
    Type: String
    Default: vpc-123456
  VpcAzs:
    Type: CommaDelimitedList
    Default: us-west-2a, us-west-2b, us-west-2c
  DbSubnetIpBlocks:
    Type: CommaDelimitedList
    Default: 172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26
Resources:
  DbSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select
        - 0 
        - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 0
        - !Ref DbSubnetIpBlocks
  DbSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 1
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 1
        - !Ref DbSubnetIpBlocks
  DbSubnet3:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 2
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 2
        - !Ref DbSubnetIpBlocks
```

## 関連リソース
<a name="parameters-section-structure-related-resources"></a>

CloudFormation では、動的参照を使用してプロパティ値を動的に指定することもできます。例えば、Systems Manager パラメータストアに保存されている Secure String を参照する必要がある場合があります。詳細については、「[動的参照を使用して他のサービスに格納されている値を取得する](dynamic-references.md)」を参照してください。

`Ref` または `Sub` 関数内で擬似パラメータを使用して、値を動的に入力することもできます。詳細については、「[擬似パラメータを使用して AWS 値を取得する](pseudo-parameter-reference.md)」を参照してください。