LoginSignup
0
0

More than 1 year has passed since last update.

入門 AWS CloudFormation #3(EC2とパラメータ編)

Last updated at Posted at 2023-01-24

インフラやクラウドの専門というわけではないのですがそろそろ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のキーに指定できる型には主に以下のようなものが存在します。

その他にもSSM (AWS System Manager)パラメータと呼ばれるパラメータストア内のパラメータも参照することができます。その場合AWS::SSM::Parameter::Nameみたいな記述になるようです(この辺までは恐らく本記事では触れません)。

インスタンスタイプを選択する形のパラメータ設定をしたテンプレートをアップロードしてみる

実際にパラメータをテンプレートに設定してYAMLファイルをアップロードして挙動を試してみます。

なお、パラメーター名を参照する部分でRef関数を使用していたのですが短縮系ではない場合cfn-lintのチェックでE3030のエラーにて引っかかったようです。理由はドキュメント眺めていた感じはっきりとしていませんが代わりに短縮系の!Refを使ったらチェックに通りました。

image.png

そのため以降の節では!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ファイルをアップロードしていきます。

image.png

アップロード後に次へボタンをクリックするとパラメータの画面になります。

今回はInstanceTypeParameterという論理名のパラメータをYAML内で設定していたのでそのパラメータのUIのみ表示されています。AllowedValuesキーに値を設定していたので選択フォームになっています。また、初期選択はDefaultに指定したt2.nanoになっています。

image.png

選択フォームの中身はAllowedValuesのリストで指定した各値になっています。

image.png

今回は試しにt2.microを選択して進めていってみます。タグなどの設定はデフォルトのまま変えずに進めます。

変更セット名はadd-instance-type-parameterとしました。

image.png

あとはそのまま変更セットの実行を行っていきます。イベントのステータスでUPDATE_COMPLETEなどになるまで待ちます。

image.png

EC2インスタンスのページに遷移してみるとちゃんとインスタンスタイプがt2.microになっていることが確認できます。

image.png

様々な型と設定でのUI表示を確認してみる

以降の節では各型や設定を変更した際のwebコンソール上のUIの変化などを試しつつ確認していきます。

単純なString型の指定の場合には自由入力となる

AllowedValuesなどを指定せずに単純にTypeStringを指定すると単純な自由入力のフォームのみ表示されます。

試しに以下のようにシンプルなパラメータを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

変更セットの実行などまでは行いませんがテンプレートファイルのアップロードを行ってみてパラメータ画面まで進めてみます。

image.png

自由入力のフォームのみ表示されました。デフォルト値などは設定していないのですが、変更セットの場合前回の設定値が参照されているのかt2.microという値が最初から入っていました。

単純なNumber型の指定の場合には数値調整のUI付きの自由入力となる

AllowedValuesなどを指定せずに単純にTypeNumberを指定してみます。試しに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で数値を上下できる形になっています。

image.png

単純な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なども表示されない形でシンプルな自由入力のフォームとなりました。

image.png

続いて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

こちらもシンプルな自由入力のフォームとなりました。

image.png

AWS固有のパラメータを指定した場合にはプルダウンとなる(一部例外有り)

AWS固有のパラメータ(例 : AWS::EC2::KeyPair::KeyNameなど)を指定した場合にはプルダウンとなります。

指定できる固有のパラメータは以下のページで一覧を確認できます。

今回はキーペア名のリスト参照となるAWS::EC2::KeyPair::KeyNameという指定をKeyNameParameterという論理名で指定してみます。

なお、現在の環境ではCloudFormationの1記事目で準備したように2つのキーペアが追加してあります。

image.png

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

アップロードしてみると既存のキーペア名の一覧に対するプルダウンが表示されます。検索もできるようです。

image.png

ただし一部のものはプルダウンにはならずに自由入力となるようです。ドキュメント上に「このパラメータータイプの値のドロップダウンリストが表示されないことに注意してください。」といったような記述があるとプルダウンが表示されません。

たとえば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

シンプルな自由入力のフォームとなりました。

image.png

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

いつも通り変更セットを作成する形で進めます。

アップロードが完了すると「???????????????????」という表示になってしまいました。どうやらこの辺も日本語はサポートされていないようです。

image.png

気を取り直して日本語の部分を「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上に表示されるようです。

image.png

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をアップロードして、試しにわざとエラーになるようにハイフン無しの数字で入力してみます。

image.png

そのまま変更セットの作成のところまで画面を進めました(特にパラメータ入力直後にエラーになったりはしないようです)。

変更セット作成の箇所でどうやらエラーで弾かれ、レビュー画面に戻されるようです(Parameter 'TestParameter' must match pattern \d{3}-\d{3}-\d{3}とエラーメッセージが表示されました)。

image.png

パラメータ部分の編集ボタンを押して正常な値を指定してみます。

image.png

今度はエラーなく変更セットの作成ボタン押下後の処理が進んでくれました。

image.png

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をアップロードして再度エラーになるパターンのパラメータを設定していきます。

image.png

そのまま変更セットの作成まで進めると、AWSのデフォルトのエラーの代わりにConstraintDescriptionキーに設定したエラーメッセージが表示されました。

image.png

MinLengthとMaxLengthのキーを設定してみる

文字列の最大の長さと最小の長さを指定するMinLengthMaxLengthのキーを設定して試していきます。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文字で弾かれるようにしておきます。

image.png

レビュー画面の送信ボタンクリック時にちゃんとエラーで弾かれました。

image.png

パラメータの編集ボタンをクリックして、今度はMinLength側で引っかかるように2文字でパラメータを設定してみます。

image.png

こちらも同様にエラーで弾かれました。

image.png

こんどは正常に通るように3文字でパラメータを設定してみます。

image.png

今度は正常に変更セットの作成が通りました。

image.png

MinValueとMaxValueのキーを設定してみる

本記事の最後として数値の型のパラメータの最小値と最大値の制限を加えるためのMinValueMaxValueのキーについて触れていきます。基本的にはMinLengthなどと同じように動作すると考えています。

今回はMinValueを10、MaxValue100としてみました。

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を指定してみます。

image.png

今までと同じようにエラーになりました。

image.png

今度はMaxValue側で引っかかるようにパラメータに101を指定して進めてみます。

image.png

こちらも違和感無くエラーで引っかかっています。

image.png

最後に正常に通る条件として10をパラメータに指定してみます。

image.png

正常に変更セットの作成が通りました。

image.png

参考文献・参考サイト・参考講座まとめ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0