CloudFormation の パラメータについて整理しよう

# 基本の書き方

次の例では、`InstanceTypeParameter` というパラメータです。
デフォルトでは`t2.micro`、他に`m1.small` `m1.large`のインスタンスタイプを指定できるようになります。

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

上記を参照するには、Ref関数で、`InstanceTypeParameter` パラメータを指定するだけです。

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

# プロパティ

|プロパティ|説明|
|---|---|
|AllowedPattern|`String` 型に使用できるパターンを表す正規表現|
|AllowedValues|パラメーターに許容される一連の値を含む配列|
|ConstraintDescription|制約が違反された場合に、制約について説明するエラーメッセージ|
|Default|スタックの作成時に値を指定しなかった場合に、テンプレートで使用される適切な値|
|Description|パラメータの説明|
|MaxLength|`String` 型に使用できる最大文字数|
|MaxValue|`Number` 型に使用できる数値の最大数|
|MinLength|`String` 型に使用できる最少文字数|
|MinValue|`Number` 型に使用できる数値の最小数|
|NoEcho|パラメータ値をマスクする|

# Type

Type には次のようなもの指定できます。

|Type|説明|例|
|---|---|---|
|String|文字列|dev|
|Number|数値|8888|
|List<Number>|カンマで区切られた整数または浮動小数点値の配列|1,2|
|CommaDelimitedList|カンマで区切られた文字列の配列|dev,prod|
|AWS 固有のパラメータタイプ|※後述||
|SSM パラメータータイプ|※後述||

# AWS 固有のパラメータタイプ

|Type|説明|例|
|---|---|---|
|AWS::EC2::AvailabilityZone::Name|AZ|us-west-2a|
|AWS::EC2::Image::Id|EC2 イメージ ID|ami-0ff8a91507f77f867|
|AWS::EC2::Instance::Id|EC2 インスタンス ID|i-1e731a32|
|AWS::EC2::KeyPair::KeyName|Amazon EC2 のキーペア名||
|AWS::EC2::SecurityGroup::GroupName|セキュリティグループ名|my-sg-abc など|
|AWS::EC2::SecurityGroup::Id|セキュリティグループ ID|sg-a123fd85|
|AWS::EC2::Subnet::Id|サブネット ID|subnet-123a351e|
|AWS::EC2::Volume::Id|Amazon EBS ボリューム ID|vol-3cdd3f56|
|AWS::EC2::VPC::Id|VPC ID|vpc-a123baa3|
|AWS::Route53::HostedZone::Id|Route 53 ホストゾーン ID|Z23YXV4OVPL04A|
|List<AWS::EC2::AvailabilityZone::Name>|リージョンのAZの配列|us-west-2a, us-west-2b|
|List<AWS::EC2::Image::Id>|EC2 イメージ ID の配列|ami-0ff8a91507f77f867, ami-0a584ac55a7631c0c など|
|List<AWS::EC2::Instance::Id>|EC2 インスタンス ID の配列|i-1e731a32, i-1e731a34 など|
|List<AWS::EC2::SecurityGroup::GroupName>|セキュリティグループ名の配列|my-sg-abc, my-sg-def など|
|List<AWS::EC2::SecurityGroup::Id>|セキュリティグループ ID の配列|sg-a123fd85, sg-b456fd85 など|
|List<AWS::EC2::Subnet::Id>|サブネット ID の配列|subnet-123a351e, subnet-456b351e など|
|List<AWS::EC2::Volume::Id>|EBS ボリューム ID の配列|vol-3cdd3f56, vol-4cdd3f56 など|
|List<AWS::EC2::VPC::Id>|VPC ID の配列|vpc-a123baa3, vpc-b456baa3 など|
|List<AWS::Route53::HostedZone::Id>|Route 53 ホストゾーン ID の配列|Z23YXV4OVPL04A, Z23YXV4OVPL04B など|

以下の例では、`AWS::EC2::KeyPair::KeyName` および `AWS::EC2::Subnet::Id` の型の 2 つのパラメーターが宣言されています。
これらの型では、**有効な値は既存のキーペア名およびサブネット ID に制限**されます。
**mySubnetIDs パラメーターはListなので、ユーザーは 1 つ以上のサブネット ID をリストから指定するということになります。**


```yaml
Parameters: 
  myKeyPair: 
    Description: Amazon EC2 Key Pair
    Type: "AWS::EC2::KeyPair::KeyName"
  mySubnetIDs: 
    Description: Subnet IDs
    Type: "List<AWS::EC2::Subnet::Id>"
```

# SSM パラメータタイプ

|Type|説明|詳細|
|---|---|---|
|AWS::SSM::Parameter::Name|Systems Manager パラメーターキーの名前|パラメーターキーを渡す場合は、このパラメーターを使用|
|AWS::SSM::Parameter::Value<String>|値が文字列の Systems Manager パラメーター|パラメーターストア内の `String` パラメータータイプに対応|
|AWS::SSM::Parameter::Value<List<String>> 、、または AWS::SSM::Parameter::Value<CommaDelimitedList>|値が文字列のリストである Systems Manager パラメーター|パラメーターストア内の `StringList` パラメータータイプに対応|
|AWS::SSM::Parameter::Value<AWS-specific parameter type>|値が AWS 固有のパラメータタイプである Systems Manager パラメータ|(例)`AWS::SSM::Parameter::Value<AWS::EC2::KeyPair::KeyName>`|
|AWS::SSM::Parameter::Value<List<AWS-specific parameter type>>|値が AWS 固有のパラメータタイプのリストである Systems Manager パラメータ|(例)`AWS::SSM::Parameter::Value<List<AWS::EC2::KeyPair::KeyName>>`|

CloudFormation のパラメータを Systems Manager パラメータから取得する。使い方は以下の記事がわかりやすい。

https://qiita.com/y-ohgi/items/7870ff8c2067290905e8

# CloudFormation コンソールでのパラメーターのグループ化およびソート

CloudFormation コンソールを使用してスタックを作成または更新すると、コンソールに論理 ID により入力パラメーターがアルファベット順に並べられてリストされる。
`AWS::CloudFormation::Interface` メタデータキーを使用すれば、パラメーターをグループ化および順序付けすることができる。

使い方は以下の記事で紹介されている「Metadata を使って入力パラメータを見やすく管理する」がわかりやすい。

https://blog.serverworks.co.jp/tech/2019/02/28/cfn-3tips/