AWS Elastic Beanstalkを使って環境構築してみた

f:id:watass:20141103203916j:plain

最近AWSが楽しすぎて1年契約した某VPSの方を放置しっぱなしです。よくないですね。
諸事情により、今年中にAWSのソリューションアーキテクトを受ける事にしたので、しばらくAWSしか触らない生活が続きそうです。本業のプログラミングが進まない進まない。そろそろフレームワークの選定とかしたいんですけどね。
前回まででEC2を直接立ち上げて、Webサーバとして運用する話をしましたが、EC2を含むいろいろなAWS便利サービスを包括的に扱えるElastic BeanstalkというサービスがAWSでは提供されているので、早速触ってみようと思います。



Elastic Beanstalkとは

Elastic Beanstalkとは、AWSにて提供されているアプリケーションを統合管理することができるプラットフォームです。と、言ってもピンとこないですよね。
AWSではElastic Load Balancer(ELB)やAuto Scalingといったサービスを活用することで、本来ならば構築に非常に苦労するようなスケーラブルなWebサービスを用意に構築することができます。しかし、いくらクラウドで簡単にサービスの設定ができるとはいえ、各種設定は非常に面倒です。Auto Scalingはどんなトリガー条件でインスタンスの拡張をして、アベイラビリティゾーンはここで、セキュリティグループはこれで、とかELBのヘルスチェックはこれを条件にして、とかいちいち設定するのは面倒なわけです。
それらの煩雑な設定作業を自動で行ってくれるサービス、それがElastic Beanstalkです。ユーザ側から必要最低限の要求事項さえ設定すれば、Elastic Beanstalkはそれに応じて、ELBやAuto Scalingの設定を変更します。
Elastic Beanstalkはアプリケーションという単位で各種環境やサービスを包括管理します。環境に近いと思ってもらって相違ないと思います。本番環境、テスト環境とかが1アプリケーションという感じかな?つまり環境を全部自動で生成してくれるサービスなわけです。

・・・なんかこれだけでもすごそうに感じますよね。
早速使ってみましょう。


さっそく使ってみる

マネージメントコンソールにログインして、Elastic Beanstalkを選択しましょう。

f:id:watass:20141116212126p:plain

すると熱烈な歓迎を受けることができます。早速PHPプラットフォームを選択してLaunch now...と言いたいところですが、デフォルトで色々設定すると後でわけわからなくなるので、右上のCreate new applicationから始めることをおすすめします。

f:id:watass:20141116212618p:plain

すると、各種設定を最初に自分で行えるので、ガンガンやっていきましょう。

Application Infromation

作成するアプリケーションの情報を設定します。
Application nameには名前を、Descriptionには説明を設定します。なんでもいいです。

Environment Type

作成する環境のタイプを設定できます。
Launch a new environment running this application
新しい環境を作りますか?みたいな。既存の環境があればそっちに作成することもできるんだろうか・・・とりあえずチェック入れておいていいです。
Environment Tier
環境の種類設定。Web Serverでよいでしょう。
Predefined configuration
プラットフォームの選択。いろいろ選べますが、PHPをチョイス。
Environment Type
環境のタイプ。インスタンス単品か、ロードバランシングするか。Elastic Beanstalkを使うメリットを考えるならば、やっぱりロードバランサもオートスケーリングも採用したいよね。

Application version

アプリケーションに載せるプログラムの指定ができるっぽい。
この時点でプログラムを設定することも、S3から参照することもできますが、とりあえずSample applicationを選んでおきましょう。もちろん実物があればそれを指定してもOKです。

Deployment Limit

デプロイにおけるサービスの可用性を設定できるみたいです。
ちょっとよくわかんなかったんで、デフォルトのままです。

Environment Information

環境の情報設定。名前とURLのサブドメインを指定できます。
テスト環境、本番環境を使い分けるならば、URL名にはそれをわかるようにpublicとかtestとかしておくといいかもしれません。

Additional resource

RDSとかVPCとかの追加設定をするか選べます。
ここまで設定すると忙しいんで、今はパスしておきましょう。

Configuration Detail

その他の詳細設定です。
Instance Type
インスタンスの種類が指定できます。無料枠の強い味方、t2.microでOK。
EC2 key pair
既に作成した鍵を選択できます。設定するとその鍵でSSHが繋げるようになります。
Email address
Auto scalingなどで環境への変更が発生した場合に、メールを飛ばす先を指定できます。
とりあえず適当なアドレスを指定しておきましょう。
Application health check
定期的にヘルスチェックするURLを指定できます。
ここが落ちたら困る、というURLが指定できますね。
Enable rolling update
ロール更新を有効化するかの設定。更新時に全部を一括、というわけではなく、サービスが正常に動作するように順々に更新できるみたいな設定らしいです。
Cross Zone Load Balancing
複数アベイラビリティゾーンを利用するかの設定。これはチェックしておこう。
Connection draining
インスタンスが落ちたと判断されたときに、そのインスタンスで処理されているリクエストを何秒処理させるかの設定。タイムアウトするまでの時間を設定できます。
Instance profile
よくわからんからデフォルト

