AWS OpsWorks のLayerをカスタマイズしてLAMP All in Oneサーバーを起動してみる

前回次の日くらいに続き書くとか言っておきながら春の日差しでぼんやりしててかくの忘れてました。思い出したのでぼちぼち書きます。

前回書いたように現時点ではAWS Opsworksには Apache + MySQL + PHP が1インスタンスで起動できるLayerが用意されていない。ので、ちょっとLayerをいじってそういう構成のLayerを作成しインスタンスを起動するところまでやってみる。

まず、Stackの作成。OpsWorksのダッシュボードから Add Stackボタンをクリックして作成する。

f:id:bathtimefish:20130405153326p:plain

 

名前は適当にtestとする。なんでもいい。Default operating systemはUbuntu12.4 LTSを選択する。Amazon Linuxにしたいところだけど現時点でうまくいかなかったので。理由は次回に書きます。


さらに、Region, Default Availability Zoneはお好みで。大事なのはDefault SSH Keyで自分が使っているAWSのSSH Keyを選択すること。これを設定しとかないとインスタンスを起動した後にsshでログインできなくなる。

選択したら右下のAdd StackボタンをクリックしてStackを作成する。

f:id:bathtimefish:20130405153710p:plain

こんな感じでtestという名前のStackができる。次に画面左側メニューのLayersをクリックする。

f:id:bathtimefish:20130405154437p:plain

 

Layerの管理画面になるので、Add a layerボタンをクリックする。

f:id:bathtimefish:20130405154743p:plain

Layer typeはMySQLを選択する。このMySQLレイヤーをベースにApache + PHPを組み込むのが良さそうだ。なぜならMySQLレイヤーでは画面のようにレイヤーの設定でroot passwordが設定可能だから。recipeで設定するよりはこっちのほうが便利だろう。

Layer typeをMySQLにし、rootパスワードはまあそれっぽいものが入ってるのでそのままにして右下のAdd layerボタンをクリックする。

f:id:bathtimefish:20130405155309p:plain

こんな感じでMySQLのlayerができる。これにapacheとかの設定を組み込んでいく。どうやるかというと、PHP App ServerというLayer typeのrecipe設定の一部をこのMySQL layerに追加するという方法をとる。こういうことができるのがクラウドマネージメントツールの面白いところだ。

まずはMySQL layerの行の右側、action項目のeditボタンをクリックする。

f:id:bathtimefish:20130405155936p:plain

 

layerの編集画面になる。まずはBuilt-in Chef recipesのところにあるshowボタンをクリックしてみよう。

f:id:bathtimefish:20130405160250p:plain

 

このレイヤーで定義されているrecipeの一覧が表示される。それぞれSetupからShutdownまでのカテゴリに分けられていて、インスタンスを起動してMySQLサーバーをデプロイするためのrecipeが定義されている。ここにPHP App Serverで定義されているrecipeの一部を追加してLAMP All in oneなレイヤーを作る。

まず、recipeを追加する前に他に必要な設定をやっておく。
この下段にSecurity Groupsの項目がある。ここのadditional security groupsからAWS-OpsWork-PHP-App-Serverを選択し、リストボックスの右側の+ボタンをクリックする。

f:id:bathtimefish:20130405161056p:plain

 

すると下図のような感じでSecurty Groupが追加される。
これでインスタンスが起動したあと80などWebサーバーへのアクセスに必要なポートが開くようになる。

f:id:bathtimefish:20130405161257p:plain

さて、次にいよいよrecipeの追加だ。まずはCustom Chef recipesの欄のconfigure cookbooksボタンをクリックする。

f:id:bathtimefish:20130405162056p:plain

Stackの編集画面になるので、まずUse Custom Chef cookbooksのスイッチをYesにする。次に現れるRepository URL欄に git://github.com/aws/opsworks-cookbooks.git を入力する。これはAWS OpsWorksのcookbookのリポジトリだ。入力したら右下のSaveボタンをクリックしてStackの設定を保存する。

f:id:bathtimefish:20130405162817p:plain

保存できたら、右側メニューのLayersをクリックしてLayerの管理画面にもどる。そしてMySQLレイヤーのeditボタンをクリックしてレイヤーの編集画面に移動する。
するとCustom Chef recipesの欄が下図のようにrecipeが追加できるようになっているはずだ。これでAWS Opsworks cookbooksのrepipeがこのレイヤーに追加できるようになったわけだ。

