つかびーの技術日記

情報系修士卒のWeb系技術日記です。現在のフォーカス分野はアドテクです。

Webアプリを楽々デプロイ!herokuもいいけど、Amazon Elastic Beanstalkもおすすめ!

      2014/03/14

今回はAmazon Elastic Beanstalk(アマゾンエラスティックビーンスターク)の導入とトラブルシューティングの話です。

最近Web業界ではherokuが話題になっています。簡単にデプロイ・公開できますし、750時間/月なら無料ですし、スケールアウトもheroku公式のGUIからDyno(サーバ)数を増やせば良いので簡単です。もちろんherokuも良いのですが、Amazon Elastic Beanstalkも負けていません。1年間だけであれば無料枠もありますし。

今日はこのAmazon Elastic Beanstalkを使っていきます。始めはGUIでサンプルアプリを作成する手順を紹介します。次にコマンドラインからアプリを作成する手順を紹介します。コマンドラインと言ってもそれほど難しくないので、慣れたらコマンドラインおすすめです。

Amazon Elastic Beanstalkって?

Amazonが提供するPaaSです。

Elastic Beanstalk Management Console

アプリケーションを簡単にデプロイする仕組みとプラットフォームの集合です。プラットフォームと言っても実態はAmazon EC2などで、Elastic Beanstalk経由で作成すると、EC2インスタンスが自動で作成されます。AWSの既存サービスの集合体と言っても良いですが、便利な機能が多数あるのでおすすめです。

準備

以下を準備しておきます。

  1. AWSのアカウント取得
    参考:Amazon S3を使ってみた!(zip配布用途でAWS登録~運用まで)
    S3の作成までは必要ありませんが、アカウント登録までは必要です。
  2. 開発環境
    お好きな言語やフレームワークを用意すれば良いですが、今回はNode.jsを例に挙げます

GUIからAmazon Elastic Beanstalkアプリを作ってみる

GUIからアプリ作成

まずはGUIをぽちぽちやってサンプルを作ってみます。

TOPページからCreate Applicationを押して必要事項を以下の要領で入れていきます。画像ではtsuka-sampleなどとなっていますが、自分が分かりやすいように自由に入力してください。

Create Application1

以下の画面ではサーバをどのような構成にするかを設定します。Predefined configurationはご自身の言語に合わせて選択します。今回はNode.jsで行きます。Environment typeは2つありますが、どちらでも良いです。ここではLoadbalancing, auto scalingを選択します。こちらを選択するとEC2インスタンスに加えてロードバランサやオートスケールの設定が追加されます。

AWS無料枠にロードバランサも含まれているようなので、今回はありでやります。

Create Application2

以下はそのままContinueします。

Create Application3

以下もそのままContinueします。ただし、注意があってEnvironment URLとなっている部分はインターネットに公開されます。つまり、画像ではtsukasample-envとなっていますが、これが既に存在する場合は弾かれてしまいます。

sampleなどとありきたりな値は既に取得されているので弾かれます。

Create Application4

ここもそのままContinueします。

Create Application5

ここもそのままContinueします。もし後で生成されたEC2インスタンスに入りたいのであれば、EC2 key pairで予め作成しておいたキーを設定しておくと良いです。これらも結局は後で変更できますし、あまりインスタンスに入る必要もないので、空で問題ありません。

Create Application6

最後に確認画面が出るため、OKを押して完了です。

矢印がくるくる回っていますが、これは現在インスタンスが作成されていたり、デプロイされているということです。暫く待ちます。(1分〜3分)

tsukaSample-env - Dashboard7

完了しました!

tsukaSample-env - Dashboard8

「tsukasample-env.elasticbeanstalk.com」というようにリンクが張られているので早速アクセスしてみます。

Elastic Beanstalk9

デフォルトのサンプルアプリが動いています!以上で完成です。EC2の管理画面もぜひ確認してください。自分が選択・設定したEC2インスタンスやロードバランサが作成されています。

GUIから自作サンプルをデプロイする

次は自作のサンプルを動かしてみます。まずは以下のようなserver.jsを作成して、Node.jsで動かしてみます。画面にres.end()のHTMLを表示する簡単な例です。

Page Image10

表示されました。確認はできたので、いよいよGUI経由でElastic Beanstalkにアップロードします。

server.jsをzip圧縮します。ここで圧縮に少し注意が必要です。圧縮は必ずserver.jsがルートに来るようにしなければなりません。解凍したときに何かフォルダがあってその中にserver.jsがある、というような状況だと502 Bad Gatewayになります。

NG

OK

圧縮した上記のアプリをアップロードするとデプロイが始まるのですが、残念ながらこのままでは正しく動きません。502 Bad Gatewayが出ます。

