ちょっと話題の記事

AWS CloudFormationユーザーガイド – 構成要素・概念について

2013.10.21

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

現在、AWSのインフラ構築には欠かせないサービスとなっている『AWS CloudFormation』。弊社ブログでも関連エントリ本数が急増中です。

そんな私もAWS CloudFormationにはお世話になって来ている今日この頃ですので、より広く深く理解を深めていくにあたって公式ドキュメントを読み解き、ざっくり翻訳もがっしがしと増やして行こうかと思います。まずは導入・要素解説のドキュメントから。時間を見付けて後続のドキュメントも読み進めて行きたいと思います。


ようこそ、CloudFormationへ!

AWS CloudFormationユーザーガイドはサービスの使い方について解説しています。

  • AWS CloudFormationではAWSのインフラ構成を繰り返し&想定通りに作成し、プロビジョニング(供給・準備)する事が出来ます。
  • CloudFormationは、EC2,EBS,S3,ELB,AutoScalingのようなAWS製品をあなたが活用する手助けとなります。基盤となるAWSインフラの作成及び構成を気にする事無く、信頼性が高く、スケーラブルで、費用対効果の高いアプリケーションを構築出来ます。
  • AWS CloudFormationでは、単一のユニット(スタック)として一括でリソースのコレクションを作成・削除するための"テンプレートファイル"を使う事が出来ます。

(以下はドキュメント内ロードマップです。どれも興味深い内容ですが一度に進める事は出来ないので、時間を見て追々読み解き進め、ざっくり日本語化して行ければと思ってますので長〜い目で生温かく見守って頂ければと思います。|ω・) )

何をしたい…? 関連するセクション ブログ内エントリ
AWS CloudFormationが私のニーズと合致するか判断したい AWS CloudFormation(AWS リソース作成テンプレート)
| アマゾン ウェブ サービス(AWS 日本語)
------
まずはAWS CloudFormationを始めてみたい Getting Started with AWS CloudFormation
(AWS CloudFormationを始める)
特定タスクの実践方法をみつけたい Modifying AWS CloudFormation Templates
(AWS CloudFormarionテンプレートの変更)
AWS CloudFormationがどのように動作するのかを学びたい Introduction
(はじめに)
当エントリ内
次項にて解説
AWS CloudTemplateについて知りたい Working with AWS CloudFormation Templates
(AWS CloudFormationテンプレートを使って作業する)
自分のテンプレートファイルで使用出来る
スターターテンプレートフラグメントが欲しい
Template Snippets
(テンプレートのスニペット)
テンプレートファイルの記述例を見てみたい Example Templates
(テンプレート例)
テンプレートの使い方・修正方法を知りたい Working with AWS CloudFormation Templates
(AWS CloudFormationテンプレートを使って作業する)
AWS CloudFormationツールの使い方を知りたい Command Line Tools Reference
(コマンドラインツールリファレンス)
AWS CloudFormationのテンプレートサンプルについて知りたい Template Anatomy
(テンプレートの解剖)
Template Reference
(テンプレートリファレンス)

 

はじめに

AWS CloudFormationでは、スタックと呼ばれるユニット(単位)と関連するリソースの作成及び削除を行う事が出来ます。そこでは、テンプレート(JSON準拠のファイル)を用い、スタックパラメータ、マッピング、リソースプロパティ、アウトプット等の"特性"を定義します。テンプレートファイルはスクラッチで一から記述するか、我々(AWS)が提供するテンプレート例のいずれかを使用して起動する事が出来ます。

AWS CloudFormationを使うことで、EC2、Elastic Beanstalk、RDS(完全なリストについては、リソース·プロパティ·タイプ·リファレンスを参照してください)と言ったようなAWSプロダクトも併せて利用する事が出来ます。以下のセクションでは、より詳細にこれらCloudFormationの概念を紹介して行きます。

AWS CloudFormaionの構成要素 もくじ

 

スタック(Stacks)

