マルチリージョン構成を楽々構築! CloudFormation分割テンプレート編 | アドカレ2013 : CFn #20

2013.12.20

ども、大瀧です。アドベントカレンダー2013「AWS CloudFormationビッグバンテンプレート」、本日は20日目です。

昨日は都元さんのPostfix編でした。

分割テンプレートとスクリプトのご紹介

これまでのエントリーは、特定目的向けにCloudFormationテンプレートをご紹介していましたが、今回はちょっと趣向を変えてCloudFormationの大規模環境向け実行スクリプトを紹介したいと思います。元ネタは、先日開催しましたAWSチームの勉強会で発表した以下のスライドです。

[slideshare id=29096313&doc=675cloudformationcapistrano-131210230646-phpapp02]

CloudFormationは、スタックという単位でAWSの複数コンポーネントを一括作成することができます。しかし、マルチリージョンをはじめとする大規模なAWS構成では、1つのテンプレートにまとめることは以下の理由によりあまり現実的ではありません。

  • 作成でコケると全部ロールバックしてしまい、なにも残らない。
  • 大規模環境では、テンプレートが正しいものでも不確定要素によってコケるケースがある。

そこで、複数のテンプレートに分ける構成を考えてみました。今回は一般的なWebサーバーがELBの配下にぶら下がる、スケーラブルなWebシステムを構成してみます。

1. VPCとセキュリティグループ
ベースとなる構成。以下のテンプレートからリソースを参照する必要がある
2. ELB
1と同じく、ELBの配下にする5のテンプレートから参照します
3. Elastic IP
リージョンをまたいだアクセスを行う場合、許可ルールとしてElastic IPを/32で指定することになるため、他の構成と分けておきます
4. 管理用インスタンス
管理用のインスタンスなどを含めます
5. Webサーバーのインスタンス(AutoScaling)
AutoScalingに関するLaunch ConfigやAuto Scaling Groupを含めます

ただ、複数のテンプレートに分割すると、スタックの作成順や依存関係を管理者が意識しなければなりませんし、手作業だとParametersの受け渡しも大変です。そこで、スタックの作成をAWS CLIで実行するシェルスクリプトを利用します。

GitHubにアップしてあります!

cfnディレクトリ以下にCloudFormationテンプレート、scriptディレクトリ以下にCloudFormationスタック作成を実行するシェルスクリプトがあります。

使い方

動作確認した環境

  • OS : OS X Marvericks
  • Bash : 02以降のスクリプトでは、配列を扱っているためbashバージョン4以降を/usr/local/bin/bashに設置する必要があります。homebrewで入れると楽ちんです。
  • awscli(Python版) 1.2.6

事前に準備するもの

  • SSHキーペア : オレゴン、カリフォルニア、アイルランド、東京、シンガポールの5リージョンにid_rsa_sampleというキーを作成しておきましょう
  • Route 53 Hosted Zone : example.comゾーンを作成しておきましょう
  • awscliのプロファイル : 今回のシェルスクリプトで実行するawscliにはAWS APIキーを--profileで記述しています。~/.aws/configファイル内に、以下を記述しておきましょう
[profile aws-sample]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

手順

まずはGitHubのコード一式をgit cloneでコピーし、cdコマンドでmultiregion-cfn-template-and-scripts/scriptに移動しておきましょう。

$ git clone https://github.com/classmethod-aws/multiregion-cfn-template-and-scripts.git
Cloning into 'multiregion-cfn-template-and-scripts'...
remote: Counting objects: 32, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 32 (delta 16), reused 31 (delta 15)
Unpacking objects: 100% (32/32), done.
Checking connectivity... done
$ ls
multiregion-cfn-template-and-scripts/
$ cd multiregion-cfn-template-and-scripts/script

あとは、順にスクリプトを実行していきます。

$ ls
01-create-base.bash*              04-create-adminserver.bash*
02-create-elb.bash*               05-create-webserver-minumum.bash*
03-create-eip.bash*               05-create-webserver-prod.bash*
$ ./01-create-base.bash
arn:aws:cloudformation:us-west-2:602604506680:stack/stack1-01/ce276780-6a00-11e3-a594-50e2414b0a44
arn:aws:cloudformation:ap-northeast-1:602604506680:stack/stack1-01/d0035370-6a00-11e3-88fd-5088487c4896
arn:aws:cloudformation:us-west-1:602604506680:stack/stack1-01/d21bac20-6a00-11e3-9d95-50690876bbe8
arn:aws:cloudformation:eu-west-1:602604506680:stack/stack1-01/d51f2820-6a00-11e3-b0b1-506cf935a496
arn:aws:cloudformation:ap-southeast-1:602604506680:stack/stack1-01/d72b99f0-6a00-11e3-a688-50e241b95136
$

すると、シェルスクリプトではcfn/以下のテンプレートファイルを読み込んでaws cloudformation create-stackコマンドで5つのリージョンに同一構成のスタックが作成されます。

完了すると5リージョン全てに、以下のようにスタックが並びます。これで完成です!

cfn01-2

余談1

今日CloudFormationのUIが新しくなりましたね!ただ、EventsタブのReasons列が見切れてしまっているのが残念です。画面上部のgo backリンクで元のUIに切り替えられることを覚えておきましょう。期間限定だと思いますが。

cfn02-3

余談2

もう一つ余談ですが、今回は流行のc3インスタンスファミリーを試してみたところ、Insufficient capacityというエラーで大半のAuto Scalingインスタンスが起動できませんでした。c3インスタンスのキャパシティーが一時的に枯渇している事実を改めて認識できました。

cfn03-5

まとめ

今回ご紹介したテンプレートとスクリプトは、アレンジしていろいろな構成に使ってみてください!
明日はどんなテンプレートが飛び出すかをお楽しみに!