CloudFormation作成を効率化するValidate Template機能について


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

はじめに

おつかれさまです、第三システム部の稲村です。
DevOpsの試験問題を解いてるなか、CFn作成を効率化するためのValidate Template機能なるものを初めて知りました。
自身のCFnテンプレートが正しい文法に則っているかをターミナルで確認できるので、CFnゼンゼンワカラナイ自分にとっては大変便利な機能でした。
毎回テンプレートを更新後、マネージメントコンソールを開いて→CFn画面→スタックのアップロード→失敗、、、、の流れから解放されそうです。

まとめ

早速まとめですが、今回利用するコマンドを記述します。

ただしAWS CLIから実施しますので、CLIの事前設定はお願いします。
AWSドキュメント:AWS CLI の最新バージョンをインストールまたは更新します

コマンドをターミナルに入力し、【調べたいCFnテンプレート】のファイル名を入力して下さい。
正しければパラメータの値が返ってくる(例では何も設定していないので空が返る)
誤りがあればエラーメッセージが返ってくる

aws cloudformation validate-template --template-body file://【調べたいCFnテンプレート】.yml

挙動の確認

用意したテンプレート: cfn-vpc-sample.yml

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

コマンド実行結果:正しい場合(用意したテンプレでは何も設定していないため、パラメータは空)

aws cloudformation validate-template --template-body file://cfn-vpc-sample.yml
{
    "Parameters": []
}

誤っているテンプレートを作成

先ほどのテンプレート: cfn-vpc-sample.ymlに、誤りになる部分(7行目)を追記

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

コマンド実行結果:誤っている場合

テンプレートフォーマットエラーが返され、間違っている部分付近の情報が返ってくる

aws cloudformation validate-template --template-body file://cfn-vpc-sample.yml

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

ファイル保存時に自動的にコマンドを実行するシェルスクリプト作成

毎回コマンドを入力するのも面倒なので、自動的に更新された場合コマンドを実行するシェルスクリプトの例を記載します。

下記ファイルを 、check-cfn.shで保存する

#!/bin/bash
# CFn ValidateTemplate機能を利用した文法チェック

# INTERVALでチェックする間隔を秒数指定
INTERVAL=1
CMD='aws cloudformation validate-template --template-body file://'

#引数でファイルが渡されているかの確認
if [ $# -ne 1 ]; then
  echo '実行するに引数:ファイル名.ymlまでの入力が必要です'
  exit 1
fi

# タイムスタンプが更新されていればValidateTemplateを実行
echo "$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 "$CMD$1"
        fi
done

作成しただけでは実行権限がないため、実行権限を付与することも忘れずに

chmod +x check-cfn.sh

※実行されると、実行された時点"から"の変更をチェックするので、対象のファイルが変更されるまで画面上では待機待ちのような状態となります。

シェルスクリプト実行結果: ターミナル画面

1・2行目:シェルスクリプトにcfn-vpc-sample.ymlを引数として実行
4・6行目:対象ファイルcfn-vpc-sample.ymlにCFn文法に誤りがある状態
8-11行目:対象ファイルcfn-vpc-sample.ymlのCFn文法は正しい状態

bash check-cfn.sh cfn-vpc-sample.yml                                          
cfn-vpc-sample.yml の文法をチェックします

updated: 10:16:59

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

updated: 10:17:08
{
    "Parameters": []
}

おわりに

全然知りませんでした。かなりの時間短縮になったのもですが、なによりCFnを記述するハードルが下がったことが1番の収穫でした。
そして資格勉強するもんですね、自分の知らないことが増えていくのは単純に楽しいことです。

Last modified: 2022-09-25

Author