CloudFormationのParametersの入力方法の違いをデータ型ごとに一覧にしてみた

CloudFormationのParametersセクションを利用すると一部の項目を変数化して再利用しやすくなります。 このParametersセクション、データ型がいくつかあって、適切なデータ型をつけることでマネジメントコンソールでのパラメーターの入力が楽になったりします。 データ型によるマネジメントコンソールでの入力方法の違いをご紹介します。
2020.03.25

CloudFormation、使ってますか?

私はAWS環境の構築に毎日使っています。 毎日使っていると、構成はほとんど同じなんだけど一部だけ異なる複数の環境を複数作りたいなんて場面がよくあります。

たとえば、検証環境と本番環境だったり、インスタンスタイプだけが異なるEC2だったり。

そんな時はCloudFormationのParametersセクションが便利です。一部の項目を変数化して再利用しやすくなります。

このParametersセクション、データ型がいくつかあって、適切なデータ型をつけることでマネジメントコンソールでのパラメーターの入力が楽になったりします。

このParametersセクションのデータ型によるマネジメントコンソールでの入力方法の違いをご紹介します。

自由入力

String 型が一番汎用的に利用できます。自由入力です。

Parameters:
  String:
    Type: String

数値の入力

Numebr 型で数値の入力ができます。基本自由入力ですが右側にスピンボタンが追加されて、数値の増減ができます。

Parameters:
  Number:
    Type: Number

List型

List 等の型でリストを取り扱うことができます。入力はカンマ(,)を区切り文字にした自由入力です。

Parameters:
  NumberList:
    Type: List<Number>

リスト型は文字列とは異なり、組み込み関数 Fn::Select でインデックスを指定してテンプレート内で利用することができます。

たとえば、前述の入力に対してはこのような出力が可能です。

Outputs:
  NumberList1:
    Value: !Select [0, !Ref NumberList]
  NumberList2:
    Value: !Select [1, !Ref NumberList]
  NumberList3:
    Value: !Select [2, !Ref NumberList]

既存リソースのリストから入力

AWS固有のパラメーター型の場合、入力時にAWSの既存リソースをドロップダウンリストから選択できます。 例外的に、 AWS::EC2::Image::Id 型は自由入力になっています。おそらくAMI IDは選択肢が多すぎるからでしょう。

Parameters:
  InstanceId:
    Type: AWS::EC2::Instance::Id

リスト型の場合も同様にドロップダウンリストから選択できます。選択すると、こんな感じで選択したリソース名が下に追加されます。

Parameters:
  InstanceIdList:
    Type: List<AWS::EC2::Instance::Id>

決められた値のリストから入力

String 型は自由入力ですが、AllowedValuesプロパティを設定することで、決められた値のリストから入力できるように変わります。

Parameters:
  StringAllowedValues:
    Type: String
    AllowedValues:
      - string1
      - string2

ただし、 AWS::EC2::Instance::Id 型のような既存リソースのリストから入力する型の場合、AllowedValuesプロパティを設定しても、選択できるリストの内容は変わりません。変わらず既存のAWSリソースからの選択式です。

Parameters:
  InstanceIdAllowedValues:
    Type: AWS::EC2::Instance::Id
    AllowedValues:
      - i-11111111111111111
      - i-22222222222222222

しかし、AllowedValuesプロパティで指定した値のみ許されているため、値が異なる場合はスタック作成前にチェックされてエラーが発生します。

パラメータストアを利用した入力

CloudFormationではSystems Managerパラメータストアの値を取得して利用することができます。 これは自由入力です。AllowedValuesプロパティを指定しても、自由入力から変わりません。

Parameters:
  SSMParameterName:
    Type: AWS::SSM::Parameter::Name

AWS::SSM::Parameter::Name 型はパラメーターキーの名前を表します。

ちなみに、指定したパラメーターが存在しなかった場合でも、スタック作成前にチェックされません。CFnスタック作成中にエラーが発生します。

それ以外の AWS::SSM::Parameter::Value 等の型は、「パラメータストアから値を取得してくる。そして、その取得した値は String 型である。」と、いうことを表します。

Parameters:
  SSMParameterValueString:
    Type: AWS::SSM::Parameter::Value<String>

実際にCloudFormationテンプレート内の値としては、入力した「cfn-value」というキーの名前ではなく、パラメータストアに保存されている「value: cfn-value」という値が利用されます。

ちなみに、指定したパラメーターが存在しなかった場合、スタック作成前にチェックされてエラーが発生します。

表でまとめ

Parametesセクションで使える型とマネジメンコンソールでの入力の変化を表でまとめました。

型名 自由入力 既存リソースのリストから入力 決められた値のリストから入力
(AllowedValues利用)
備考
String O - O
Number O - O 自由入力の場合、右側にスピンボタンが追加されて、数値の増減が可能
List<Number> O - -
CommaDelimitedList O - -
AWS::EC2::AvailabilityZone::Name - O -
AWS::EC2::Image::Id O - O スタック作成前にAMI IDの存在はチェックされない。該当のAMI IDが存在しない場合、スタック作成中にエラーが発生する
AWS::EC2::Instance::Id - O -
AWS::EC2::KeyPair::KeyName - O -
AWS::EC2::SecurityGroup::GroupName - O -
AWS::EC2::SecurityGroup::Id - O -
AWS::EC2::Subnet::Id - O -
AWS::EC2::Volume::Id - O -
AWS::EC2::VPC::Id - O -
AWS::Route53::HostedZone::Id - O - 値にはホストゾーン ID(例:Z23YXV4OVPL04A)を指定。ホスト名(例:example.com)ではない
List<AWS::EC2::AvailabilityZone::Name> - O -
List<AWS::EC2::Image::Id> - O -
List<AWS::EC2::Instance::Id> - O -
List<AWS::EC2::SecurityGroup::GroupName> - O -
List<AWS::EC2::SecurityGroup::Id> - O -
List<AWS::EC2::Subnet::Id> - O -
List<AWS::EC2::Volume::Id> - O -
List<AWS::EC2::VPC::Id> - O -
List<AWS::Route53::HostedZone::Id> - O -
AWS::SSM::Parameter::Name O - - スタック作成前にパラメータストアの存在はチェックされない。該当のパラメータストアが存在しない場合、スタック作成中にエラーが発生する。
AWS::SSM::Parameter::Value<String> O - - スタック作成前にパラメータストアの存在がチェックされる
AWS::SSM::Parameter::Value<List<String>> O - - スタック作成前にパラメータストアの存在がチェックされる
AWS::SSM::Parameter::Value<CommaDelimitedList> O - - スタック作成前にパラメータストアの存在がチェックされる
AWS::SSM::Parameter::Value<AWS-specific parameter type> O - - スタック作成前にパラメータストアの存在がチェックされる。AWS-specific parameter type(例:AWS::EC2::KeyPair::KeyPairName)の存在はチェックされない。
AWS::SSM::Parameter::Value<List<AWS-specific parameter type>> O - - スタック作成前にパラメータストアの存在がチェックされる

終わりに

Parametersセクションで適切なデータ型をつけるとマネジメントコンソールでのパラメータの入力が楽になるので、ぜひご活用ください。