一緒に管理したいAWSリソースの集まりです。CloudFormationを使って、スタックに対して以下の様な操作を行う事が出来ます。(コマンドはAWS CLIで用いる各種コマンドとなります。)

  • aws cloudformation create-stack:スタックを定義するテンプレートを指定し、名前を設定する事でCloudFormationのスタックを作成します。
  • aws cloudformation describe-stack-events:生成操作の進行状況を追跡します。AWS CloudFormationではリソースの依存関係を考慮して、スタックの作成時にメンバー・リソース作成の順序を最適化しているので、リソース作成順序を予測する事は出来ません。このコマンドではそれらの進行状況を監視する事が出来ます。
  • aws cloudformation describe-stacksまたはusing aws cloudformation list-stacksを使用し、特定のスタック名やステータスによるフィルタリングを行う事で、スタックを一覧表示します。実行中のスタックや作成中or削除中のスタックは、aws cloudformation describe-stacksコマンドで一覧表示の対象となります。任意のステータスを持っているスタックを一覧表示する(そして必要とあらばそのステータスでフィルタリングする)ために、aws cloudformation list-stacksコマンドを使う事が出来ます。
  • aws cloudformation describe-stack-resourcesコマンドを使う事で、スタックの内容を箇条書きで表示します。このコマンドは、個々のメンバーリソースの状態を確認出来るように、スタックが作成または削除されている状態でも実行する事が出来ます。
  • aws cloudformation describe-stack-eventsコマンドを使う事で、スタックによって生じるイベントの履歴を表示します。必要に応じて特定のスタック名でフィルタリングする事も出来ます。削除されたスタックのイベントは、90日間閲覧が可能です。
  • aws cloudformation delete-stackを使ってスタックを削除します。スタックを削除すると、関連するそれぞれのメンバーリソースも同様に削除されます。生成時と同様に、AWS CloudFormationは削除の順序を最適化しますので、順序は予測出来ません。あなたは、aws cloudformation describe-stack-eventsコマンドを使って削除の進行状況を追跡し、aws cloudformation list-stacksコマンドを使って削除されたスタックを一覧表示する事が出来ます。

AWS CloudFormationでは、全てのメンバー・リソースが一括で作成または削除される事を確認しています。なぜならAWS CloudFormationは1つのユニットとしてスタックの各要素を扱うので、そのひとまとまりで正常に処理されなければならないからです。何かしらの理由でメンバー・リソースが作成出来ない場合は、自動的に作成されたメンバー・リソースを削除し、スタックをロールバックします。

 

テンプレート(Templates)

スタックを定義する、JSON規格に準拠したテキストファイルです。JSON形式の詳細についてはJSON をご参照ください。

テンプレートでは、構築したいAWSインフラ構成の要件についての情報を記述します。テンプレートはただのテキストファイルなので、ソースコード管理システムでそれらを編集し、管理する事も出来ます。

