AWSのElastic Beanstalkで「php5.4」「nginx」環境を作る
はじめまして、新規事業推進部でフロントエンジニアをやっていますジョニーです。
ソニックムーブでは入社してすぐにあだ名をつける風習があり、鰯(いわし)さんに「ジョニー」と名付けられたのですが、なぜジョニーになったのかは未だによくわかっていません。
それと、肩書きはフロントエンドエンジニアなのですが今のところ入社してからバックエンドの仕事しかしたことが無いので肩書きも怪しいところがありますが、今回はバックエンドの仕事で学んだ事としてAWS Elastic Beanstalkで「php5.4」 「nginx」を使う方法を紹介したいと思います。
なお、今回の記事ではEC2を使ってsshでログインしたことがある人を対象に書いたので、ところどころ知っている前提で話を進めているところもあるのでご了承ください。
Elastic Beanstalkとは
まずElastic Beanstalkとはどんなものか簡単に紹介したいと思います。
Elastic BeanstalkとはHerokuやGoogle App Engineなどと同じようにPaaSの1つです。
PaaSとはこちらも簡単に言うと、例えばWebサービスを提供するとした場合、必要となるインフラ周り(Webサーバーや場合によってはMySQLなどのデータベースサーバー、開発する際に用いるプログラミング言語(phpやrubyなど)の導入など)の面倒な部分をやってくれて、PaaSを使うユーザーは開発(プログラムを組む)だけに集中すればよいといったサービスです。
もっと詳しくPaaSについて知りたいという方は探せばgihyo.jpさんの記事「第4回 プラットフォームを作るPaaSを理解する――PaaSとIaaS,SaaSの違い」を参考にしていただけたらと思います。
AWS Elastic Beanstalk Command Line Toolを使う
Elastic Beanstalkに作業プロジェクトをアップロードする方法は以下の2通りあります。
- AWS Elastic Beanstalk Command Line Toolを使う方法
- zipファイルに圧縮したプロジェクトをAWSコンソール画面からアップする方法
上記の中で、今回は「1」の「AWS Elastic Beanstalk Command Line Toolを使う方法」で話を進めていきます。
前準備
必要なツール
- git
- AWS Elastic Beanstalk Command Line Tool
新規作成・編集したプロジェクトファイルはgitを使ってアップロードしますので、お使いの環境にgitをインストールしてください。 なお、gitのインストール方法に関して今回触れないので、以下の記事を参考にしていただけたらと思います。
AWS Elastic Beanstalk Command Line Toolをダウンロード
AWS Elastic Beanstalk Command Line Toolはこちらのページからzip形式でダウンロード出来ます。
2013/1/15現在では最新バージョンは2.3となっています。
ダウンロードしたzipファイルを解凍して以下のようにしてElastic Beanstalkで使うコマンド「eb」コマンドにパスを通してください。
1 2 3 |
[sourcecode lang="text"] $ export PATH=$PATH:(zipファイルを解凍して出来たディレクトリまでパス)/eb/linux/python2.7/ [/sourcecode] |
上記のパスが通っていれば「eb」コマンドが使えるようになっていると思います。
ebコマンドの詳しい使い方は以下のサイトを参考にしていただければと思います。
- AWS本家サイト
- AWS Elastic Beanstalk Command Line Toolをインストールする
- AWS Elastic Beanstalkをコマンドラインから作成してアップロードまで
git aws.pushを使えるようにする
gitを使ってElastic Beanstalkにプロジェクトの最新バージョンをアップロードするには以下の「git aws.push」コマンドを使います。
1 2 3 |
[sourcecode lang="text"] $git aws.push [/sourcecode] |
ただgitに元々AWS用のオプションはついていないので先ほどダウンロードして解凍したAWS Elastic Beanstalk Command Line ToolにAWS用のオプションを追加するスクリプトが含まれているのでこちらをプロジェクトのルートディレクトリから実行します。
1 2 3 4 |
[sourcecode lang="text"] (git initは既にしているという前提で) $sh (zipファイルを解凍して出来たディレクトリまでパス)/AWSDevTools/Linux/AWSDevTools-RepositorySetup.sh [/sourcecode] |
これで「git aws.push」が使えるようになりました。
Elastic BeanstalkのWebサーバーApacheからnginxに変更する
前準備として長々と説明してきましたが、ここからようやく本記事のタイトルにも書いてある、「php5.4」+「nginx」の環境を構築したいと思います。
eb initで作成されるEC2インスタンスにsshでログインして環境確認
- AWS本家サイト
- AWS Elastic Beanstalk Command Line Toolをインストールする
- AWS Elastic Beanstalkをコマンドラインから作成してアップロードまで
上記のサイトを参考に「eb init」コマンドを行うとElastic Beanstalkの初期設定を色々聞かれ、最後の方で「Available solution stacks are」のように使用するプログラミング言語の環境を質問されるので、今回は「64bit Amazon Linux running PHP 5.4」を選択してください。
「eb init」が完了した後に「eb start」をすると、「eb init」で設定したアプリケーションが起動して、EC2インスタンスが立ち上がります。
デフォルトだとEC2インスタンスにはkey-pairを設定していないのでプロジェクトのルートディレクトリ内にある「.elasticbeanstalk/optionsettings」ファイル内の「[aws:autoscaling:launchconfiguration]」グループ内の「EC2KeyName=」の部分に「Key Pair Name」(sshログインするときに必要)をセットして「eb update」コマンドを実行してください。
環境が再読み込みされしばらくすると先ほど立ち上げたEC2インスタンスがterminateされ新しく「eb update」で更新されたEC2インスタンスが立ち上がります。
これでEC2インスタンスにsshでログインできるようになったので、ログインしてwebサーバー環境を確認するとApacheが使われていることが分かると思います。
1 2 3 4 5 |
[sourcecode lang="text"] $ sudo /etc/init.d/httpd status Equivalent Upstart operations: start httpd, stop httpd, restart httpd, status httpd httpd (pid 1814 1752 1751 1750 1748 1747 1694) を実行中... [/sourcecode] |
アップロード(git aws.push)するときに呼ばれるファイルを確認
「eb start」でアプリケーションを起動するときEC2インスタンスが立ち上がると、「/opt/elasticbeanstalk/hooks」の中身が色々動いているみたいで、「/opt/elasticbeanstalk/preinit」を確認するとここでapacheの設定、起動されています。
アップロード(git aws.push)したときは「/opt/elasticbeanstalk/hooks」ディレクトリ内にある「appdeploy」ディレクトリ内のファイルが起動されます。
ローカルのプロジェクトディレクトリに.ebextensionsを追加
ebextensionsとはElastic Beanstalkの環境設定を細かく指定できるディレクトリでその中に設定ファイルを作成するとその設定ファイルを実行してくれます。
具体的には「eb init」だけでは出来なかった特定のパッケージインストール、ファイルの追加、ユーザーの追加などが出来ます。 もっと詳しく知りたい方はこちらのAWS本家サイトをご覧になってください。
設定方法
先ほど紹介した本家サイトをご覧になると分かると思いますが、設定ファイルの作り方を簡単に説明します。
ローカルのプロジェクトルートディレクトリに「.ebextensions」ディレクトリを追加してその中に拡張子が「.config」のファイルを作成します。
configファイルは複数作る事が出来て、名前順にファイルが読み込まれます。
(例えば, 「01_test1.config」 → 「02_test2.config」の順番にファイルが読み込まれる)
configファイルの書き方はこちらのAWS本家サイトに書かれている記述方法に乗っ取って書いてください。
configファイルにwebサーバーにnginxを使うように記入する
- Apache(httpd)の停止
- nginxの起動
- php-fpm(nginxでphpを使うときに必要)の起動
「/opt/elasticbeanstalk/hooks/appdeploy/enact」に上記の条件を満たすシェルスクリプトを追加することで、アップロード(git aws.push)したときにapacheの代わりにnginxを実行させる事が出来ます。
またデフォルトでは「nginx」,「php-fpm」はインストールされていないのでそちらもインストールするようにconfigファイルに記入します。
上記を満たすconfigファイルがgithubにあったので今回そちらを参考にconfigファイルを作ってみました。 以下に参考元のgithubのURLと修正したURLのリンクを貼っておきます。
- 参考元:https://github.com/arielscarpinelli/elastic-beanstalk-php-5.4-fpm-nginx-non-legacy/blob/master/.ebextensions/01_nginx_php_fpm.config
- 修正したもの:https://github.com/duyoji/elastic-beanstalk-php-5.4-fpm-nginx-non-legacy/blob/master/.ebextensions/01_nginx_php_fpm.config
変更点は以下の2点です。
- 「files」を一つにまとめた(参考元をそのまま使うと「/opt/elasticbeanstalk/hooks/appdeploy/enact/99_reload_app_server.sh」がなぜか作られなかった)
- 「/opt/elasticbeanstalk/hooks/appdeploy/enact/99_reload_app_server.sh」の中身を修正してnginx,php-fpmが既に起動していたら再起動しないように変更
こちらのファイルの内容はそれぞれに合わせて変更していただけたらと思います。
Elastic BeanstalkのWebサーバーApacheからnginxに変更したか確認する
さきほど作ったconfigファイルを作ったので「git add」「git commit」「git aws.push」をして変更されたプロジェクトをElastic Beanstalkにアップロードします。
Elastic Beanstalkのマネジメントコンソール画面でステータスが緑色に変更されたら、EC2インスタンスにsshでログインしてください。
先ほどconfigファイルで設定した「/opt/elasticbeanstalk/hooks/appdeploy/enact/99_reload_app_server.sh」が存在するか確認してください。
そして現在使われているwebサーバーがApacheからnginxに変更されたか、php-fpmが起動しているかも確認してこれらがうまく修正されていたら成功です。
このようにebextensionsを用いるとElastic Beanstalkのサーバーを細かく設定する事が出来ます。