答えはAmazon Elastic BeanstalkのNode.jsアプリはポート8081で動作することを想定しているためです。上記のコードはlistenが3000ポートなのでダメ、だと言う訳です。

答えは簡単ですが、実際にエラーが出たときはログを見て解決することを推奨します。ここでEC2インスタンスにアクセスしてログを見る必要はありません。

ログを見てトラブルシュート

管理ページの左側のLogを押した後で、Snapshot Logsボタンを押します。こうすることでログファイルをかき集めて1つにしてくれます。

tsukaSample-env - Logs11

errorで検索すると案の定それっぽいものが見つかります。

connect failedでportが8081なので「ん?」と思えます。

修正〜完了

上記のサンプルコードを以下のようにして、ポートを8081に変更します。

これをまたzipにしてアップロードすると正しく動きます。

Page Image12

もし、デプロイに失敗してもElastic Beanstalkは過去のバージョンを保存しておいてくれますので、そこから復元することができます。

Upload and Deploy -> All versionsで一覧を表示して好きなものを選べば元に戻せます。これでもしものときも安全ですね!

tsuka-sample - Application Versions13

CUIからAmazon Elastic Beanstalkアプリをデプロイする

追加準備

  1. gitインストール
    コマンドを使います。
  2. AWS Elastic Beanstalk Command Line toolインストール
    http://aws.amazon.com/code/6752709412171743
    以降でebコマンドを使うために必要です。
    DL後、/usr/localなど適当なところに解凍し、PATHを通しておけば良いです。私はhomebrewを使っているのでbrew install aws-elasticbeanstalkでインストールしました。
  3. AWS access keyとAWS secret keyの取得管理画面右上の名前の部分をクリックしてSecurity Credentialsをクリックします。以下のような画面が表示されるので、Access Keysの部分からCreate New Access Keyボタンを押して生成・メモします。

IAM Management Console14

gitコマンドやebコマンドを使ってデプロイ

こちらも参考になるため、あわせてご覧下さい。

AWS Elastic Beanstalk – Ebを使ってコマンドラインから簡単操作! – Amazon Web Services ブログ

まず前述のserver.jsを再利用していくことにします。違いが分かるようにメッセージを一部変えておきます。

pタグ部分をFrom eb commandとしました。最終的にこれが画面に出るアプリがデプロイできればOKです。

では早速。

これでデプロイまでできました!早速URLを覗いてみるとちゃんとデプロイできています!

Page Image15

ここまでgitコマンド、ebコマンド、git aws.pushと非常に少ない手順で実施できました。これなら覚えられますね!

今回eb initのときにいくつか入力を行いました。このとき既にGUIで作成していたアプリ名tsuka-sampleと環境名tsukaSample-envを入力しました。そのため、eb start時にインスタンス等が生成されず、既に存在する環境にデプロイすることができました。もちろん、GUIでアプリや環境を作成していない場合、eb start時に自動で新規作成されます!

コードを変更したときはgit add, commit, aws.pushなどを繰り返せばOKです。

その他便利機能

eb startで作成されるアプリの環境をカスタマイズする

さて、ここまででも十分ですが、もう一つこれは良いかも!と思った機能を紹介します。

Elastic Beanstalkの管理画面にConfiguration -> Environment Propertiesがあります。ここでは自分で自由に環境変数を設定することができます。

tsukaSample-env - Configuration16

例えば上記のように設定するとNODE_ENV変数にproductionが設定された状態でアプリケーションが動作するようになります。これでNODE_ENV=空のときはポート3000かつローカルDB参照モードでアプリを動かし、NODE_ENV=productionのときはポート8081かつ本番用DB参照モードでアプリを動かす、といったコーディングが可能になります。

さて、このページには色々な設定がありますが、実はこれはebコマンドを使うデプロイでも設定することができます。

git initしたフォルダの下の.ebextensionsフォルダにstatic.configというファイルを作成し、以下のように記述します。

.configファイルの設定の仕方は色々あるので、AWS公式ガイドなどを見ると良いかと思います。

EC2インスタンス作成後にyum installさせるだとか、任意のコマンドを発行させる、だとかもできますので、柔軟に環境を設定できるかと思います。

モニタリング

本格的なサービス運営だとか、サーバの状態調査だとかにはモニタリングが必要です。Elastic Beanstalkにはその機能が自動で備わっています。

anime-lineup-env - Monitoring17

アプリ起動直後はデータが無くて何も出ませんが、ある程度起動しておくと上記のように表示されます。これは便利ですね。

Amazon Elastic Beanstalkいかがでしょうか。まだまだ評価できていない部分や知らない部分も多いですが、現状ではかなり使えると思っています。みなさんも趣味やプロジェクトで使ってみてはいかがでしょうか。

 - サーバ ,