CloudFormationでAWS上にステージング環境を必要な時だけ一発で立ち上げる。

今月は、AWSの環境整備に時間を使っています。
シロクが現在運営しているサービスは6つほどで、それぞれにAWSアカウントがあり、それぞれ似たような構成をとっています。
その最小構成のコストが、だいたい月額10万円から15万円くらいです。サービスを増やしていくと、売上があるかどうかに関わらず発生する固定費の10万円の負担が大きくなっていくので、この最小構成を見なおしています。

ステージング環境にコストを割きたくない

最小構成には、開発したサービスの動作確認に使っている「ステージング環境」も含まれています。
ステージング環境はだいたい、ELBが2台、EC2が2台、RDSが1台というような構成になっています。
プロダクション環境のような冗長構成をとっていませんし、インスタンスも動作可能な範囲で最低ランクのものを使いますが、それでも1万円〜2万円程度の支出になります。
ステージング構成図
1万円〜2万円は、少ないようでいて、サービスが増えるとそれなりのコストになります。

必要な時だけステージング環境を立ち上げる

そういうわけで、ふだんはステージング環境を停止させておいて、必要な時にだけすぐに立ち上げることができるようにしたいと思いました。
立ち上げの手順はこうです。

  1. EC2インスタンスをAMIから起動する。
  2. インスタンスにElastic IPを設定する。
  3. ELBを起動する。
  4. ELBにEC2インスタンスを追加する。
  5. Route 53にELBを参照するレコードを追加する。

そして、停止はこの逆の作業をします。

CloudFormationが使えそう

「よーし、組み上げるぞ!」と、シェルスクリプトでaws-cliを叩きはじめて2時間くらい経ったところで、CloudFormationが使えるのではないかと思い出しました。
CloudFormation入門
CloudFormationは、設定を記述したJSONを流し込むだけで、AWSのアカウント上に環境を構築してくれるサービスです。設定の記述が面倒くさそうで今まで使っていませんでしたが、動的にステージング環境を立ち上げるのに、これを使わない手はありませんでした。

ステージング環境の設定を書く

あの長いJSONを書くのは嫌だなあと思っていたら、CloudFormerという設定の生成ツールがあることを知りました。
恐るべきツールCloudFormerとは一体何だ!?
CloudFormer自体が、CloudFormationで起動でき、これをぽちぽちしているだけで設定ファイルができます。
スクリーンショット 2014-03-19 21.04.50
大雑把に設定ファイルができたら、ドキュメントと照らしながら、細かいオプションを調整していきます。

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "WebDns": {
      "Type": "AWS::Route53::RecordSetGroup",
      "Properties": { ...(略)... }
    },
    "ApiDns": {
      "Type": "AWS::Route53::RecordSetGroup",
      "Properties": { ...(略)... }
    },
    "WebLoadBalancer": {
      "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
      "Properties": { ...(略)... }
    },
    "ApiLoadBalancer": {
      "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
      "Properties": { ...(略)... }
    },
    "WebServer": {
      "Type": "AWS::EC2::Instance",
      "Properties": { ...(略)... }
    },
    "BatchServer": {
      "Type": "AWS::EC2::Instance",
      "Properties": { ...(略)... }
    },
    "WebServerAssociation": {
      "Type": "AWS::EC2::EIPAssociation",
      "Properties": { ...(略)... }
    },
    "BatchServerAssociation": {
      "Type": "AWS::EC2::EIPAssociation",
      "Properties": { ...(略)... }
    }
  },
  "Description": "Staging environment"
}

次の3つをリソースとして管理させることにしました。

  • EC2インスタンス2台
  • ELB 2台
  • Route 53のレコード

これらを作成されたり削除したりして、AWS上に組み上げていきます。

一発で環境を起動、そして停止

AWS Management Consoleから設定ファイルを流し込むだけでステージング環境の立ち上げができ、ボタンひとつで削除もできます!
スクリーンショット 2014-03-20 0.49.53___
Cloud Formationで作成される構成は、全体がアトミックになっていて、何か作成を続けられない問題が起きた場合は、それまで作ったものを全て破棄して元の状態に戻してくれます。中途半端に作ったものが散らからないので、管理上もとても楽です。
これで必要な時だけ簡単にステージング環境が立ち上げられて、お金を浪費しなくて済むようになりました!
Jenkinsと連動させて起動・停止をするお話に続きます。→ステージング環境をGitフックでJenkinsから起動・停止してコスト削減!

コメント

  1. […] CloudFormationでAWS上にステージング環境を必要な時だけ一発で立ち上げる。 […]

タイトルとURLをコピーしました