インフラやクラウドの専門というわけではないのですがそろそろIaC周りもちゃんと勉強しておきたい・・・という感じなのでAWSのCloudFormationについて入門しつつ復習として記事にまとめておきます。
※とりあえず最初ということでEC2を絡めたごく基本的なところの記事を書いていきます。将来もしかしたら3記事目以降を執筆して追加のEC2関係や他の様々なサービスや機能などにも触れていくかもしれません。
注意事項と前記事までの振り返り
本記事の処理を動かすとEC2関係などで色々と追加になったり起動したりします。その辺はリソースの停止や削除などをしないとお金がかかったりしてくる可能性があるためご注意ください。
また、本記事は3記事目となります。前回までの内容を踏襲していく形となっているのでご注意ください。
1記事目:
2記事目:
前回までに設定した主な内容:
- CloudFormationのテンプレートへのEC2インスタンスリソースの追加
- キーペアやセキュリティグループなども含む
- CloudFormationのテンプレートへのセキュリティグループのリソースの追加
前回までの時点でYAMLテンプレートは以下のようになっておりこの内容を踏襲していきます。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
KeyName: cloudformation-test-2
SecurityGroups:
- default
- Ref: MySecurityGroup
MySecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: My new security group
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
また、前回の記事中で追加したインスタンスリソースを(コストなどの面を加味して)停止状態などにしていた場合には再開前に起動しておく必要があります(起動していないとCloudFormationの操作でエラーになったりします)。
本記事で触れること
- CloudFormationのパラメータ関係
CloudFormationのパラメータの概要
CloudFormationのパラメータの機能ではテンプレートの内容を反映する際に設定しておいたパラメータを変動させたりすることができます。
たとえばいくつかのインスタンスタイプをパラメータとして選択できるようにしておいて、テンプレートの内容反映時に必要なものを選択する・・・といった制御を行うことができます。環境変数とかに少し雰囲気が近い感じでしょうか。
書き方としては以下のような記述になります。Parameters
部分はResources
などと同じ階層(インデント数)に配置します。
Parameters:
<パラメータの論理ID>:
Type: <パラメータの型>
# ...以降は必要な各種設定
設定できる主な各キーは以下のようになっています。それぞれ詳しくは後の節で触れていきます。また、Typeなどのキーを除いて多くの各キーの値は省略可です。
- Type: パラメータの型(文字列や数値、リストなど)を指定します。
- Description: パラメータの説明文です(本記事執筆時点では最大4000文字)。
- AllowedPattern: 設定されたパラメータに対して正規表現でチェックを設定できます。正規表現のパターンにマッチしない場合弾かれます。
- AllowedValues: 選択できるパラメータのリストを指定します。CloudFormationのwebコンソール上では選択フォームとして扱われます。
- ConstraintDescription: 不正なパラメータが設定された際に表示されるエラーの説明文です。
- Default: パラメータの初期値です。パラメータ未指定時などにはこの値になります。
- パラメーターの説明文です。webコンソール使用時にはUI上にも表示されます。
- MaxLength: パラメータの型に文字列(String)を指定した際に使用できる最大文字数の設定です。
- MinLength: パラメータの型に文字列(String)を指定した際に使用できる最小文字数の設定です。
- MaxValue: パラメータの型に数値(Number)を指定した際に使用できる最大値の設定です。
- MinValue
- NoEcho: パラメータの値をマスクしてコンソール、CLI、APIなどで表示されないようにするかどうかの設定です。※機密情報などはこの設定で扱わず、基本的にテンプレート内にも埋め込まないように・・・といったことがドキュメントに記載されています。
例としてインスタンスタイプの選択式のパラメータを扱う場合、型は文字列(String)、デフォルト値はt2.nano、選択可能な値はm1.nano、t2.micro、m1.smallの場合、以下のようなテンプレートの記述になります。
Parameters:
InstanceTypeParameter:
Type: String
Default: t2.nano
AllowedValues:
- t2.nano
- t2.micro
- t2.small
用意したパラメータをテンプレート上の別のリソースから参照するには2記事目で触れたRefなどの組み込み関数を使用することで対応することができます。Ref <パラメータ名>
といったように書きます。
例えばEC2インスタンスのリソース上でインスタンスタイプのパラメーターを参照したい場合以下のような感じになります。
...
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: Ref InstanceTypeParameter
...
パラメータで使用できる型
パラメータのTypeのキーに指定できる型には主に以下のようなものが存在します。
-
String
: 文字列。例 :t2.nano
-
Number
: 整数や浮動小数点数の数値。例 :8888
-
List<Number>
: コンマ区切りの整数もしくは浮動小数点数。例 :10,20
-
CommaDelimitedList
: コンマ区切りの文字列。例 :development,staging,production
- AWS固有のパラメータ:
AWS::EC2::Instance::Id
などのAWS固有の値。サポートされている定義などは以下のドキュメントをご参照ください。
その他にもSSM (AWS System Manager)パラメータと呼ばれるパラメータストア内のパラメータも参照することができます。その場合AWS::SSM::Parameter::Name
みたいな記述になるようです(この辺までは恐らく本記事では触れません)。
インスタンスタイプを選択する形のパラメータ設定をしたテンプレートをアップロードしてみる
実際にパラメータをテンプレートに設定してYAMLファイルをアップロードして挙動を試してみます。
なお、パラメーター名を参照する部分でRef
関数を使用していたのですが短縮系ではない場合cfn-lintのチェックでE3030のエラーにて引っかかったようです。理由はドキュメント眺めていた感じはっきりとしていませんが代わりに短縮系の!Ref
を使ったらチェックに通りました。
そのため以降の節では!Ref
の短縮系の方を使用していきます。
パラメータの設定としては選択方式のインスタンスタイプとしてInstanceTypeParameter
という論理名で設定しています。以下のようになっています。
Parameters:
InstanceTypeParameter:
Type: String
Default: t2.nano
AllowedValues:
- t2.nano
- t2.micro
- t2.small
EC2インスタンスリソース側では以下のように!Ref
関数でインスタンスタイプのパラメータの論理名を指定しています。
InstanceType: !Ref InstanceTypeParameter
yaml全体としては以下のようになっています。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
InstanceTypeParameter:
Type: String
Default: t2.nano
AllowedValues:
- t2.nano
- t2.micro
- t2.small
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: !Ref InstanceTypeParameter
KeyName: cloudformation-test-2
前記事までと同様にスタックのページで既存のスタックを選択してスタックアクション → 既存スタックの変更セットを作成 → 既存テンプレートを置き換える → テンプレートファイルのアップロードを選択して対象のYAMLファイルをアップロードしていきます。
アップロード後に次へボタンをクリックするとパラメータの画面になります。
今回はInstanceTypeParameter
という論理名のパラメータをYAML内で設定していたのでそのパラメータのUIのみ表示されています。AllowedValues
キーに値を設定していたので選択フォームになっています。また、初期選択はDefault
に指定したt2.nano
になっています。
選択フォームの中身はAllowedValues
のリストで指定した各値になっています。
今回は試しにt2.micro
を選択して進めていってみます。タグなどの設定はデフォルトのまま変えずに進めます。
変更セット名はadd-instance-type-parameter
としました。
あとはそのまま変更セットの実行を行っていきます。イベントのステータスでUPDATE_COMPLETE
などになるまで待ちます。
EC2インスタンスのページに遷移してみるとちゃんとインスタンスタイプがt2.micro
になっていることが確認できます。
様々な型と設定でのUI表示を確認してみる
以降の節では各型や設定を変更した際のwebコンソール上のUIの変化などを試しつつ確認していきます。
単純なString型の指定の場合には自由入力となる
AllowedValues
などを指定せずに単純にType
にString
を指定すると単純な自由入力のフォームのみ表示されます。
試しに以下のようにシンプルなパラメータをYAML上で行ってみます。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
InstanceTypeParameter:
Type: String
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: !Ref InstanceTypeParameter
KeyName: cloudformation-test-2
変更セットの実行などまでは行いませんがテンプレートファイルのアップロードを行ってみてパラメータ画面まで進めてみます。
自由入力のフォームのみ表示されました。デフォルト値などは設定していないのですが、変更セットの場合前回の設定値が参照されているのかt2.micro
という値が最初から入っていました。
単純なNumber型の指定の場合には数値調整のUI付きの自由入力となる
AllowedValues
などを指定せずに単純にType
にNumber
を指定してみます。試しにIndexParameter
という適当な論理名で設定しました。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
IndexParameter:
Type: Number
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
KeyName: cloudformation-test-2
今度は自由入力の形式のままで、ただしキーボードの上下のキーで増減できたり右端の上下のUIで数値を上下できる形になっています。
単純なList<Number>
やCommaDelimitedList
型の指定の場合には自由入力となる
AllowedValues
などを指定せずに単純にList<Number>
やCommaDelimitedList
の型を指定すると単純な自由入力のフォームのみ表示されます。値はフォーム上でコンマ区切りで指定します。
まずはList<Number>
で指定してみます。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
IndicesParameter:
Type: List<Number>
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
KeyName: cloudformation-test-2
数値を上下させるUIなども表示されない形でシンプルな自由入力のフォームとなりました。
続いてEnvParameter
という論理名でCommaDelimitedList
を指定してみます。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
EnvParameter:
Type: CommaDelimitedList
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
KeyName: cloudformation-test-2
こちらもシンプルな自由入力のフォームとなりました。
AWS固有のパラメータを指定した場合にはプルダウンとなる(一部例外有り)
AWS固有のパラメータ(例 : AWS::EC2::KeyPair::KeyName
など)を指定した場合にはプルダウンとなります。
指定できる固有のパラメータは以下のページで一覧を確認できます。
今回はキーペア名のリスト参照となるAWS::EC2::KeyPair::KeyName
という指定をKeyNameParameter
という論理名で指定してみます。
なお、現在の環境ではCloudFormationの1記事目で準備したように2つのキーペアが追加してあります。
YAMLは以下のようにしました。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
KeyNameParameter:
Type: AWS::EC2::KeyPair::KeyName
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
KeyName: !Ref KeyNameParameter
アップロードしてみると既存のキーペア名の一覧に対するプルダウンが表示されます。検索もできるようです。
ただし一部のものはプルダウンにはならずに自由入力となるようです。ドキュメント上に「このパラメータータイプの値のドロップダウンリストが表示されないことに注意してください。」といったような記述があるとプルダウンが表示されません。
たとえばAWS::EC2::Image::Id
は表示されません。理由に関しては正確なものは分かりませんがクラスメソッドさんの記事には以下のように書かれていました。
おそらくAMI IDは選択肢が多すぎるからでしょう。
試しにImageIdParameter
という名前でAWS::EC2::Image::Id
を指定してみます。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
ImageIdParameter:
Type: AWS::EC2::Image::Id
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
KeyName: cloudformation-test-2
シンプルな自由入力のフォームとなりました。
Descriptionのキーを設定してみる
続いてDescription
キーに値を設定してみて挙動を確認していきます。「設定するキーペア名を指定してください。」というメッセージを設定してみました。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
KeyNameParameter:
Type: AWS::EC2::KeyPair::KeyName
Description: 設定するキーペア名を指定してください。
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
KeyName: !Ref KeyNameParameter
いつも通り変更セットを作成する形で進めます。
アップロードが完了すると「???????????????????」という表示になってしまいました。どうやらこの辺も日本語はサポートされていないようです。
気を取り直して日本語の部分を「Select a key pair name to use.」と調整します。スペースが含まれているのでクォーテーションで囲っています。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
KeyNameParameter:
Type: AWS::EC2::KeyPair::KeyName
Description: "Select a key pair name to use."
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
KeyName: !Ref KeyNameParameter
再度アップしてみます。今度はちゃんとパラメータの論理名の下にDescriptionで指定した説明が表示されました。このような形でDescription
の設定はwebコンソールのUI上に表示されるようです。
AllowedPatternのキーを設定してみる
続いてAllowedPattern
のキー設定を試していきます。
受け付けるパラメータの値の正規表現のパターン設定となります。
お試しとして適当に3桁の数字をハイフン区切りで3つ設定されるパラメータを考えてみます(例 : 000-111-222)。論理名も雑ですがTestParameter
としました。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
TestParameter:
Type: String
AllowedPattern: \d{3}-\d{3}-\d{3}
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
YAMLをアップロードして、試しにわざとエラーになるようにハイフン無しの数字で入力してみます。
そのまま変更セットの作成のところまで画面を進めました(特にパラメータ入力直後にエラーになったりはしないようです)。
変更セット作成の箇所でどうやらエラーで弾かれ、レビュー画面に戻されるようです(Parameter 'TestParameter' must match pattern \d{3}-\d{3}-\d{3}
とエラーメッセージが表示されました)。
パラメータ部分の編集ボタンを押して正常な値を指定してみます。
今度はエラーなく変更セットの作成ボタン押下後の処理が進んでくれました。
ConstraintDescriptionのキーを設定してみる
ConstraintDescription
のキーに対する設定を進めます。エラー時に表示される補助的なエラーメッセージの設定・・・と各資料を読んだ感じ考えています。
恐らくこちらも英語で設定する必要がありそうな印象なので「TestParameter must be specified as three 3-digit numbers separated by hyphens.」と指定しておきました。
また、わざとエラーとしたいため前節のAllowedPattern
の内容をそのまま流用しています。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
TestParameter:
Type: String
AllowedPattern: \d{3}-\d{3}-\d{3}
ConstraintDescription: "TestParameter must be specified as three 3-digit numbers separated by hyphens."
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
YAMLをアップロードして再度エラーになるパターンのパラメータを設定していきます。
そのまま変更セットの作成まで進めると、AWSのデフォルトのエラーの代わりにConstraintDescription
キーに設定したエラーメッセージが表示されました。
MinLengthとMaxLengthのキーを設定してみる
文字列の最大の長さと最小の長さを指定するMinLength
とMaxLength
のキーを設定して試していきます。MinLength
の方を3、MaxLength
の方を6としました。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
TestParameter:
Type: String
MinLength: 3
MaxLength: 6
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
ついでに英語なら文字数判定大丈夫でしょう・・・ということで、試しにわざと日本語でパラメータを入力してみます。
なお、余談ですが本記事執筆中に変更セット名の入力の画面がパラメータ入力の画面と同時になりました(ちょうどアップデートが入った感じでしょうか・・・?)。
パラメータは日本語7文字で弾かれるようにしておきます。
レビュー画面の送信ボタンクリック時にちゃんとエラーで弾かれました。
パラメータの編集ボタンをクリックして、今度はMinLength
側で引っかかるように2文字でパラメータを設定してみます。
こちらも同様にエラーで弾かれました。
こんどは正常に通るように3文字でパラメータを設定してみます。
今度は正常に変更セットの作成が通りました。
MinValueとMaxValueのキーを設定してみる
本記事の最後として数値の型のパラメータの最小値と最大値の制限を加えるためのMinValue
とMaxValue
のキーについて触れていきます。基本的にはMinLength
などと同じように動作すると考えています。
今回はMinValue
を10、MaxValue
を100
としてみました。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
TestParameter:
Type: Number
MinValue: 10
MaxValue: 100
Resources:
MyFirstEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0590f3a1742b17914
InstanceType: t2.nano
YAMLをアップロードしてMinValue
側で引っかかるようにパラメータに9を指定してみます。
今までと同じようにエラーになりました。
今度はMaxValue
側で引っかかるようにパラメータに101を指定して進めてみます。
こちらも違和感無くエラーで引っかかっています。
最後に正常に通る条件として10をパラメータに指定してみます。
正常に変更セットの作成が通りました。
参考文献・参考サイト・参考講座まとめ