6リージョン同時75万接続のメッ
セージ配信基盤を

CloudFormationと
Capistranoで
3日で構築した話
CM re:Growth
Developers.IO Meetup 01
大瀧隆太(@takipone)

2013/12/10
classmethod.jp

1
6リージョン同時75万接続のメッ
セージ配信基盤を

CloudFormationと
Capistranoで
3日で構築した話
CM re:Growth
Developers.IO Meetup 01
2013/12/10
classmethod.jp

Twitter
#cmdevio

大瀧隆太(@takipone)

2
自己紹介
• 氏名 : 大瀧隆太
• ポジション :
ソリューションアーキテクト / 研修講師
• 得意分野 :
ネットワーク /
デプロイツール
• 好きなAWSサービス
Amazon Route 53
classmethod.jp

3
システム概要1
• いくつかのシステムを組み合わせて構築
• 今回の担当は、75万のクライアントに
データをプッシュするもの
• アプリは担当外
→ 3日で180台のインスタンスを
デプロイしなければならない。
しかも複数リージョンなので、
単純なAutoScaling構成ともいかない。
classmethod.jp

4
システム概要2
Sub

×15
Client

Redis
on EC2

Auto scaling

Pub

Availability Zone
Mobile
Client

×
750K

Sub

×15
Auto scaling
Availability Zone

classmethod.jp

Publish app
on EC2
Redis
on EC2
システム概要3
バージニア
us-east-1
Client

オレゴン
us-west-2
東京
ap-northeast-1

Mobile
Client

×
750K

カリフォルニア

us-west-1
アイルランド
eu-west-1
シンガポール
ap-southeast-1

classmethod.jp

Publish app
on EC2
時間との闘い
• 実装方法は、社内にノウハウがあるもの
と思いついたもので手を動かしながら検
討。
→最新のかっこいいツールを使ったわけ
ではないです。
→ノウハウはベストプラクティスとは
限りません。時には、手間を惜しんで
力技に訴える場合もあります。
classmethod.jp

7
とはいえ...
• 手作業で180台構築、しかもマルチリー
ジョンは現実的ではない。
• コードが順次アップデートされ、インス
タンス起動後のデプロイも必要なので、
マスター(AMIイメージ)の作成では不十分。
→ツールに頼ることにした。

classmethod.jp

8
ツールという翼を授かる
• 今回は学習コストをかけられないので、
触ったことのあるツールから選択。
• AWS CloudFormation
• Capistrano

classmethod.jp

9
CloudFormationで
マルチリージョン構成
• CloudFormationは、AWSのコンポーネント
を自動作成できるAWSサービス
– あらかじめJSON形式のテンプレートで記述する

• リージョン毎の違いはほとんど意識しなくて
よい (一部例外アリ)
– 単一リージョン用のテンプレートを使い回しでき
る!
– Parameters/Outputsなど構成を柔軟にする機能↑
これ重要
classmethod.jp

10
CloudFormation活用ノウハウ1
• 全コンポーネントを単一テンプレートで記述
しない。
– 作成でコケると全部ロールバックしてしまい、な
にも残らない。
– 大規模環境では、テンプレートが正しいものでも
不確定要素によってコケるケースがある。
• なんらかのリソース上限に到達
→特に、AutoScalingは上限に行ってもエラーを出さず、
上限内のインスタンス数を維持する
• リージョン全体のキャパシティ不足で、インスタンス
起動に失敗
classmethod.jp

11
CloudFormation活用ノウハウ2
• 分割例(というか、今回使った構成)
1.
2.
3.
4.

VPCとセキュリティグループ
ELB【重要】→ 暖気申請
EIP【重要】 → セキュリティグループ
EC2インスタンス / AutoScaling

• 依存関係(作る順番)は手で管理
– テンプレートファイル名のプレフィックス
に番号をつけた
– Parameters/Outputsの受け渡しが必要
classmethod.jp

12
CloudFormation活用ノウハウ3
• 複数テンプレートを組み合わせると、
Management Consoleでの実行は
破綻する
– IDの受け渡しとか無理。
– 6リージョンで6回繰り返しとか無理。
→スクリプトを組むべし。
– jq/awscli --queryと仲良くなれると
効率アップ!
classmethod.jp

13
classmethod.jp

14
classmethod.jp

15
classmethod.jp

16
Capistranoでデプロイ
• Capistranoは、Ruby製のデプロイツール
– Ruby on Railsのデプロイで有名。
– やってることはSSH経由のコマンド実行なので、
Rails以外の用途でも汎用で使えます。

• AWS SDK for Rubyとの組み合わせが
超強力!!
– ELB配下の全EC2インスタンスを動的に取得し、
同じコマンドラインが実行できる!
– AutoScalingやTagづけでも夢がひろが(以下略
classmethod.jp

17
AWSのAPIキー

ELB名の
ハッシュ
定義
classmethod.jp

18
EC2のEIPを格納する配列を定義

↑ELB配下のEC2のEIPを配列に追加!
ロールに設定
classmethod.jp

19
Capistrano活用ノウハウ1
• ユーザーデータ(CloudFormation)とのユーザー権
限のバッティングに注意
– ユーザーデータはroot権限で実行される
– CapistranoはSSHで接続するユーザー権限(Amazon
Linuxでは非root)
– コピペではまず通らない。
– ユーザーデータで作ったファイルがCapistranoで消せ
ない、書き出せない事象が多発。
→ su -cやsudoと仲良くなりましょう。

• 冪等性がやっぱりほすぃ...。
– 終了値0以外で全台ストップするので、ごにょごにょ

classmethod.jp

20
classmethod.jp

21
Capistrano活用ノウハウ2
• User-Separatedな実行系に注意
– RubyGems/Bundler(Ruby)やnpm(nodejs)、
Composer(PHP)など
→今回はnpm
– ユーザーデータ/Capistranoタスクの難易度が
ぐーんと上がる。
– 絶対パスやcd/sudoなどでなんとか対応した。
– Capistranoタスクであれば、Rubyシンタック
ス(変数/配列の参照)を上手く使いましょう。
classmethod.jp

22
classmethod.jp

23
まとめと後日談1
• CloudFormationで自動構築、複数リー
ジョン対応は強力!
• CapistoranoはRails以外のデプロイでも絶
大な力を発揮する。AWS SDKとの組み合
わせが強力すぎる。

classmethod.jp

24
まとめと後日談2
• CloudFormationとCapistoranoが無かった
と思うとゾッとします。あと、AMIリー
ジョン間コピーも。
• もう、しばらくいいです・・・。
• 社内で同じような案件がゴロゴロしてい
るので、ノウハウ蓄積の一助になりたい。
classmethod.jp

25

6リージョン同時75万接続のメッセージ配信基盤をCloudFormationとCapistranoで3日で構築した話