はじめに
以前の記事で何度か紹介してきたBlack Belt Online Seminarの記事ですが、2020年度版が公開されたようです。
前回からのアップデートの内容や、新たなツールの紹介もされているので、色々と参考になります。
さて、前回はGUI画面上から値を入出力させましたが、今回は今までGUIで行ってきたスタックの作成&削除をコマンドで操作してみようと思います。
CloudFormationコマンド
普段使いそうなコマンドを抜粋しました。
その他のコマンドや詳細は以下を参照して下さい。
| 内容 | コマンド |
|---|---|
| スタックの作成(ローカルファイル) | aws cloudformation create-stack --template-body [ファイル格納場所] --stack-name [stack名] |
| スタックの作成(リモートURL) | aws cloudformation create-stack --template-url [ファイル格納場所] --stack-name [stack名] |
| スタックの作成(入力項目指定) | aws cloudformation create-stack --template-[body/url] [ファイル格納場所] --stack-name [stack名] --parameters [データタイプ(後述)/jsonファイル格納場所] |
| テンプレートの構文チェック | aws cloudformation validate-template --template-[body/url] [ファイル格納場所] |
| スタックイベント履歴の表示 | aws cloudformation list-stacks |
| リソースのリスト表示 | aws cloudformation list-stack-resources --stack-name [stack名] |
| 実行中スタックの表示 | aws cloudformation describe-stacks --stack-name [stack名] |
| スタックの削除 | aws cloudformation delete-stack --stack-name [stack名] |
- Parametersのデータタイプ
| 内容 | コマンド |
|---|---|
| パラメータに関連付けられた値 | ParameterKey=[string],ParameterValue=[string] |
| 既存パラメータ値の使用 | ParameterKey=[string],UsePreviousValue=[boolean] |
| SSMパラメータのスタック定義に使用される値 | ParameterKey=[string],ResolvedValue=[string] |
作業用EC2インスタンスへのファイルコピー
前回作成したテンプレートを、「その1:前準備」で準備した作業用EC2インスタンスに格納しておきます。
今回はコピー後のテンプレート名をcloudformation.yamlとします。
aws s3 cp s3://cf-templates-xxxxxxxxxxxx-[リージョン名]/xxxxxxxxxx-designer/new.templatexxxxxxxxxxx ./cloudformation.yaml
VS Codeで作業用EC2インスタンスへ接続
「その1:前準備」で書き忘れていましたがVSCodeの拡張機能であるRemote DevelopmentをインストールしてRemote DevelopmentでEC2インスタンスに接続します。(Remote Developmentのインストール&セットアップは、他サイトを参考にして下さい)
EC2インスタンスの追加
前回のテンプレートにEC2インスタンスを追加してみようと思います。
構成は前回作成したVPC、Subnetの中に新しくEC2インスタンスを追加した構成を想定しています。
上図の構成を組んだ際に生成されるEC2インスタンスのコードは以下となります。
Resourcesセクションの記載は、前回作成したテンプレート内に記載されているので、Resources行を抜かしたコードをVPC、Subnetリソースの後ろにコピペしておきます。
Resources:
EC2I3Q8S8:
Type: 'AWS::EC2::Instance'
Properties:
NetworkInterfaces:
- SubnetId: !Ref EC2SJOWQ
必要パラメータの追加(AMI設定)
「EC2インスタンスのテンプレートリファレンス」で必須項目を確認するとImageIdが条件付きとなっている以外は特に必須項目は無いようです。
ImageIdはEC2インスタンスを作成する際に選択する以下AMIのIDになります。
今回はAmazon Linx2 AMI (64ビットx86)のAMIを選択しようと思いますが、EC2インスタンステンプレートのエンティティのうち、InstanceTypeのデフォルト値はm1.smallとなります。
ただ、Amazon Linx2 AMI (64ビットx86)にはm1.smallのインスタンスタイプは無いためInstanceTypeも明示的に指定する必要があります。
必要パラメータの追加(NetworkInterface設定)
EC2インスタンステンプレートリファレンスの「NetworkInterface」を確認すると、DeviceIndexが条件付きとなっており、今回はDeviceIndexの記載も必要となります。
EC2インスタンスの設定
最終的なEC2インスタンスのテンプレートは以下となりました。
EC2I3Q8S8:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: ami-0cc75a8978fbbc969
InstanceType: t2.micro
NetworkInterfaces:
- SubnetId: !Ref EC2SJOWQ
DeviceIndex: 0
コマンドからの実行
EC2インスタンスの追加も行ったので、実際にコマンド操作でスタックを作成していこうと思います。
尚、後述するコマンドの指定パラメータは以下表の通りとなるので、適宜読み替えて下さい。
| 内容 | パラメータ |
|---|---|
| スタック名 | stack-test |
| テンプレートファイルのパス | /home/ec2-user/cloudformation.yaml |
| パラメータファイルのパス | /home/ec2-user/param.json |
コマンドからのスタック作成
aws cloudformation create-stack コマンドで作成が可能ですが、前回の作業で入力項目を追加していることから、--parametersオプションで入力項目を追記する必要があります。
aws cloudformation create-stack --template-body file:///home/ec2-user/cloudformation.yaml --stack-name stack-test --parameters ParameterKey=VPCRange,ParameterValue=172.24.0.0/16 ParameterKey=SubnetRange,ParameterValue=172.24.0.0/24
パラメータは直接コマンドオプションで記載する以外に、json形式のファイルを読み込むことも可能です。(yaml形式不可)
以下、/home/ec2-userの配下にparam.jsonというパラメータファイルを作成した場合の例。
[
{ "ParameterKey" : "VPCRange", "ParameterValue" : "172.24.0.0/16" },
{ "ParameterKey" : "SubnetRange", "ParameterValue" : "172.24.0.0/24" }
]
aws cloudformation create-stack --template-body file:///home/ec2-user/cloudformation.yaml --stack-name stack-test --parameters file:///home/ec2-user/param.json
おわりに
インプットパラメータを長々書くのは可読性が悪く分かりづらいと感じていましたが、ファイルにまとめられるのは良いですね。
次回はMappingsセクションなどを使ってみようと思います。

