【CloudFormation入門2】テンプレート作成を効率化するバリデーション機能と自動実行シェルの紹介

2017.10.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

皆さん、CloudFormation、捗ってますか?

以前、こちらのエントリ(【CloudFormation入門1】5分と6行で始めるAWS CloudFormationテンプレートによるインフラ構築)で、CloudFormation未経験の方向けの入門記事を書きました。

今日の記事では、そんなCloudFormationのなんたるかを知った方向けに、CloudFormationのテンプレートの作成を効率化するちょっとしたTIPSを紹介いたします。

この記事の対象読者は上述の記事を読んでいることを前提としていますので、CloudFormationの基本概念などは説明しません。一度、簡単に目を通していただいて、知らない点などがないか確認いただくことをオススメいたします。

ほな、いってみよ。

テンプレートの検証機能を利用して文法エラーを潰す

CloudFormationには、テンプレートファイルの構文エラーを確認する専用のバリデーション機能があります。これを利用すれば、テンプレート作成後、「Webコンソール開いて、スタックを選んでS3アップロードして〜」なんて手間を省略できます。

AWS CLIから実施するので、事前に設定を済ませておいてください。

AWS Command Line Interface のインストール - AWS Command Line Interface

構文は非常に簡潔です。

$>aws cloudformation validate-template --template-body file://01_create_vpc.yaml

上記では、カレントディレクトリにある01_create_vpc.yamlを指定して、テンプレートを検証しています。

例として、下記のようなテンプレートを用意しておきます。ファイル名は、上と同じ01_create_vpc.yamlとします。後半、文法エラーを仕込んでいます。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
FirstVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Resources;
hamada-amema;

これにバリデーションをかけると、以下のようなエラーメッセージが表示されます。yamlの構造エラーで、何行目あたりがおかしいかなど原因表示してくれます。

$ aws cloudformation validate-template --template-body file://01_create_vpc.yaml

An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: YAML not well-formed. (line 9, column 1)

後半部分のエラーを取り除いて、再度バリデーションかけます。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
FirstVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16

エラーが解消されると、以下のメッセージが帰ってきます。

$ aws cloudformation validate-template --template-body file://01_create_vpc.yaml
{
"Parameters": []
}

エラーが無くなりましたね。これで、テンプレートファイルとしては、文法エラーが解消されたことがわかります。今回のテンプレートファイルにはパラメーターが含まれていませんが、含まれている場合は、テンプレート検証結果として、全てのパラメータの情報について返されます。

パラメータを含んだテンプレートファイルの、バリデーション結果例を紹介します。

$ aws cloudformation validate-template --template-body file://073_base.yaml
{
"Description": "VPC Network Template",
"Parameters": [
{
"DefaultValue": "base",
"NoEcho": false,
"Description": "Prefix of Name tags.",
"ParameterKey": "NameTagPrefix"
},
{
"DefaultValue": "10.0",
"NoEcho": false,
"Description": "First and Second Octet of VPC, For example xxx.xxx",
"ParameterKey": "VPCCIDR"
}
]
}

バリデーション利用上の注意

このバリデーションは、あくまでテンプレートの構文を確認するために利用するもので、リソースに対して指定したプロパティの値が整合性がとれているか、リソースが有効であるかなど、運用上の有効性確認はできません。

そのあたりは、実際にスタックを作成して、結果を確認する必要があるので、ご注意ください。

公式ドキュメント:validate-template — AWS CLI 1.11.163 Command Reference

ファイル保存時に自動的にバリデーションを実行

前章では、CloudFormationテンプレートのバリデーション機能を紹介しました。ただ、実際にテンプレートを修正したときに、都度確認コマンドを流すのも面倒なものです。そこで、テンプレートファイル保存時に、自動的にコマンドを実行する仕組みを活用しましょう。

mac限定となりますが、アプリケーションのインストールなどは不要で、シェルのみで動作する下記方法を参考にさせていただきました。ありがとうございます。

参考記事:指定したファイルの更新があったらコマンドを自動実行するシェルスクリプト - 午睡二時四十分

こちらの記事の後半、Mac版のソースをfilewatch.shという名前で保存します。