f:id:bathtimefish:20130405163243p:plain

SetupからShutdownのそれぞれのカテゴリにrecipeを追加していく。
recipeはそれぞれのカテゴリのテキストボックスにrecipeを入力して+ボタンをクリックすることで登録できる。recipeはひとつずつ+で追加していく。それぞれ以下のrecipeを入力する。

Setup

mod_php5_apache2

Configure

mod_php5_apache2::php, php::configure

Deploy

deploy::php

Undeploy

deploy::php-undeploy

Shutdown

apache2::stop

f:id:bathtimefish:20130405164831p:plain

上記のように入力したらページ右下のSaveボタンをクリックしてレイヤーの設定を保存する。

エラーなく保存できたら、Custom Chef recipesは下図のように登録されるはずである。エラーになった場合はrecipe名をタイポしている可能性があるので間違いなく登録し直す。

f:id:bathtimefish:20130405165220p:plain

ここまでできたら、右側メニューのInstancesボタンをクリックしてインスタンスの管理画面にいく。MySQLレイヤーのインスタンスはまだひとつも登録されていないので、Add an Instanceボタンをクリックしてインスタンスを登録しよう。

f:id:bathtimefish:20130405165543p:plain


インスタンスの設定はとりあえずそのままでいい。右下のAdd Instanceボタンをクリックして登録する。

インスタンスのHost NameはStackのHostname themeにしたがって適当な名前をつけてくれる。インスタンスサイズはデフォルトでHigh CPU Mediumになっているのが商売上手な気もするけどw

実際にこのインスタンスを起動してそれぞれのアプリケーションがデプロイされるまでには結構な時間がかかるので、smallあたりでさらに起動時間が伸びるよりはいいか。という判断で。まあテストですぐ止めるしいいか。

f:id:bathtimefish:20130405170254p:plain

 

これで起動準備がすべて完了した。下図のようになると、いよいよ起動である。

f:id:bathtimefish:20130405170529p:plain



db-master-1欄のstartボタンをクリックしてインスタンスを起動する。

f:id:bathtimefish:20130405170631p:plain


起動完了までにはけっこう時間がかかるので気長に待とう。
ここでOpsWorksはOSをブートし、Apacheなど必要なソフトウェアをインストール・設定し、サービスを立ち上げるといった一連の動作を自動で行う。
起動状況はStatus欄で逐次確認できる。

f:id:bathtimefish:20130405171152p:plain

 

しばらくすると、ステータスがonlineとなる。
これで起動完了だ。db-master1欄のPublic IPにインスタンスに割り当てられたIPアドレスが表示される。stopボタン右側のsshボタンをクリックすると、sshでのアクセス方法が表示される。sshで接続して、インスタンスの状態を確認してみよう。

f:id:bathtimefish:20130405171555p:plain

 

とりあえずsshでログインしてps打ったりしてapache2、mysqlphpなどのプロセスが走っているか確認する。ボクはついでに /var/www/info.php を作成して、おなじみphpinfo() を書いてブラウザでアクセスすると正常に表示された。pdo-mysqlもちゃんとインストールされている。すぐにphpアプリケーション開発ができる環境が整ったわけだ。

f:id:bathtimefish:20130405172547p:plain

 

このサーバーのデプロイ設定は上記で設定したレイヤーに全て定義されているので、インスタンスを増やせばいくらでも同じ設定のサーバーを起動できるのである。スケールアウトにはもちろん有効だけど、単体運用ベースでも障害復旧やテスト環境の即時起ち上げなどでメリットがありそうだ。自分がよく使うサーバー環境を作っておくといろいろと楽ができそうである。

さて、起動のテストはこれで終わりである。終了前には必ずstopボタンで起動しているインスタンスを終了させておこう。無駄にお金がかかることになるので。気になる人はstop実行後インスタンスがterminateされたかどうかをEC2の画面で確認しておくといいだろう。OpsWorksはまだベータ版なので念のため確認しといたほうが無難だ。

f:id:bathtimefish:20130405181413p:plain


あと、冒頭に書いたAmazon Linuxを選択するとうまくいかなかった話は次回に書きます。