CFnのテンプレート開発時に便利なAWS CLIコマンドについて

記事タイトルとURLをコピーする

はじめに

こんにちは。SRE2課福島です。

久しぶりに姪っ子にあったら、もう歩けるようになっていて、成長の早さに驚いた今日この頃です。

さて今回は、CloudFormation(以降、CFn)のテンプレートを開発する機会があり、その際に、よく使ったAWS CLIのコマンドを紹介します。

紹介するコマンド

①スタックを作成するコマンド
②スタックを削除するコマンド
③スタックの実行結果を確認するコマンド
④テンプレートをチェックするコマンド

①スタックを作成するコマンド
aws cloudformation create-stack \
--stack-name [スタック名] \
--template-body [テンプレのパス] \
--capabilities CAPABILITY_NAMED_IAM \
--parameters [パラメーターファイル※]

※一般的な用語ではなく、パラメーターを記載したファイルのことを本記事では、パラメーターファイルを記載しております。

オプション 説明
--stack-name(必須) 任意
(例:test-stack)
スタックの名前を入力します。
--template-body(必須) 任意
(例:file://stack.yml)
テンプレート名を入力します。
--capabilities(任意) CAPABILITY_IAM
or
CAPABILITY_NAMED_IAM
テンプレート内でIAMリソースを作成する場合、必要なオプションです。
迷ったら、「CAPABILITY_NAMED_IAM」でOKです。
--parameters(任意) 任意
(例:file://parameter.txt)
テンプレートでパラメーターを使う場合、パラメーターの値を定義したファイルを指定します。

※CAPABILITY_IAMとCAPABILITY_NAMED_IAMの違い

CLI で、aws cloudformation create-stack および aws cloudformation update-stack コマンドを使用する場合は、--capabilities パラメータに CAPABILITY_IAM または CAPABILITY_NAMED_IAM 値を指定します。テンプレートに IAM リソースがある場合、いずれかの機能を指定できます。テンプレートの IAM リソースにカスタム名がある場合、CAPABILITY_NAMED_IAM を指定する必要があります。

◆AWS CloudFormation テンプレートでの IAM リソースの承認 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-iam-template.html

実行例)

 aws cloudformation create-stack \
--stack-name test-stack \
--capabilities CAPABILITY_NAMED_IAM \
--template-body file://mlcluster.template \
--parameters file:///tmp/marklogic.txt
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXX:stack/test-stack/ccbc5020-d9db-11ea-9c03-0e0e3248afe0"
}
(Tips)パラメーターファイルの作成方法

パラメーターファイルは、もっといいやり方はあるかもですが、 jqとsedコマンドを使うことで楽に作成できるかと思います。

aws cloudformation validate-template \
--template-body [テンプレートのパス] | \
jq -r '.Parameters[] | {"ParameterKey":.ParameterKey,"ParameterValue":.DefaultValue}' | \
sed -e 's/}/},/g' -e '$ s/},/}/g' -e '$ a ]' -e '1i ['
オプション 説明
--template-body(必須) 任意
(例:file://stack.yml)
テンプレート名を入力します。

実行例)

# aws cloudformation validate-template \
--template-body [テンプレートのパス] | \
 jq -r '.Parameters[] | {"ParameterKey":.ParameterKey,"ParameterValue":.DefaultValue}' \
| sed -e 's/}/},/g' -e '$ s/},/}/g' -e '$ a ]' -e '1i ['
[
{
  "ParameterKey": "VolumeEncryption",
  "ParameterValue": "enable"
},
{
  "ParameterKey": "NumberOfZones",
  "ParameterValue": "3"
},
{
  "ParameterKey": "NodesPerZone",
  "ParameterValue": "1"
},
{
  "ParameterKey": "LogSNS",
  "ParameterValue": "none"
},
{
  "ParameterKey": "VPC",
  "ParameterValue": null
},
{
  "ParameterKey": "KeyName",
  "ParameterValue": null
},
{
  "ParameterKey": "SpotPrice",
  "ParameterValue": "0"
},
{
  "ParameterKey": "VolumeType",
  "ParameterValue": "gp2"
},
{
  "ParameterKey": "PrivateSubnets",
  "ParameterValue": null
},
{
  "ParameterKey": "VolumeEncryptionKey",
  "ParameterValue": ""
},
{
  "ParameterKey": "PublicSubnets",
  "ParameterValue": null
},
{
  "ParameterKey": "AZ",
  "ParameterValue": null
},
{
  "ParameterKey": "AdminUser",
  "ParameterValue": null
},
{
  "ParameterKey": "InstanceType",
  "ParameterValue": "r5.4xlarge"
},
{
  "ParameterKey": "VolumeSize",
  "ParameterValue": "10"
},
{
  "ParameterKey": "AdminPass",
  "ParameterValue": null
},
{
  "ParameterKey": "IAMRole",
  "ParameterValue": null
},
{
  "ParameterKey": "Licensee",
  "ParameterValue": "none"
},
{
  "ParameterKey": "LicenseKey",
  "ParameterValue": "none"
}
]
#