#!/bin/sh
if [ $# -ne 2 ]; then
        echo "実行するには2個の引数が必要です。
        第一引数: 監視対象ファイル名
        第二引数: 監視対象ファイルが更新された際に実行されるコ>マンド
        例: ./autoexec.sh a.cpp 'g++ a.cpp && ./a.cpp'"
        exit 1
fi
echo "監視対象 $1"
echo "実行コマンド $2"
INTERVAL=1 #監視間隔, 秒で指定
last=`ls -l -T $1 | awk '{print $8}'`
while true; do
        sleep $INTERVAL
        current=`ls -l -T $1 | awk '{print $8}'`
        if [ $last != $current ] ; then
                echo ""
                echo "updated: $current"
                last=$current
                eval $2
        fi
done

シェルに実行権限を付与します。

$ chmod +x filewatch.sh

第一引数に監視対象ファイル、第二引数に実行したいコマンドを指定し実行します。コマンドには、前章のテンプレートのバリデーションコマンドをそのまま指定しましょう。第二引数のコマンドはシングルクォーテーションで囲みます。

すると、テンプレートファイルを保存するたびに、監視タイミング(今回の例では1秒毎)で、自動的にテンプレートバリデーションを実行してくれます。

$ ./filewatch.sh 01_create_vpc.yaml 'aws cloudformation validate-template --template-body file://01_create_vpc.yaml'

監視対象 01_create_vpc.yaml
実行コマンド aws cloudformation validate-template --template-body file://01_create_vpc.yaml

updated: 23:11:41

An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: YAML not well-formed. (line 7, column 29)

updated: 23:11:53

An error occurred (ValidationError) when calling the ValidateTemplate operation: Template format error: YAML not well-formed. (line 7, column 8)

updated: 23:11:57
{
"Parameters": []
}

エディタとターミナル並べてみると、保存するたびにバリデーション結果が表示されるので、いろいろ捗ります。こんな感じですね。

010

実際に試してみるとよく分かるんですが、バリデーションの結果を確認するときに、「ここでウィンドウを切り替えてコマンド実行」の一手間がなくなるだけで、思考のスイッチコストが減り、テンプレートの作成作業に集中できます。よござんす。

このファイル保存によるコマンドの自動実行は、いくらでも応用が効くもの(markdown保存でhtml生成したり、簡単なビルドスクリプト走らせたり、なんやらかんやら)なので、是非一度試しておくことをオススメいたします。

AWS CLIを利用したスタックの作成

目指すテンプレートファイルが完成し、テンプレートのバリデーションもOKであれば、いよいよスタックを作成してみましょう。

ここもWebコンソールは使わずに、AWS CLI、cloudFormationの、create-stackコマンドを利用します。

スタック名にhamada-vpcを設定し、テンプレートファイルとして、01_create_vpc.yamlを指定しています。

$ aws cloudformation create-stack --stack-name hamada-vpc --template-body file://01_create_vpc.yaml
{
"StackId": "arn:aws:cloudformation:ap-northeast-1:629895769338:stack/hamada-vpc/a8b70630-a84b-11e7-ad60-50a686699882"
}

webコンソールを確認し、無事スタックが作成されていたらOKです。

020

公式ドキュメント:create-stack — AWS CLI 1.11.163 Command Reference

AWS CLIを利用したスタックの削除

スタック作ってしまった後、「なんか違うやん」となったときも、スタックの削除をすれば、関連リソースはきれいになくなってくれます。

$ aws cloudformation delete-stack --stack-name hamada-vpc

公式ドキュメント:delete-stack — AWS CLI 1.11.163 Command Reference

その他、CloudFormationにおけるAWS CLIの利用については、下記ドキュメントに簡潔にまとまっていますので、一度目を通しておくと、代表的なコマンドが把握できるのでオススメです。

AWS コマンドラインインターフェイスの使用 - AWS CloudFormation

まとめ:CloudFormationの作成をコマンドベースで効率化しよう

ここまで、いかがでしょうか。本記事では、CloudFormationの作成に関わる機能について、コマンドラインで実施するための基礎について紹介しました。

  • テンプレートの事前バリデーション
  • ファイル保存時のバリデーション自動実行
  • AWS CLIを利用したスタックの作製
  • AWS CLIを利用したスタックの削除

Webコンソールでの作業に慣れてきた後は、こういったコマンドラインベースの作業にシフトしたほうが、さらなる効率化を図れる場合が多いので、積極的に試してみましょう!

それでは、今日はこのへんで。濱田でした。