AWS CloudFormationとAWS CloudFormationを利用したWordpressのデプロイしてみました


## AWS CloudFormationとは

AWSの各種サービスをテンプレートと言われるJSON方式のファイルに記述することで、コマンド一発で同一構成のシステムの作成が可能になるサービスです。

## 類似のAWS構築・デプロイ自動化サービスはこの辺り

|Elastic Beanstalk|OpsWorks|CloudFormation|
|:------------:|:------------:|:------------:|
|低い|フレキシビリティ|高い|
|高い|導入の容易さ|低い|

## 料金

Cloud Formation自体には発生しない。使用するAWSリソース分のみ。

## AWSが提供するサンプルテンプレート

で、テンプレートってどんなものか見たければ、下記リンク先にWordpressなど、他にもたくさんの「AWS」が提供する即実行可能なサンプルテンプレートが用意されています。
[AWS CloudFormation サンプルテンプレート – アジアパシフィック（東京）リージョン](http://aws.amazon.com/jp/cloudformation/aws-cloudformation-templates/aws-cloudformation-templates-ap-northeast-1/?nc1=h_ls "AWS CloudFormation サンプルテンプレート – アジアパシフィック（東京）リージョン")

## ちなみに公式に紹介されているサンプルテンプレートです
- テンプレートのひな形

```

{

    "Description" : "A text description for the template usage",

    "Parameters": {

        // 実行時の変更可能なパラメータの記述 ex)DBユーザー名など
    },

    "Resources" : {

        // スタックを構成するAWSリソースを定義
    },

    "Outputs" : {

        // スタック構築後に取得したい値　ex)アクセスURLなど
    },

    "AWSTemplateFormatVersion" : "2010-09-09"

	// その他の主要なパラメータ
	//　Mappings キーに応じた値を特定できる ex)AZの設定など
	//　Counditions　Parameters,他のCounditions,Mappingsから条件判断に応じてリソースを作成する

}
```

その他テンプレートに使用するAPI参考
[[AWSマイスターシリーズ] AWS CloudFormation（p.29〜）](http://www.slideshare.net/AmazonWebServicesJapan/aws-aws-cloudformation)　

- EC2を作成する簡単なテンプレート例

```
{

    "Description" : "Create an EC2 instance running the Amazon Linux 32 bit AMI."

        "Parameters" : {

        "KeyPair" : {

            "Description" : "The EC2 Key Pair to allow SSH access to the instance", "Type" : "String"

        }

    },

    "Resources" : {

        "Ec2Instance" : {

            "Type" : "AWS::EC2::Instance",

            "Properties" : {

                "KeyName" : { "Ref" : "KeyPair" },

                "ImageId" : "ami-3b355a52"

            }

        }

    },

    "Outputs" : {

        "InstanceId" : {

            "Description" : "The InstanceId of the newly created EC2 instance",

            "Value" : {

                "Ref" : "Ec2Instance"

            }

        }

    },

    "AWSTemplateFormatVersion" : "2010-09-09"

}    

```

## テンプレートを利用する方法
テンプレートを利用する方法は3つあります。

- 自分で書いたテンプレートをアップロードする
- テンプレートの置かれたURLを指定する
- Management Consoleから用意されているサンプルテンプレートを選択する

## スタック
テンプレートによって作成される。AWSリソースの集合を指す。各リソースをスタック単位で一度に生成・破棄することが可能。

## その他連携サービス
- Cloud-init
- CloudFormation helpers
- CloudFormer （既に構築ずみのシステム構成からテンプレートを作成するツール）

## その他
- テンプレート数の制限はなし、スタック数の制限は1アカウントあたり最大20
- 書く説明用のフィールドの上限は4096文字
- パラメータ50、出力10が最大値

## サポートされているAWSリソース

### 公式サイトに記載されている一覧
Auto Scaling
Amazon CloudFront
AWS CloudWatch
Amazon DynamoDB
Amazon EC2
Amazon ElastiCache
AWS Elastic Beanstalk
AWS Elastic Load Balancing
AWS Identity and Access Management
Amazon RDS
Amazon Redshift
Amazon Route 53
Amazon S3
Amazon SimpleDB
Amazon SNS
Amazon SQS
Amazon VPC

_参考記事抜粋_
[**Amazon EC2の新機能、CloudFormationとは － ＠IT**](http://www.atmarkit.co.jp/news/201103/01/cloudformation.html)


>テンプレートにはインスタンスのタイプ、AvailabilityZonesの指定、Elastic IP Addressの指定、RDS（Relattional Database Service）のデータベース名、ストレージ容量、セキュリティグループ、負荷分散グループとサイズなどを記述できる。必要とするリソースについてのみ記述すればよい。アカウント名やパスワードなどのパラメータも記述できる。

## Cloudformation利用のメリット
- 同じ構成を何度でも構築できる
同じ仕組でデータが異なるものへの利用
- サンプルテンプレートを利用することでベスト・プラクティスが盛り込まれた環境を簡単に利用できる
- 起動時にパラメータを渡せる

参考リンク:[[AWSマイスターシリーズ] AWS CloudFormation p7~](http://www.slideshare.net/AmazonWebServicesJapan/aws-aws-cloudformation)

# WordpressをCloud Formationにて構築
下記URLのスタックを起動をクリックするCloudformationのコンソール画面に移動する(サンプルテンプレートはコンソール画面から選択できるのですが、そこで選択したSingle Instance SamplesのWordpressテンプレートはキーペアの設定が出来ないため、ssh接続が出来ないインスタンスが作成されます。)

[AWS CloudFormation サンプルテンプレート – アジアパシフィック（東京）リージョン](http://aws.amazon.com/jp/cloudformation/aws-cloudformation-templates/aws-cloudformation-templates-ap-northeast-1/?nc1=h_ls "AWS CloudFormation サンプルテンプレート – アジアパシフィック（東京）リージョン")

![](https://dl.dropboxusercontent.com/u/82339743/AWSCloudformation/1.jpg)

スタック名を設定し、次へ
` 補足　ssh接続を行いたい場合、EC2のサイドメニューからKeyPairの作成を行っておく `

![](https://dl.dropboxusercontent.com/u/82339743/AWSCloudformation/2.jpg)

DBパスワードの設定、InstanceType（無料枠内にするためここではt1.micro）、KeyNameの設定（先ほど作成したKeyPairの名前を指定）が終わったら次へ

![](https://dl.dropboxusercontent.com/u/82339743/AWSCloudformation/3.1.png)
![](https://dl.dropboxusercontent.com/u/82339743/AWSCloudformation/3.2.png)

とりあえず設定は触らず次へ

![](https://dl.dropboxusercontent.com/u/82339743/AWSCloudformation/4.jpg)

問題なければCreateする

![](https://dl.dropboxusercontent.com/u/82339743/AWSCloudformation/5.jpg)

各AWSサービスリソースの作成と設定がなされる様子をリアルタイムで視認できます

![](https://dl.dropboxusercontent.com/u/82339743/AWSCloudformation/6.jpg)

ステータスがCREATE_COMPLETEになったらタブのOutputsからURLを取得しアクセスする。
いつものWordpressログイン画面が現れたら成功！

![](https://dl.dropboxusercontent.com/u/82339743/AWSCloudformation/7.jpg)

すんなり行けば5分もかかりません。

## 所感
基本的にテンプレートに従ってデプロイするまでのツールのため、デプロイ後の機能はほぼない。
一度デプロイした場合、各AWSリソースに関しての操作は一括デリートかスタック更新くらいしか用意されていない。
後は個別に操作するしか方法がない。

WEBで検索してみるとテンプレートを個別の機能ごとに分割することで対応することでメンテナンス性を向上させているところもあるようです。

またCloud-init、CloudFormation helpers、Elastic Beanstalkを併用し各々の利点を生かして構築環境を作るのがセオリーのようです。上記ツールも今後使ってみます。

CloudFormerはなかなかくせ者のようです。割りとめちゃくちゃなコード出すみたい。。使えればめちゃくちゃ便利なツールだと思うので要確認ですね。

次はとりあえずAWSサンプルテンプレートのコードを読んでCloudformation自作してみます。