このコマンドの実行結果をファイルに出力し、「ParameterValue」の値を修正すれば、パラメーターファイルの完成です。

テンプレートでパラメーターのデフォルト値を指定している場合、 デフォルト値が入るようになっています。(設定していなければ、noneになります。)

パラメーターが複数あるテンプレートを開発する際に、AWSマネジメントコンソールを 利用していると何度もパラメーターを入力しないといけなくなるので、 そこが一番、時間がかかってしまうと思っております。

なので、このコマンドを使い、さくっとパラメーターファイルを作成しておけば、 スタック作成を苦なく実行することができるので、大変便利かなと思っています。

②スタックを削除するコマンド
aws cloudformation delete-stack \
--stack-name [スタック名]
オプション 説明
--stack-name(必須) 任意
(例:test-stack)
スタックの名前を入力します。
③スタックの実行結果を確認するコマンド

以下のコマンドの「StackStatus」項目でスタックの実行結果を確認することができます。

aws cloudformation list-stacks \
--query "StackSummaries[].{StackName:StackName,CreationTime:CreationTime,StackStatus:StackStatus}" \
--output table

実行例)

aws cloudformation list-stacks \
--query "StackSummaries[].{StackName:StackName,CreationTime:CreationTime,StackStatus:StackStatus}" \
--output table
--------------------------------------------------------------------------------------------------------------------------------------------
|                                                                ListStacks                                                                |
+-----------------------------------+-----------------------------------------------------------------------------------+------------------+
|           CreationTime            |                                     StackName                                     |   StackStatus    |
+-----------------------------------+-----------------------------------------------------------------------------------+------------------+
|  2020-08-09T01:02:17.637000+00:00 |  test-stack-NodeMgrLambdaStack-1KDOVU053ZRC3                                      |  CREATE_COMPLETE |
|  2020-08-09T01:01:24.791000+00:00 |  test-stack-ManagedEniStack-1WEALNQSEH0ZA                                         |  CREATE_COMPLETE |
|  2020-08-09T01:01:04.647000+00:00 |  test-stack                                                                       |  CREATE_COMPLETE |
|  2020-08-07T08:28:39.055000+00:00 |  marklogic-stack-02-NodeMgrLambdaStack-1TADYJOPOE2FB                              |  DELETE_COMPLETE |
|  2020-08-07T08:27:45.736000+00:00 |  marklogic-stack-02-ManagedEniStack-DGDVQ0R4WQA3                                  |  DELETE_COMPLETE |
:省略

問題があった場合は、AWS CLIでは原因特定が難しいと思いますので、 AWSマネジメントコンソールを確認した方が早いと思います。

ちなみにですが、以下のコマンドで正常に作成されたスタック一覧を確認できます。
※--stack-status-filterオプションでステータスが「CREATE_COMPLETE」となっている
 スタックだけ、抽出しています。

aws cloudformation list-stacks \
--stack-status-filter CREATE_COMPLETE \
--query "StackSummaries[].{StackName:StackName,CreationTime:CreationTime}" \
--output table

実行例)

# aws cloudformation list-stacks \
--stack-status-filter CREATE_COMPLETE \
--query "StackSummaries[].{StackName:StackName,CreationTime:CreationTime}" \
--output table
-------------------------------------------------------------------------------------------------------------------------
|                                                      ListStacks                                                       |
+-----------------------------------+-----------------------------------------------------------------------------------+
|           CreationTime            |                                     StackName                                     |
+-----------------------------------+-----------------------------------------------------------------------------------+
|  2020-08-05T03:13:36.236000+00:00 |  account-setup                                                                    |
|  2020-02-20T07:46:10.225000+00:00 |  ec2-instance-profile-role                                                        ||
+-----------------------------------+-----------------------------------------------------------------------------------+
④テンプレートをチェックするコマンド
aws cloudformation validate-template \
--template-body [テンプレートのパス] | \
オプション 説明
--template-body(必須) 任意
(例:file://stack.yml)
テンプレート名を入力します。

上記の通り、テンプレートをチェックするコマンドが用意されていますが、 このチェックがOKになった場合でも、正常にスタックが作成できない場合がありますので、注意が必要です。

なので、このコマンドを実行するより、 実際に、スタックを作成して正常に実行されることを確認した方が良いと思います。
※私がテンプレートを作成した際には、パラメーターファイルを作成する以外の用途では、使いませんでした。

最後に

今回は、CFnのテンプレートを開発時によく使うAWS CLIコマンドをまとめてみました。
テンプレートを開発する方の参考になれば幸いです。

それでは、またの機会にお会いしましょ~

福島 和弥 (記事一覧)

SRE2課

2019/10 入社

AWS CLIが好きです。