フェイス・ソリューション・テクノロジーズ株式会社 IS 本部 OS ユニットの Saki@猫好き です。AWS 活用していますか?
いくら AWS 認定資格 6 冠を達成していても、基本は大事。今日は、私が特に好きなサービスである、CloudFormation について学習しなおしてみようと思います。
前回、IaC(Infrastructure as Code)を体感してみる学習をしました。テキスト化されたコードから EC2 インスタンスを立ち上げられることを確認しました。
しかし、あまり IaC の恩恵を感じることができなかったと思います。
今回は、前回のコードに簡単なコードを追加して、IaC の恩恵を体感できたらいいなと思います。
おさらい
前回作成したコードは、次のようなとても簡単なものでした。
Resources:
MyEC2Test:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0bba69335379e17f8
InstanceType: t2.micro
- Resources:
これは、CloudFormation でプロビジョニングするリソースを列挙します。 - MyEC2Test:(プロビジョニングするリソースに対して自由に名前を設定します)
後でこのリソースを利用する場合を考えると、できるだけわかりやすく名前を設定した方が良いと思います。 - Type: AWS::EC2::Instance
MyEC2Test は、EC2 インスタンスタイプであることを示しています。 - Properties:
Type で指定したリソースに対するプロパティーを設定します。 - ImageId: ami-0bba69335379e17f8
EC2 インスタンスを立ち上げる際に利用する AMI ID を指定します。 - InstanceType: t2.micro
立ち上げる EC2 インスタンスのインスタンスタイプを指定します。
これでは、いつも Amazon Linux 2 がインストールされた状態の t2.micro インスタンスが立ち上がるだけです。これで CloudFormation って凄い! とはなかなかならないでしょう。・・・私は思いましたけれど。
コードを追加する
もし、t2.micro のインスタンス以外を利用することになった場合、Properties の InstanceType を探して修正する必要があります。先ほどの短いコードであれば問題ないですが、コードが長くなると修正作業が大変になります。
そのような場合を想定して、変更の可能性のある Properties を Parameters セクションで管理する方法が便利です。
インスタンスタイプを選択できるようにする
まずは、インスタンスタイプを選択できる設定です。
Parameters:
ParamInstanceType:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t3.nano
- m1.small
Description: Select Instance Type!
Resources:
MyEC2Test:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0bba69335379e17f8
InstanceType: !Ref ParamInstanceType
- ParamInstanceType:(設定するパラメータに対して自由に名前を設定します)
ここで設定した名前を Resources で参照します。 - Type:
CloudFormation でサポートされているパラメータタイプを割り当てます。今回は「t2.micro」や「t3.nano」といった文字列で受け取るので String としています。 - Default:
デフォルトで選択されるものを指定できます。 - AllowedValues:
選択可能なインスタンスタイプを列挙します。 - Description:
このパラメータについての説明です。マネジメントコンソールで表示されます(後述)。 - InstanceType: !Ref ParamInstanceType
組み込み関数 !Ref を利用すると、!Ref に続いて指定したパラメータまたはリソースの値を返すことができます。
ネームタグをつけてみる
このまま複数のインスタンスを立ち上げても、どのインスタンスがどのプロジェクトのインスタンスであるか判別するのが困難です。そこで、ネームタグをつけるようにしてみます。
Parameters:
ParamInstanceType:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t3.nano
- m1.small
Description: Select Instance Type!
ParamProjectName:
Type: String
Description: Enter Project Name!
Resources:
MyEC2Test:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0bba69335379e17f8
InstanceType: !Ref ParamInstanceType
Tags:
- Key: Name
Value: !Ref ParamProjectName
- ParamProjectName:(設定するパラメータに対して自由に名前を設定します)
ここで設定した名前を Resources で参照します。 - Type:
CloudFormation でサポートされているパラメータタイプを割り当てます。 - Description:
このパラメータについての説明です。マネジメントコンソールで表示されます(後述)。 - Value: !Ref ParamProjectName
組み込み関数 !Ref を利用すると、!Ref に続いて指定したパラメータまたはリソースの値を返すことができます。
CloudFormation でテンプレートを利用する
CloudFormation コンソールから作成した YAML ファイルをアップロードします
「スタックの詳細を指定」画面に「パラメータ」の項目が増えていることが確認できます
それぞれに Description が表示されているのが確認できます。
AllowedValues で設定したインスタンスのみが選択可能です
プロジェクトネームを入力します
これで、スタックの作成を実行します。
同様に、再度スタックの作成を実行して、先ほどとは異なるスタック名とパラメータを設定しました。
MyEC2Test-1 プロジェクトでは、m1.small インスタンスを利用します。
MyEC2Test-2 プロジェクトでは、t3.nano インスタンスを利用します。
スタックの作成が実行されています
EC2 インスタンスのコンソール画面での確認
MyEC2Test-1 プロジェクトでは、m1.small インスタンスが、MyEC2Test-2 プロジェクトでは、t3.nano インスタンスが利用されていることが確認できました!
お片づけ
CloudFormation でプロビジョニングされたリソースは、「スタックの削除」で簡単に削除することができます。EC2 インスタンスの終了だけであれば、それほど恩恵を感じることができないかもしれませんが、1 つのテンプレートで複数のリソースをプロビジョニングしている場合に大きな効果を発揮します。
最後に
パラメータを渡すことで、1 つのテンプレートから複数のリソースをプロビジョニングすることができることを確認しました。
プロビジョニングするリソースの範囲が広がると、この恩恵は大きいものとなります。
VPC、EC2 インスタンス、セキュリティグループ、RDS等を 1 つのテンプレートから、開発環境、テスト環境、本番環境にプロビジョニングする。開発環境で問題が発生した場合、現在のスタックを削除し、テンプレートから新たにスタックを作成すれば良い。
以上、Saki@猫好き がお送りしました。
引き続き、よろしくお願いいたします!
コメント