Root Volume

インスタンスに紐づくボリュームを設定できます。
SSDにするかとか、容量とかを設定できますが、デフォルトなら8GiBのEBSが生成されます。

Environment Tags

タグを設定できますが、今は設定しなくてもいいです。


長かったですが、設定は以上です。
本当にユーザ本位の設定しかしていませんね。
設定内容を確認し、Launchをクリックして、しばらく待ちましょう。

f:id:watass:20141116220051p:plain

こんな画面が表示されれば完了です!
URLにアクセスすると、サンプルページが表示されますので、ぜひ確認してみてください。


Elastic Beanstalkが作ってくれたもの

さて、慎重な人ならばこの段階でちょっと待って、いろいろやってくれたことには感謝するけど、もしかして高いサービス勝手に起動してない!?と心配になるはずです。僕もそうです。
何が生成されたか、についてはダッシュボードのRecent Eventsを確認するとなんとなくわかりますが、それだけだと不安も残りますので、個人的に調べた感じで生成されているものを無料枠と照らしあわせて確認してみます。

Elastic Comupute Cloud (EC2)

仮想サーバです。そりゃできてますわな。
インスタンスタイプは設定時に指定したt2.microになっています。内部的にはApacheが起動していて、PHPは5.5がインストールされているようです。ちなみに、OSはAmazon Linux AMIです。EC2のダッシュボードからも、Elastic Beanstalkで起動したインスタンスが確認できるので、よかったら見てみるといいんじゃないでしょうか。
無料枠では、t2.microならば月750時間まで無料なので、インスタンス複数立ち上がっていないか確認しておくと精神的に安定します。

Elastic Block Store (EBS)

EC2に付随するストレージです。設定時にボリュームや種類を選択したと思います。デフォルトなら8GiBで生成されています。無駄にハイスペックなEBSを使用していなければ、累計30GiBまでは無料枠なので、他のEBSがある場合には破棄しておきましょう。

Simple Storage Service (S3)

障害に強い&アクセシビリティの高いストレージです。容量設定は特にないです。
妙な設定をしていなければ、S3にデータが転送されることはないはずです。月5GiBかつ一定以下のリクエスト数までは無料らしいので、とりあえず安心しましょう。

Security Group (SG)

EC2に付随するファイアウォールみたいなものです。これも勝手に作られます。
設定はEC2ダッシュボードから選択して編集できるので、気に食わなければ変更しましょう。特に課金要素はないと信じています。

Elastic Load Balancer

ロードバランサです。月750時間までの低データ転送量ならば無料です。
基本的に一台だけならば無料だと思います。

Auto Scaling

負荷に応じて、インスタンスのスケールアウトを行います。自動でインスタンスを増やしたり、減らしたりしてくれる頭のいい子です。しかも無料です。とはいえ、DoSとかで大量にインスタンスを増やされるおそれがあるので設定には注意が必要ですね。

Cloud Watch

モニタサービスです。アラートの設定もできます。こいつがEC2やELBを監視して、問題があったらAuto Scalingを実行するみたいな感じですね。監視間隔がデフォルトだと5分ですが、1分にすると有料らしいです。

Simple Notification Service (SNS)

通知サービスです。指定したメールアドレスに何かあったら連絡するのがこいつです。
データ転送量が規定値以上、もしくは100万件以上の通知から有料なので大丈夫でしょう。


ざっと確認した限りでこんなところですね。
さて、何が動いているか確認して安心したところで、最初の設定時には変更できなかった各種設定を変更する方法を次で紹介しましょう。


各種サービスの設定変更

さて、ここからは環境の設定変更です。
Elastic Beanstalkの画面から、Configurationを選択しましょう。

f:id:watass:20141116222712p:plain

英語だらけで気持ち悪くなってきますが、ここで耐えなきゃAWSの恩恵は預かれません。
全部書くとさすがに大変なので、ざっと書きます。

Scaling

Auto scaling関連の設定ができます。
Auto scaling
スケーリングする最大、最小のインスタンス数とか、アベイラビリティゾーンの指定などができます。最大値と最小値を同じにすると、常に一定数で管理してくれます。今は両者ともに1にしておきましょう。
Scaling Trigger
Auto scalingを実行するきっかけとする条件を指定できます。トラフィックの平均値が何バイト以上ならインスタンスを+1とか、逆に何バイト以下ならインスタンスを-1など柔軟に設定できます。

