CloudFormationをawscliによる操作に絞った上で0から最小限の要素を使って取り組んでみた

CloudFormationをawscliからの操作に限定し、最小限の要素を使って、テンプレート作成〜テンプレート構文チェック〜自動生成の手続きを検証してまとめました。
2018.10.29

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

現目標の一つに、AWS認定試験アソシエイトでの3冠を置いているhaoyayoiです。

認定試験は勿論、AWS環境の自動構築に対する理解を深める過程において、CloudFormationは欠かせない要素の一つです。

ですが、個人的には領域の広さ故か取っ掛かりが中々掴めませんでした。 どうしたものかと思案していましたが、弊社サービスGスタッフより「awscliからの操作に限定して触ってみては」とアドバイスがありました。そこで、実作業手続きを完全にawscliに絞った上で

  1. YAMLでの極力最小限要素によるテンプレート作成
  2. テンプレート構文チェック
  3. 自動構築

の流れにて取り組んでみました。なお、このエントリーではYAMLそのものについて詳しくは触れません。

目次

CloudFormation概要

CloudFormationについては、概要ページ及びBlackBeltにまとめられています。

BlackBelt

awscliでのCloudFormation

利用可能なコマンドについては

% awscli cloudformation help

にて確認することができます。 複数のコマンドが存在しますが、まずはテンプレート文法確認に用いるvalidate-templateに触れてみます。

validate-templateコマンド構成

以下のコマンドオプションが存在します。今回はローカル環境でのYAML形式ファイルを用いるため、template-bodyのみ指定します。

  • --template-body
  • --template-url
  • --cli-input-json
  • --generate-cli-skeleton

ローカル環境上でのテンプレートファイルは--template-bodyにfile:///でアクセスします。

% aws cloudformation validate-template --template-body file:///path/to/template.yml

CloudFormationテンプレートの作成

テンプレート構文詳細は AWSドキュメント - テンプレートの分析にて確認することができます。

テンプレートパラメータ

必須パラメータはResourcesのみです。スタックリソースとそのプロパティの指定に用いられます。

テンプレートに関する説明が必要な場合はDescriptionに記載しますが、その際はAWSTemplateFormatVersionの指定も伴います。2018年10月29日時点では2010-09-09のみ有効です(via: AWSドキュメント - 形式バージョン)。

なお、Descriptionに日本語等のマルチバイト文字を指定した場合、構築時にエラーは発生しませんが、生成されたリソース上で意図した文字列による表示が行われません。

AWSTemplateFormatVersion
任意:AWS CloudFormation テンプレートバージョン(2010-09-09)
Description
任意:テンプレートに関する説明
Resources
必須:スタックリソースとそのプロパティ

Descriptionに指定をいれた場合のテンプレート構成は以下の通りです。

AWSTemplateFormatVersion: 2010-09-09 
Description: sample
Resources:

ただし、この内容ではResourcesに何のリソースも指定されていないため、validate-templateに通した場合ValidationErrorエラーが発生します。

% aws cloudformation validate-template --template-body file:///path/to/template.yml
An error occurred (ValidationError) when calling the ValidateTemplate operation: [/Resources] 'null' values are not allowed in templates

今回はResourcesにS3のリソースを指定することでエラーを対処してみます。

リソースの指定

Resources以下にリソースを指定する際に、以下の要件を満たす論理IDを設定します。

  • テンプレート内で重複のない一意
  • 英数字(A-Za-z0-9)の組み合わせ

論理IDの下にTypeとPropertiesを指定します。Typeの指定は必須です。Typeに指定可能な識別子の一覧は AWSドキュメント - AWS リソースプロパティタイプのリファレンスに掲載されています。

Type
必須:リソースを識別するリソースタイプ
Properties
任意:リソースに対して指定できる追加オプション

今回はS3ですので、AWS::S3::Bucketを指定します。

AWSTemplateFormatVersion: 2010-09-09 
Description: sample
Resources:
  MyS3: #論理ID
    Type: AWS::S3::Bucket

この状態でvalidate-templateに通すと、正常な構成であるとして、以下の結果が出力されます。

% aws cloudformation validate-template --template-body file:///path/to/template.yml
{
    "Parameters": [],
    "Description": "sample"
}

自動構築

リソースの生成

validate-templateにて正常なステータスが返ってきたので、次にcreate-stackにて自動構築を行ってみます。stack-nameが必須オプションです。

% aws cloudformation create-stack --template-body file:///path/to/template.yml --stack-name handson-test
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxxxxxxx:stack/hands-on/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

構築したスタックのステータスをdescribe-stacksにて確認します。stack-nameが必須オプションです。

% aws cloudformation describe-stacks --stack-name hands-on
{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxxxxxxx:stack/hands-on/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "StackName": "hands-on",
            "Description": "sample",
            "CreationTime": "2018-10-29T05:56:26.057Z",
            "RollbackConfiguration": {},
            "StackStatus": "CREATE_COMPLETE",
            "DisableRollback": false,
            "NotificationARNs": [],
            "Tags": [],
            "EnableTerminationProtection": false
        }
    ]
}

リソースの削除

正常なステータスが確認できたら、生成されたリソースには通常通りの料金が掛かるため、delete-stackで念の為削除しておきます。成功時のステータスは表示されませんが、describe-stacks等で確認するのも手です。

% aws cloudformation delete-stack --stack-name hands-on
% aws cloudformation describe-stacks --stack-name hands-on
An error occurred (ValidationError) when calling the DescribeStacks operation: Stack with id hands-on does not exist

まとめ

使用した要素は本当に最小限ですが、実際にCloudFormationを利用する際の手続きについて書き起こしてみました。今回はS3のみを対象としましたが、S3以外の複数リソースも合わせて生成する際の手続き検証等も引き続き行っていこうと思います。