テンプレートでは、以下の6つの主要なオブジェクトを宣言する事が出来ます。リソース以外の要素はオプションです。最低限、1つのリソースのみを宣言する必要があります。

  • テンプレート形式のバージョン(template's format version)
  • 説明(description)
  • パラメータ(parameters)
  • マッピング(mappings)
  • リソース(resources)
  • アウトプット(outputs)

以下例は、プロパティを持たない、単一のリソースを宣言したテンプレートです。

{
    "Resources" : {
        "MyQueue" : {
            "Type" : "AWS::SQS::Queue",
            "Properties" : {
            }
        }
    }
}

リソースには、一般的にそのリソースを作成するために必要な値が含まれている、プロパティのセクションがあります。任意のプロパティを宣言する必要が無い場合はセクションを省略可能です。

ファイルのシンタックスエラーをチェックするために、aws cloudformation validate-templateコマンドを使う事が出来ます。(注意:このコマンドはテンプレートの構文のみをチェックするように設計されており、リソースに指定したプロパティの値がそのリソースにとって有効かどうかまでは保証していません。また、スタックが作成される際に存在するリソースの数を決定しません。)

運用の妥当性をチェックするには、スタックを作ってみる必要があります。AWS CloudFormationスタック用のサンドボックスまたはテスト領域と言ったものは特に無いので、テスト中は作成したリソースを普通に使う事が出来ます。

フォーマットのバージョン(Format Version):必須
テンプレートフォーマットバージョンは記載されたテンプレートに対するAWS CloudFormationのテンプレートバージョンを指定します。
重要:
テンプレート形式のバージョンは、APIまたはWSDLバージョンと同じではありません。テンプレート形式のバージョンは独立してAPIとWSDLのバージョンを変更することができます。
説明(Optional Description):省略可能
オプションとして、説明情報を自由形式で有効なJSONテキスト文字列で関連付ける事が出来ます。テンプレートを文書化する事が出来、最大4000字までの指定が可能です。
パラメータ(Optional Parameters):省略可能
Parameterセクションに記載されています。
パラメータを使用すると、テンプレートの実行時に値を渡す事が出来、テンプレートのリソースと出力セクションで間接参照する事が出来ます。
サンプルテンプレートの殆どはパラメータセクションを宣言します。詳細についてはパラメータ(Parameters)の項を参照。また、パラメータセクション形式に関する技術的な詳細については、Mappings Declarationをご参照ください。
マッピング(Optional Mappings):省略可能
Mappingsセクションでは、条件付きの値を宣言する事が出来ます。Mappingsは、組み込み関数Fn::FindInMapを使用してResoures及びOutputsセクションで間接参照する事が出来ます。サンプルテンプレートのうち2つは、Mappingsセクションを宣言しています。(Example Templatesをご参照ください)
Mappingsに関してはマッピング(Mappings)の項で詳細を解説。また、Mappingsセクションに関する技術的な詳細については、Mappings Declarationをご参照ください。
リソース(Resources)
スタックのメンバーリソースは、Resourceセクションに記載されています。各リソースは別々に表示され、その特定のリソースを作成するために必要なリソースのプロパティを指定しています。リソースは、ResourceセクションとOutputsセクションにて、間接参照する事が出来ます。それらのプロパティは、リテラル、Resource、Parameters、pseudo parameters(擬似パラメータ)、及びintrinsic functions(組み込み関数)に設定する事が出来ます。詳細については、Resource Propertiesの項をご参照ください。
サンプルテンプレートでは、全ての例でResourcesセクションを宣言しています。(Example Templatesを参照)。 リソースについては、リソースプロパティ(Resource Properties)でより詳細に解説しています。Resourcesセクションのフォーマットについての技術的詳細は、Properties Declarationをご参照ください。
リソースプロパティ(Resource Properties)
もしリソースがプロパティの宣言を必要としない場合、このセクションは省略する事が出来ます。リソースプロパティは文字列やリソース(Resources)、パラメータ(Parameters)、擬似パラメータ(Pseudo Parameters)、及び組み込み関数に設定する事が出来ます。
サンプルテンプレートの殆どは、1つ以上のプロパティを宣言しています(Example Templatesを参照)。リソースプロパティはリソースプロパティ(Resource Properties)にて詳しく説明されています。また、Propertiesセクションのフォーマットについての技術的な詳細については、Properties Declarationをご参照ください。
アウトプット(Optional Outputs)
Outputsセクションでは、必要に応じてカスタム値を定義する事が出来ます。その値はAWS CloudFormationのdescribe-stacksコマンドへレスポンスとして返却され出力されます。
これらOutputの値は、リテラル、リソース、パラメータ、擬似パラメータ、および固有関数に情報を含めることが可能です。全てのサンプルテンプレートで、Outputsセクションが宣言されています(Example Templatesを参照)。Outputsの詳細はアウトプット(Outputs)にてより詳細に言及されています。また、Outputsセクションのフォーマットについての技術的詳細については、Outputs Declaration をご参照ください。

 

パラメータ(Parameters)

ParametersはテンプレートのParametersセクションに定義するための値となります。パラメータは、デフォルト値を有する事が出来ます。aws cloudformation create-stack --parametersオプションの値の一部として特定の値を指定した場合、そのデフォルト値は上書きされます。

パラメータを指定すると、実行時にあなたが上書きした値は、aws cloudformation describe-stacksコマンドの返り値として表示されます。(Parameter宣言でNoEchoプロパティにtrueを指定して抑制しない限り。) NoEchoプロパティを使う場合、パラメータ値はアスタリスク(*****)として表示されます。(上書きしないパラメータ値は表示されません。)

パラメータは、以下のタイプで宣言される可能性があります。Number(数値)、String(文字列)、CommaDelimitedList(カンマ区切りの文字列)です。String型やNumber型を持つパラメータの場合、AWS CloudFormationはパラメータ値検証のための制約を定義する事が出来ます。

String型の場合、次の制約を定義する事が出来ます。:MinLength(最小文字列長)、MaxLength(最大文字列長)、Default(デフォルト値)、AllowedValues(許可された値)、AllowedPattern(許可された文字列パターン)

パラメータ制約の詳細については、Parameters Declarationをご参照ください。

全てのパラメータ値は、テンプレートJSONの文字列として指定される事に注意してください。つまりNumberパラメータ値も引用符で囲む必要があります。例えば、 以下例のMyNumberのデフォルト値は数値を指定し、それを引用符で囲んでいます。

"Parameters" : {
    "MyNumber" : {
      "Type" : "Number",
      "Default" : "10",
      "MinValue" : "1"
    }
}

パラメータはResourcesセクション及びOutputsセクションで間接参照する事ができるので、あなたがリソース(Resource)やリソースプロパティ(Resource Property)、参照や関数(function)、アウトプット値に対する値として宣言したどんなパラメータでも使う事が出来ます。以下InstanceTypeパラメータの宣言例では、列挙型の値:t1.micro, m1.small, and m1.largeのデフォルト値としてm1.smallを宣言しています。

"Parameters" : {
    "InstanceType" : {
      "Type" : "String",
      "Default" : "t1.micro",
      "AllowedValues" : ["t1.micro", "m1.small", "m1.large"],
      "Description" : "Enter t1.micro, m1.small, or m1.large. Default is t1.micro."
    }
}

もしコマンドラインで値を上書きしたい場合、実行コマンドは以下のようになります。(見易さを優先して適宜改行を入れていますが実際は1行です)

aws cloudformation create-stack
    --stack-name TestStack
    --template-body file:///home/local/MyTemplate.template
    --parameters ParameterKey=InstanceType,ParameterValue=m1.large

もしパラメータが複数ある場合、スペースでparam-valueのペアを区切ります。例えば、MyTemplate.templateは2つのパラメータ値を必要とする、と仮定します。その際、あなたは以下のようなコマンドを使用して、テンプレートに基づいたスタックを作成する事が出来ます。

[javascrpit] aws cloudformation create-stack --stack-name TestStack --template-body file:///home/local/MyTemplate.template --parameters ParameterKey=MyName,ParameterValue=Joe ParameterKey=MyValue,ParameterValue=10 [/javascrpit]

このケースでは、パラメータ名を間違えた場合にAWS CloudFormationはスタックを作成しないという事に注意してください。これは、テンプレートがパラメータを含まなかった、という事を意味します。

サンプルテンプレートの殆どは、Parametersセクションを宣言しています(Example Templatesを参照)。また、パラメータセクションのフォーマットに関する技術的詳細については、Parameters Declarationをご参照ください。

 

マッピング(Mappings)

マッピング(Mappings)は、テンプレート中の条件パラメータ値に指定する事が出来ます。組み込み関数Fn::FindInMapを使った場合は、これらはCaseステートメントやルックアップテーブルのように動作します。

Mappingsセクション(省略可能)では、1つまたは複数のマッピング情報を定義します。各マッピングは、テンプレート内で一意の論理名を持ち、1つ以上のキー属性の組を定義しています。各属性は、リテラル文字列orリテラル文字列の配列で無ければなりません。パラメータ(Patemeter)、擬似パラメータ(Pseudo Parameter)、組み込み関数(intrinsic function)に対してマッピングを使う事は出来ません。必要な数分、条件付きマッピングキーを宣言すると共に、どのキーがデフォルトであるかを宣言する事が出来ます。以下例では、Mappingsセクションにて、リージョン名:特定のAmazonマシンイメージ(AMI)にマッピングした4件の情報を持つマップを宣言しています。

"Mappings" : {
"RegionMap" : {
    "us-east-1" : {
      "AMI" : "ami-76f0061f"
    },
    "us-west-1" : {
      "AMI" : "ami-655a0a20"
    },
    "eu-west-1" : {
      "AMI" : "ami-7fd4e10b"
    },
    "ap-southeast-1" : {
      "AMI" : "ami-72621c20"
    }
  }
}

Resourceプロパティ又はOutputに対してマッピング属性値を代入したい場合、Fn::FindInMap関数を使用します(詳細はFn::FindInMapを参照)。マッピングセクションの形式に関する技術的な詳細はMappings Declaration をご参照ください。

 

擬似パラメータ(Pseudo Parameters)

擬似パラメータ(Pseudo Parameters)はAWS CloudFormationが利用者のために用意したパラメータです。テンプレート内で宣言する事無く、それらを使用する事が出来ます。AWS CloudFormationは、パラメータ名または論理リソース名をとして使うかも知れないであろうあらゆる場所で使える、幾つかの擬似パラメータを宣言しています。

以下の擬似パラメータがAWS CluodFormationでサポートされています。

名前 内容
AWS::Region (包括的にリソースが作成されている、AWSの)地域を表す文字列を返します。
AWS::StackName aws cloudformation create-stackコマンドで指定されているスタックの名前を返します。

 

リソース(Resources)

リソース(Resources)はAWS CloudFormationによって生成・削除されます。それぞれ、テンプレートにはResourceセクションが少なくとも1つ宣言されている必要があります。それぞれのリソースは別々に宣言されます。Resourcesセクションでは同じタイプのリソースを複数指定する事が出来ますが、リソース宣言は同じ型のインスタンスは1つしか作成しません。

各リソースの宣言はテンプレート内で一意の論理名を含み、リソースに対応する型を指定しています。(有効な型名の一覧はResource Property Types Referenceに記載されています)

Resourceセクションで宣言されたリソースは、Propertiesセクションを含んでいます。Propertiesセクションでは、リソースに対するプロパティ(必須・オプション)双方を宣言します。以下例はmyLinuxBundle-2011-12-30のIDを持つAMIイメージを宣言したものです。

"Resources" :{
    "MySimpleImage" : {
        "Type" : "AWS::EC2::Image",
        "Properties" : {
            "ImageId" : "myLinuxBundle-2011-12-30",
        }
    }
}

論理名MySimpleImageはテンプレート内で参照として、パラメータと同じように使う事が出来ます。Resource プロパティに関する情報は次のセクション、Resource Propertiesに含まれています。

サンプルテンプレートでは全て、Resourceセクションを宣言しています(Example Templatesを参照)。また、Resoureceセクションのフォーマットについての技術的な詳細に関してはResource Declarationをご参照ください。

 

リソースプロパティ(Resource Properties)

殆どのリソースは、作成するために事前に特定の値を指定する必要とがあります。もしリソースが任意のプロパティの宣言を必要としない場合、Propertiesセクションを省略する事が出来ます。

リソースのPropertiesセクションで宣言されたプロパティはリソースが作成されるための型に固有のものであり、所有リソースに従って宣言されています(AWS Resource Types Referenceを参照)。

以下例では、"MyVolume"と命名された、3つのプロパティを宣言しているリソースの宣言を示しています。

Resources : {
    "MyVolume" : {
        "Type" : "AWS::EC2::Volume",
        "Properties" : {
            "Size" : "4",
            "SnapshotId" : "snap234",
            "AvailabilityZone" : "us-east-1a"
        }
    }
 }

リソースのプロパティは、リテラル、パラメータ参照、擬似パラメータ(Pseudo Parameters)、組み込み関数(intrinsic functions)に自らの値を設定する事が出来ます。

サンプルテンプレートの殆どは、1つ以上のプロパティを宣言しています(Example Templatesを参照)。また、Propertiesセクションのフォーマットについての技術的詳細についてはProperties Declarationをご参照ください。

 

リファレンス(References)

Ref関数を使って、他のリソース、アウトプット、パラメータ、組み込み関数(intrinsic function)等の値を間接参照するためにリソースの論理名を指定する事が出来ます。

例えば、Resourceセクションでは、あなたはHighRestrictionという論理名を持つセキュリティグループのリソースを宣言するかも知れません。その際、別の場所・別のリソース宣言から、別のリソースのプロパティ値としてその要素を"Ref" : "HighRestriction"を使う事で参照出来るようになります。

以下の例では、パラメータ"MyURL"は値http://aws.amazon.comを持った形で宣言されています。その後のセクションでは、値は"Ref" : "MyURL"の形で間接参照されています。

"Parameters" : {
    "MyURL" : {
        "Type" : "String",
        "Default" : "http://aws.amazon.com"
    },

    ...

"Outputs" : {
    "URL" : {
        "Value" : { "Ref" : "MyURL" }
    }
}

間接参照オブジェクトに対してAWS CloudFormationが返す値は、リソースの型(type)に依存します。 それぞれのサポートされている型に対してどのような特定値が返されるかの詳細については、Resource Property Types Referenceをご参照ください。

サンプルデータの多くで、Ref関数を利用しています(Example Templatesを参照)。また、Ref関数についての技術的詳細はRefをご参照ください。

 

組み込み関数(Intrinsic Functions)

AWS CloudFormationでは実行時までは使用出来ない値を渡すために使用出来る関数を提供しています。使用の際は、Fn::(関数名)という形式でインラインで指定します。

引数は、リテラル文字列、文字列のリスト、パラメータ参照、擬似パラメータ(Pseudo Parameter)、または別の関数から返された値にする事が出来ます。

以下例では、URL出力の値をFn::GetAtt関数によってスタック生成時に取得しています。(URLの)値はMyLoadBalancerという名前のロードバランサによって割り当てられたDNS名の値に基づいています。

"Outputs" : {
    "URL" : {
        "Value" : { "Fn::GetAtt" : [ "MyLoadBalancer", "DNSName" ] }
    }
}

現在、AWS CloudFormationは以下の関数をサポートしています。

名前 用途
Fn::Base64 引数をbase64エンコーディング
Fn::FindInMap 指定されたマッピングからキーの値を返す。
Fn::GetAtt 指定されたリソースの属性値を返す。
Fn::GetAZs AWS CloudFormationスタックを作成する事が出来るアベイラビリティゾーン(AZ)を取得。
Fn::Join 第2引数の要素(群)を連結。
Ref 論理名またはパラメータに基いてリソースまたは値を返す。

サンプルの多くで、組み込み関数を使っています(Example Templatesを参照)。組み込み関数の技術的な詳細については、Function Declarationをご参照ください。

 

アウトプット(Outputs)

テンプレートのユーザーに渡される情報を宣言するためにOutputセクションでテンプレートを使う事が出来ます。出力はAWS CloudFormationのdescribe-stacksコマンドによって返されます。

出力情報を宣言するために、文字列値またはAWS CloudFormationの関数を使用する事が出来ます。

Outputsセクションの情報は、存在するスタックに対するaws cloudformation describe-stacksのみによって返されます。スタックの作成、またはスタック削除時に失敗した場合、Outputセクションで宣言された値は返される事はありません。以下例では、URLと命名された出力は文字列値http://aws.amazon.com/cloudformationを返します。

"Outputs" : {
    "URL" : {
        "Value" : "http://aws.amazon.com/cloudformation"
    }
}

多くのサンプルではOutputsセクションを宣言しています(Example Templatesを参照)。また、Outputsの技術的詳細についてはOutputs Declarationをご参照ください。