Instance

インスタンスの設定です。
Server
サーバの設定です。インスタンスタイプとか選択できます。監視間隔もここで設定できますが、1分にすると有料なので注意しましょう。
Notification
SNSが指定している連絡先です。ここでも変更できます。

Software configuration

主にプラットフォーム側の設定ができます。phpの場合、php.iniを編集するイメージです。
Container Options
PHPの設定ができます。ドキュメントルートとかメモリ設定とか。PHPの使用環境に併せて、お好みで設定すればいいと思います。ただ、Max execution timeはelastic beanstalkによって終了されるときに、最後までスクリプトを実行できる時間を指定できるみたいです。これでスクリプトの実行漏れをある程度回避できるっぽいですね。
Log Options
ログをS3にローテートできるみたいです。今は設定しなくてもいいでしょう。
Environment Properties
環境変数の設定ができる模様。あんま詳しくないので、ここでは無視しました。

Updates and Deployments

ロール更新とか、デプロイ時のダウンタイム設定とか、デプロイ成功判定の時間とかも設定できるっぽいですね。今は弄らなくてよさそう。

Load Balancing

ロードバランサの設定はここでできます。
Load Balancer
リスナーポートの設定とかができます。デフォルトだとhttpのみですけど、特に問題はないでしょう。
Sessions
セッションごとに負荷分散ができる設定です。なお、セッション判別には特殊なクッキーを発行するので、その有効期間も設定できます。
EC2 instance health check
ヘルスチェックの設定です。チェック間隔、何秒でタイムアウトをみなすか、ヘルスチェック失敗や成功判定は何回のタイムアウトや接続成功で判定するか、などが設定できます。


だいぶ雑だった気がしますが、だいたいこんな感じです。
ほぼデフォルトのままで問題ないって感じですね。せいぜいAuto Scalingのインスタンス数を少なくするぐらいです。
次はプログラムのデプロイをやりましょう。


Webアプリのデプロイ

Webアプリのデプロイをやるとすれば、gitなどを使ってドキュメントルートにプログラムを配置するのが基本だと思いますが、Elastic Beanstalkを使えば、GUIからささっとできます。
ダッシュボードのUpload and Deployを選択してみましょう。ここでzip圧縮したプログラムと、バージョン管理に必要なラベル名を指定します。ちなみに、今回はこんなindex.phpをzip圧縮したものを使用しました。

<html>
<head>
<title><?php echo 'Hello, Beanstalk!'?></title>
</head>
<body>
<h1><?php echo 'Hello, Beanstalk!'?></h1>
My name is wata.
</body>
</html>

さて、選択したら、後はDeployを押すだけ。
これでしばらく待つと、HealthがGreenになります。URLにアクセスすると・・・

f:id:watass:20141116225041p:plain

早速反映されました!


まとめ

  • Elastic BeanstalkはAWS使うならまず最初に使ってよしなサービス
  • 環境構築を自動でやってくれるので楽だけど、設定をよく確認しないと危険
  • zip圧縮したファイルを上げるだけで、デプロイが楽ちん


マネージメントコンソールの日本語化はよ

とにかく英語と戦った記事でした。マネージメントコンソールの日本語化みたいな話はちょっと前からされているようですが、早急にやってほしいですね。ええ。
後、Gitをせっかく勉強したので使いたいんですが、どうにもCUIからやらざるを得ないみたいな感じで、せっかくGUIで完結するAWSの良さが損なわれてしまう気がするんですよねー。既存のGitクライアントでAWSに対応するとか、AWS側がGit用の新しいサービス始めるみたいな動きがあると嬉しいですね。
なお、課金を恐れる僕は、とりあえずプログラムを配置していない現在は作成した環境を削除することにしました。みんなも下手に放置して、Auto Scalingの餌食になるなよ!(何


参考にした記事

2秒で設定! AWS Elastic Beanstalk によるオートスケールアウトなサーバー構築 | DX.univ
# Beanstalkの説明がよくわかりやすくて、一番参考になりました。
ElasticBeanstalk - AWS Elastic Beanstalkで環境構築自動化 - Qiita
# Beanstalkの詳細設定が深堀りされていて参考になります。また読み返します。
Amazon EC2 編。ClowdWatch による EC2 の監視方法をご紹介 | nagios・CloudWatch・アラーム・ナレコムAWSクラウド | ナレコムAWSレシピ
# Cloud Watchがあまり理解できていなかったので参考になりました。
AWS公式ドキュメント各種
# learn moreで見れるドキュメントは全部参考になるから読んどけって話しね。