AWS再入門 AWS Elastic Beanstalk編

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

よく訓練されたアップル信者、都元です。当エントリはDevelopers.IOで弊社AWSチームによる2015年アドベントカレンダー 『AWS サービス別 再入門アドベントカレンダー 2015』の13日目のエントリです。昨日12日目のエントリは梶の『Amazon Inspector』でした。

このアドベントカレンダーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

本日13日目のテーマは『AWS Elastic Beanstalk』です。

目次

サービスの基本的な説明

みなさんは、なぜAWSを使うのでしょう。突然大きく出過ぎました。。。まぁ「サーバが使いたいから」や「幸せになりたいから」等、色んなレベル感の答えがあると思いますが、その中で「Webアプリケーションを運用したいから」というものがあると思います。多分。

Webアプリケーションを開発した時、それをサービスとしてインターネットに公開するには、一般的にITインフラと呼ばれるサーバやネットワークが必要です。そして、AWSはITインフラを提供してくれるサービスです。

しかし、アプリケーションを運用するためのインフラをAWS上に構築するためには、AWSの知識はもちろんのこと、OSやネットワーク等について多様な知識が必要です。AWSは、各システム固有の細かい要件に柔軟に対応するために、詳細で複雑な設定項目が無数にあり、正直なところ一朝一夕でどうにかなる知識の量ではありません。

ただ、逆に考えれば「細かい要求はしない、とにかくオススメのインフラをくれ、アプリケーションはそれに合わせて作る」と割り切れるのであれば、複雑な部分を隠蔽した状態で、シンプルにAWSを利用できるはずです。Elastic Beanstalkはそのような要求に応えるサービスです。

以下に説明する「一定のお作法」に則ってアプリケーションを開発すれば、あとはEC2やネットワークの存在を強く意識することなく、アプリケーションのデプロイと管理ができます。

開発言語(プラットフォーム)としては、現在主に下記に対応しています。

  • Node.js
  • PHP
  • Python
  • Ruby
  • Tomcat (Java)
  • IIS (.NET)
  • Docker

Dockerに対応しているので、コンテナさえきちんと構成すれば、開発言語によらずほとんどのシステムを運用できます。

AWS Elastic Beanstalkの公式ページにYouTube動画が展開されていますので、併せて載せておきます。

サンプルアプリを起動してみよう

まずはAWSにログインして、Elastic Beanstalkのコンソールを開いてみましょう。Beanstalkを利用していない状態では、下記のような画面となります。

screenshot 2015-12-04 17.19.15

とりあえずPHPで環境を立ち上げてみましょう。Select a platformの中からPHPを選択して、Launch Nowボタンをクリックします。

screenshot 2015-12-11 15.12.10

えっ!? って思う間もなく環境が作られ始めます。この環境にデプロイするアプリは、Beanstalkのサンプルアプリです。

screenshot 2015-12-11 15.13.42

数分後、HealthがGreyからGreenになれば配備完了です。URLとして示されたリンクを開いてみましょう。

Default-Environment_-_Dashboard

下記のようなサンプルページが表示されれば成功です。

screenshot 2015-12-11 15.22.11

ここまでインフラの知識一切なし。たった1クリックでアプリケーション動作環境を作れてしまいました。一応種明かしをしておきますと、普通にEC2インスタンスが立っていて、そこにアプリケーションがホストされている状態です。

EC2_Management_Console

カスタムアプリをデプロイしてみよう

さて、サンプルアプリを起動しているだけでは何の嬉しさもありません。自分で作ったアプリをデプロイしてみましょう。

まずはサンプルアプリを用意します。変に複雑なものを用意しても本エントリーの趣旨から外れますので、ここはPHPの分かりやすい例として phpinfo を表示するだけのアプリを作ってみました。

$ echo "<!--?php phpinfo()" >phpinfo.php<br ?--> $ zip sampleapp1.zip phpinfo.php
adding: phpinfo.php (stored 0%)
$ unzip -l sampleapp1.zip
Archive: sampleapp1.zip
Length Date Time Name
-------- ---- ---- ----
16 12-11-15 15:06 phpinfo.php
-------- -------
16 1 file

このsampleapp1.zipが用意出来たら、マネジメントコンソールからUpload and Deployを選択します。

Default-Environment_-_Dashboard-2

