『ジャックと豆の木』の話
むかしむかし、あるところに、ジャックと豆の木がありました。
ジャックは言いました。
「WebアプリをAWSにデプロイするのは良いんだけどさぁ。ほら、そのー、色々なAWSリソースをさ、なんというかその、別々にポチポチして拵えなきゃいけないのがさ、すごく億劫じゃない!???」
それを聞いて呆れ果てた豆の木は言いました。
「そうだな…。Elastic Beanstalk を使ってみろ…!!」
——————————— 完 ————————————
目次 |
---|
AWS Elastic Beanstalk とは
——————————— 再開 ————————————
AWS Elastic Beanstalk は Webアプリをデプロイするのに適した AWS のマネージドサービスです。(Beanstalk は「豆の木」を意味するらしく、かの有名な童話『ジャックと豆の木』に関係があるのだとかないだとか。)
我々が Web アプリのコードを Elastic Beanstalk にアップロードすると、そのあとは Elastic Beanstalk が
- プロビジョニング
- 負荷分散
- 死活監視
- スケーリング
- パッチとセキュリティの更新
などを自動で行ってくれます。
何よりも使い始めるのが簡単で、Webアプリを数分でサクッとデプロイできてしまいます。
AWS公式は「Webアプリをデプロイ及び実行する最も簡単な方法」と宣言しています。
色々と自動でやってくれるわけですが、それでいながら我々には「どのAWSリソースをどのように使用するか」の選択肢がしっかりと与えられています。
普段、AWS で Web アプリを動かそうするときは、VPCを定義して、EC2を操作して、RDSを操作して、ALBを設定して、… と色々なリソースを別々に管理しなければなりませんでした。
しかし、Elastic Beanstalk を使えば、Webアプリのインフラ全体を、一つの統合されたインターフェースを通して管理することができます。(便利だ!)
しかも驚くべきことに、Elastic Beanstalk 自体には課金が発生しません。Elastic Beanstalk で管理している EC2 インスタンスや S3 バケットなどの AWS リソースに対して、通常どおりの課金が発生します。
Elastic Beanstalk で Laravel を動かす方法
では早速、Elastic Beanstalk で Laravel を動かしてみましょう。
基本的には公式のチュートリアルに従っていきます。
しかしなんと2021年12月現在、公式のチュートリアルに従うだけでは Elastic Beanstalk で Laravel は動くようにはならないのでご注意ください。(な、なんだってー!)
以下の手順は、著者が実際に試してみてうまくいった最短経路ですので、これをご覧になっているあなたもぜひ試してみてください!
Laravel プロジェクトの用意
まずは composer を使って Laravel のソースコードを生成します。
$ docker run --rm -it -v $PWD:/app composer create-project --prefer-dist laravel/laravel laravel-beanstalk "6.*"
プロジェクトルートに移動しておきます。
$ cd laravel-beanstalk
次に、NGINXの設定ファイルを追加します。
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
ひとまずソースコードに手を加えるのはここまでで大丈夫です。
では、Elastic Beanstalk にアップロードするために zip 化しましょう。
プロジェクトルート自体を含まないようにしながら気をつけて zip にします。
zip ../laravel-beanstalk.zip -r * .[^.]* -x "vendor/*"
このとき、vendor 以下は必要ありません。
Node.js における node_modules もそうですが、composer.json や package.json といったお品書きファイルをもとにインストールできるライブラリたちは、インテルネッツにアップロードしないのがお約束です。
vendor や node_modules は「この宇宙で最も重い物体」として知られていますし(”HEAVIEST OBJECTS IN THE UNIVERSE” で検索してみてください!)、Elastic Beanstalk の場合は zip をアップロードしたあとに自動で `composer install` を実行してくれます。
Elastic Beanstalk にアップロード
AWS マネジメントコンソールを開き、Elastic Beanstalk の管理画面を訪れます。
はじめて使用するなら以下のような表示となるはずです。
「Create Application」をクリックすると、「ウェブアプリケーションの作成」画面に到達します。
「ウェブアプリケーションの作成」画面では以下のように各項目を設定します。
アプリケーション名 | laravel-beanstalk |
プラットフォーム | PHP |
プラットフォームのブランチ | PHP 8.0 running on 64bit Amazon Linux 2 |
プラットフォームのバージョン | 3.3.8 (Recommended) |
アプリケーションコード | 「コードのアップロード」を選択 |
バージョンラベル | laravel-beanstalk-source |
ソースコード元 | 「ローカルファイル」を選択 |
一通り入力し終わったら、「より多くのオプションの設定」ボタンをクリックします。
「Laravelbeanstalk-env の設定」画面に移動します。
「Laravelbeanstalk-env の設定」画面の項目に「ソフトウェア」があるので、それの「編集」ボタンをクリックします。
そうするとドキュメントルートの設定ができるフィールドが現れるので `/public` と記入して「保存」ボタンを押します。「保存」ボタンをクリックすると「Laravelbeanstalk-env の設定」画面に戻ります。
さて、それではお待ちかねの「アプリの作成」ボタンをクリックしてみましょう!
……………(???「3分間待ってやる!」)……………
「アプリの作成」が成功すると、以下のような画面が現れます。(いい感じですね!)
案内されている URL をクリックすると、あの親の顔よりも見た … Laravel のデフォルト画面が…。
無事にデプロイされていることが確認できます。(よっしゃ!)
DBインスタンスを追加してみる
しかしまだ喜べる段階にありません。
思い出してください。
この世のあらゆる情報システムの核(コア)を担うのは何か?
それはデータベースです。
今からそれを追加する変更を施してみましょう。
「Laravelbeanstalk-env の設定」画面に再び訪れます。
そして、データベースの「編集」ボタンをクリックすると「データベースを追加」画面に到達するので、以下の各項目を設定します。
エンジン | mysql |
エンジンバージョン | 8.0.23 |
インスタンスクラス | db.t2.micro |
ユーザー名 | grune |
パスワード | ********** |
そして「適用」ボタンをクリックします。
…………….。
10分ほど待つことになるので、水タバコでも吸ってガンギマリになりながらテントサウナで一汗かきたいところですが…。ここはグッと堪えて、少しだけソースコードを修正しなければなりません。
if(DB::connection()->getDatabaseName())
{
echo "Connected to database ".DB::connection()->getDatabaseName();
}
$response->send();
.env を編集してDB接続に備えましょう。
DB_HOST=<値はRDSの管理画面を参照>
DB_DATABASE=ebdb
DB_USERNAME=grune
DB_PASSWORD=**********
ソースコードを修正したあとは、再び zip を作成します。
$ zip ../laravel-beanstalk-rds.zip -r * .[^.]* -x "vendor/*"
そして「Laravelbeanstalk-env の設定」画面で「アップロードとデプロイ」をクリックし、新しく拵えた zip をアップロードします。
そして、案内されているURLをクリックすると…
お、うまくいったようですね!(めでたしめでたし)
今度こそ完!
次のステップ
本記事では、都度ソースコードの zip を拵えてデプロイするのみでしたが、
- CI / CD パイプラインに Elastic Beanstalk を組み込む
- デプロイ時にマイグレーションを実行する
- EB CLI を使用する
- 管理しやすさを考慮して自前の VPC やサブネットを予め用意しておく
といったことをすると実用的で良いと思います。
それでは今回はここまでとします!
ほなまた〜〜〜ノシ
..............................................。
ジャック「冒頭の茶番、いらないよね!???」
豆の木「そうだな。著者は『ジャックと豆の木』を読んだことがないらしいぞ。」