uzullaがブログ

uzullaがブログです。

AWS Elastic Beanstalk をPHPer が試したメモ

いきなり関係のない宣伝

やろう!LTソン!
http://ltthon-yapc2012.hachiojipm.org/

Elastic beanstalkとは

http://aws.amazon.com/jp/elasticbeanstalk/
(以後EBT
AWSを普段から使っている人には、ELBとEC2とCloudWatchとかの設定をしなくても最初からスケールアップの基本設定をやってくれて、ソースコード更新した度にAMI更新とかクソだるい死ぬデプロイとかよくわかんない死ぬとかって思わなくていいように、Git管理のツールがついてきて、さらに開発環境テスト環境を同時にうごかす時の為のちょっとしたツールがついてくるよ、って感じの物です。


PhpfogとかHerokuつかったことがある人なら、それらとにた感じのものを、AWSのEC2やEBTで組み立ててWrapしたもの、っておもえばよいのでは。DBはついてこない(AWSのRDSをつかえばいい)

EBTって結局具体的にはどういう感じ?

まあ、ダラダラかきましたけど
http://www.ustream.tv/recorded/22523628
http://www.slideshare.net/c95029/php-on-cloud
この二つを見ると、このポストで言いたい事の9割理解できます。

というか上二つをみたらもう下は読まなくて良いです、本当にありがとうございました!!!


_人人人人人人人_
> 突然の終了 <
 ̄^Y^Y^Y^Y^Y^ ̄


なぜ今EBTなのか

いや、なんかしらないけど、俺tokyoリージョン対応してないとずっとおもっててんけど、いつの間にか対応してたw(つい最近シンガポールリージョン対応したのかな)
ということで触ってみないと!っておもったのであって、別に今特別旬!というわけではない。

なぜEBTなのか

ボクはPHPerなんですよね。EBTPHP対応のPaaS、といっていいわけですよ。
もうサーバーの管理とか本当に面倒臭くてやりたくないわけですよ。EC2で色々組み合わせれば自動スケールアップとか色々できるし、案件によっては実際やってるけど、これだってもう面倒臭い。
特にソフトウェアのデプロイね、あれはつらい、多くのサーバーをどうやって同期させるのか、GitのCron?Rsync?まあもう上手く動いてるのか色々確認するのすらダルい(デプロイツールはバグの山!)


そういう感じで、PHPのPaaSをずっとウォッチしてたんだけど(といいつつ、EBTのTokyo対応を見逃してたんだけど)、もうねー、どのPaaSもPHPあんまりイイ感じのがないのね。なにがイイ感じじゃないかっていうと、色んなサービスついてこないのよ。
どこのサービスとはいわないけど、


PHPとちょっとした共有Mysqlあればいいでしょ?」


駄目だろ!全然駄目だろ!ちょっとハネたら速攻ででていかなきゃいけないPaaSは開発くらいにしか使えないし、それなら普通に手元のMacBookでいいじゃん…。
(本当の所をいえば、お客さんにPHPF○gとかどうですか?って言って、通る分けがないし。しかしAWSなら通る(理由?そんなものはない、いや競合他社が使い出したり、日経新聞とかに乗ったりして、お客さんの間で「あれを使ってないと遅れてるっていわれる!」みたいな空気ができればいいんだけど))


で、どうにもヘビーに使えるPaaSっていうと、なんだかんだHerokuしかないっぽく…。実はHeroku PHP対応してたりなんですけどね。
でもね、HerokuのPHPは、さすが非公式だけあって変らしいんですよね…(後、mb_string無いとか)
いや、一週間くらい前某案件で、Herokuを使うしかないのか…とかおもったんですけど、やっぱり駄目ですよ。Rubyの人に負けた気になる。


そこで、EBTですよね。

EBT is AWS

これはいくら主張しても良いと思うんですけど、EBTってAWSなんですよね。上に書いた通りEC2とかの寄せ集めでしかないんですよね。
個人的には、EC2の横にEC2+DeployToolsとかそういうのが増えた感じで認識してますね。
なので、慣れたEC2とまったく同じ事ができるんですよ。たとえばインスタンスSSHでログインできる。

RDSが素晴らしいのは皆さん知ってますよね?わりとよくわからん共有Mysqlではなく、ちゃんと(?)VirtualPrivateなMysql。バックアップもすばらしい。リードレプリカも作れる。
私がやっぱりオールドタイプなのかもですけど、よくわからない共有は不安なんですよね。まあRDSなら基本はなんでもできるし、むしろボクよりも優れたADMINがDBさわっててくれるのと同じじゃないですか。

DynamoDBやElastiCache(Memcached)も、無いとまた管理するサーバー増えるのか…って憂鬱になりますよね。

あとはRoute53!S3!これらは別にAWS以外でもつかえますけど、やっぱり距離が近いと便利ですよ…
Route53がないと、結局どっかにDNS立てるのかよー(または、お○前.comとかいう割と○ったレンタルDNSとか…)って感じになりますからね。


まーここら辺は全部趣味かもですね。
でも、いざというときに、細かくさわれるのとさわれないのって全然別ですからね。
なんかバッチ的に色々作業したくなったときに、Ec2一台たててそっちからごちゃごちゃさわったりできるってだけでもずいぶん違うとおもいますよ?

EBTの使い方 (あるいはphpinfo()を出すまで)

AWSの管理画面で設定

AWSに登録が終わっている前提でサクサクいきます。
https://console.aws.amazon.com/elasticbeanstalk/home
ここに最初アクセスすると、おそらく「サンプル作るか?それとも独自をULするか?」と聞かれるので、独自にしましょう(サンプルは、初期のApp名やEnv名がよくわかんないです)。独自と言ってもサンプルで作成出来ます。


ここで色々設定しますが、重要なのはEnvironmentとApplicationの名前です。
Environment(以後Env)は、仮装サーバーセットで、Application(以後App)は、Git repoだと思おう、多分大体あってると思う。
ここでは仮にtestenv testappと設定したとします。


ZIPをULするか、Sampleにするか?と聞かれるので、これはSampleにしておきます。

適当に進むと押すと、EnvとAppが作成されます。裏でがっちゃがっちゃと色々設定され、2〜3分(割と時間かかる)で、Envが立ち上がってきて、アクセスが出来るようになります。
初期状態だと「Congratulations!」とかでてるはずです。

EBTツールセットアップ

さっそくコードをUlしましょう、ZipでもULできるらしいですけど、当然Gitつかいます。*1
http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/GettingStarted.GetSetup-devtools.html
コードをULするにはGitをつかいます。Git入れて下さい。
また、このAppのVersion管理にGitでPushするのに、Gitの拡張を入れる必要が有ります。

まあ、色々とかいてはありますが、
http://aws.amazon.com/code/6752709412171743
これをDLして、どこかに展開しておく

Gitrepoを作って初期設定

適当な場所にGit Repoを作る、そのrepoのroot dir で、さっき展開したファイルの中の
/path/to/AWS-ElasticBeanstalk-CLI-x.x/AWSDevTools/Linux/AWSDevTools-RepositorySetup.sh
を実行(Macでも、Linuxディレクトリにあるものを使う)実行してもなにもいわれないけどこれで適用されました。


gitのroot dirに、index.phpにphpinfo()を書いたファイルをつくって適当にcommitしましょう。
あ、gitのrootdirが DocumentRootになります。これは地味にどうなの感ありますけど…どうなの?


さておき、そしたら、
http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/create_deploy_PHP.sdlc.html
の通りに

git aws.config

を実行して、
AWS Access Key、AWS Secret Key、AWS Region*2AWS Elastic Beanstalk Application(EBT App名)、AWS Elastic Beanstalk Environment(EBT Env名)を設定。
(失敗したらやりなおせばよし)

push

以上を設定して、Envが正しく起動しているなら、

git aws.push

で書いたコードがデプロイされます。

AWS管理画面にもどって、「URL」の所や、View Running Versionボタンをおしてみるよろし。(うごいているEnvをブラウザで開けます)


ここでしばらくしても反映されていない場合(Congratulations!がでている場合)、Envの所で、Deploy a Different Versionをクリックして、Deploy an existing versionのプルダウンをえらんで、DeployVersionしよう(ここがすでにgit-{comitID?}になっていても、ちょっと変更してDeployVersionすると、再デプロイしてくれます)。

そしたらうまくいくのでは?


あとはいつも通りに適当に書いて、Commitして、Pushしまくればいいですね、以上です。
(最新の?Versionの設定にしておくと、Pushに自動追従してくれるっぽいですね、まだ挙動よくわかってない)

Env固有の設定について

EBTは、同じAppを複数のEnvでたちあげて、開発環境と本番環境を同列でうごかしたりできます。
当然おなじrepoをつかうので、設定ファイルをEnv毎に切り換えることが必要であり、それはEnvの「Edit Configuration」から行います。
Containerタブに、ちょっとしたPHPの設定項目があり、その下に「Environment Properties」というのがあり、ここのPARAM1とかに適当なテキストを書き込むと、

echo get_cfg_var('aws.param2');

こんなコードでパラメタを呼び出せます。


フィールド数は5個くらいしかないので、いきなりここにDSNとか書かず、設定ファイルを複数つくって、これで切り換える感じなんですかねー。

Applyしたら自動的にEnvが再起動されて、ちょっとしたら反映されるようになります。

Envでうごいている実体(Ec2)へのssh

実体はEC2なので、EC2の管理ツールに、なんか起動した覚えのないインスタンスがいるとおもいます、そいつです。

もし居なければ、EBTうごかしているリージョンと同じリージョンであるかは確認しましょう。

そいつにEnv作成時に鍵登録をわすれていなければ、普通のEC2同様にsshできます。

ログは?

S3に出力する仕組みがあるが、EC2にログインしてTailしたほうが良いのでは…感ありますw

という感じです

あとは、DBがほしければ、RDSを契約してEC2とおなじ感じで使ったりしましょう。まあ、とてもシンプルだと思います。
シンプルな割に裏ではガッチャガッチャと色々うごいててすごいなー感すごい。俺絶対にこんなシステムくみたくねえや!(一個とまったら全部止まるだろ…)

おわりに

やろう!LTソン!
http://ltthon-yapc2012.hachiojipm.org/
_人人人人人人人_
> 突然の宣伝 <
 ̄^Y^Y^Y^Y^Y^ ̄

*1:これZip配布してアプリを…とはできないし、なんだろ、Git使えない層向け…?まさかな…、JavaのWarファイルのつもりなのかしら

*2:EBTの設定画面の左上にある、なにもかんがえないとUS East(Virginia)なので、us-east-1、http://docs.amazonwebservices.com/general/latest/gr/rande.html とかで調べる。いつも思うのだが、リージョンと、リージョンID?の正しい対応表ってどこにあるんだろ??