ポップアップしたダイアログにて、Upload applicationの項でsampleapp1.zipを選択します。Version labelの項は自動的にsampleapp1が入ります。これはバージョン番号等を書き込む場所ですので変更してもかまいませんが、ひとまずここではそのままにしておきます。

screenshot 2015-12-11 15.45.30

その他色々な項目がありますが、デフォルトのままでDeployボタンをクリックしてください。再びステータスがGreyになりますので、Greenになるまで数分待機してください。

アプリのURLにアクセスするとForbidden…。そうです。index.phpがありませんからね。

screenshot 2015-12-11 15.51.26

あらためて、パスを / から /phpinfo.php に変えてアクセスしてみると…。あれ。

screenshot 2015-12-11 15.50.46

そうです、コード末尾のセミコロンを忘れていますね。修正して、今度はsampleapp2.zipを作成し、同じようにデプロイしてみましょう。

screenshot 2015-12-11 15.50.30

あらためて /phpinfo.php にアクセスしてみると、無事phpinfoが表示できました!

screenshot 2015-12-11 15.56.02

PHPにおいては、基本的にはdocument root配下に配置するファイル群をzipで固めたものをデプロイできます。その他言語毎にzipファイルの作り方にお作法がありますが、そんなに難しいものではありません。Tomcat (Java)であればwarファイルですし。

サービス利用のユースケース

AWSの難しいところを意識せずに、素早く運用環境を用意したい

先に説明した通りです。驚くほど簡単に、AWSに最適化された運用環境を手に入れられます。ただし、作りこんでしまったアプリケーションが既にあって、それに合わせた運用環境が欲しい、という要求には残念ながら応えられません。

AWSの推奨構成が知りたい

AWSでは、基本的に単一のサーバでシステムを運用することは避け、Multi-AZと呼ばれるシステム構成を作ることを推奨しています。これにより、高い可用性と拡張性を併せ持つシステムを構築可能です。参考: AWSにおける可用性の考え方 | Developers.IO

Elastic Beanstalkにより出来上がる環境は、もちろんこのMulti-AZ構成となっていますので、実際に出来上がったEC2やELBの設定を見て、AWSが推奨するインフラ構成を学ぶことができます。

かくいう私も、Beanstalkの構成から様々なAWSの知識を学び取ったと思っています。

構築だけではなく、デプロイ運用を省力化したい

私がBeanstalkを利用する主たる理由はここにあります。私はAWSのアーキテクトとして、それなりにAWSのことに詳しい自覚があります。従って「難しいところを意識したくない」という段階はとっくに通り越していますw そんな私でもBeanstalkを利用しています。

システム環境は、一度構築して終わりではありません。継続的に運用していく必要があります。アプリケーションのバージョンアップも定期的に発生する運用タスクの一つです。

一般的には、既に運用中のAWS環境に対して新しいバージョンをデプロイするために、手順書や自動化スクリプトを作ったりしますね。クリティカルなシステムでなければ、デプロイ時に数分のシステム停止が発生することが許容できるかもしれません。しかしモダンなシステムでは無停止のデプロイ運用が必須となり、Rolling Update や Blue-Green Deployment 等のテクニックが求められます。

そんなこんなで、新しいバージョンのアプリケーションのデプロイする仕組みを作るのは、実はかなり骨の折れる仕事です。具体的には、EC2の UserData を駆使したデプロイスクリプトを作ったり、各バージョン毎のマシンイメージ(AMI)を作成して、そのIDを管理したり、といった作業が必要です。ChefやAnsible、Packer等を使いこなすような話です。

ただし、インフラに特殊な要求をしないのであれば、アプリケーションのデプロイというのは共通化できるタスクです。このようなシンプルなデプロイの仕組みを提供するのがElastic Beanstalkなのです。

具体的には、上で見ていった通り、アプリケーションをZIPにかためてBeanstalkに渡してやるだけで、あとはBeanstalkが全ての面倒をみてくれます。

あわせて読みたい

公式情報

Developers.IO関連エントリ

次のステップに進むためのエントリ

さいごに

以上、『AWS サービス別 再入門アドベントカレンダー 2015』の13日目のエントリ『AWS Elastic Beanstalk』に関するご紹介でした。TBD

明日(12/14)は川原の『AWS CodeDeploy』に関する紹介の予定です。お楽しみに!