AWS Elastic Beanstalk でアプリをアップロードするだけで公開する
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済み(IAM ロールを作成できる権限があること)
- 手元のパソコンでテキストファイルを作成し、zip ファイルに圧縮できること
- 以下のリソースが作成済みであること
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| VPC | eb-lab-vpc | 検証用 VPC(CIDR: 10.0.0.0/16) |
| パブリックサブネット | eb-lab-public-subnet-1a | ap-northeast-1a のパブリックサブネット(CIDR: 10.0.1.0/24) |
| インターネットゲートウェイ | eb-lab-igw | インターネット接続用 |
| ルートテーブル | eb-lab-public-rt | 0.0.0.0/0 をインターネットゲートウェイへ向けるルート。eb-lab-public-subnet-1a に関連付け済み |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| ソースバンドル(手元) | eb-lab-v1.zip / eb-lab-v2.zip | アップロードするアプリケーションのコード |
| IAM ロール | aws-elasticbeanstalk-service-role | Elastic Beanstalk のサービスロール(環境の作成時に自動で作られる。既にある場合はそれを選択) |
| IAM ロール(インスタンスプロファイル) | aws-elasticbeanstalk-ec2-role | 環境の EC2 インスタンスが使うインスタンスプロファイル(環境の作成時に自動で作られる。既にある場合はそれを選択) |
| Elastic Beanstalk アプリケーション | eb-lab-app | 環境とバージョンをまとめる入れ物 |
| Elastic Beanstalk 環境 | eb-lab-env | PHP プラットフォームの単一インスタンスのウェブサーバー環境 |
| アプリケーションバージョン | v1 / v2 | アップロードしたコードのバージョン |
環境の EC2 インスタンス、セキュリティグループ、Elastic IP アドレス、Auto Scaling グループ、CloudFormation スタックは Elastic Beanstalk が自動で作成します。
アプリケーションのコードを zip にする
手元のパソコンで任意のフォルダを作り、以下の内容で index.php という名前のファイルを保存します。アクセスすると、バージョン名と、応答したサーバーのホスト名を表示するだけのページです。
<?php
$version = 'v1';
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>eb-lab</title>
</head>
<body style="font-family: sans-serif; background: #e8f4ff;">
<h1>Hello from Elastic Beanstalk (<?php echo $version; ?>)</h1>
<p>Host: <?php echo htmlspecialchars(gethostname()); ?></p>
</body>
</html>
index.php を zip に圧縮し、ファイル名を eb-lab-v1.zip にします。ソースバンドルには親フォルダを含めてはいけないため、フォルダごとではなく index.php ファイルそのものを圧縮します。macOS や Linux のターミナルなら、index.php があるフォルダで次のコマンドを実行します。
zip eb-lab-v1.zip index.php
続けて、次のバージョン用のファイルも作っておきます。index.php の $version = 'v1'; を $version = 'v2'; に、background: #e8f4ff; を background: #fff4d6; に書き換えて保存し、同じように eb-lab-v2.zip という名前で圧縮します。
zip eb-lab-v2.zip index.php
環境を作成する
環境の作成は 1 枚のフォームで行います。上から「基本詳細」「プラットフォームの詳細」「アプリケーションコード」を入力し、そのあと折りたたまれた「サービスアクセス」「ネットワーク」のセクションを開いて設定します。
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
- 上部の検索バーに
Elastic Beanstalkと入力し、表示された「Elastic Beanstalk」を選択します - 「環境を作成」をクリックします(アプリケーションは、環境の作成と同時に作られます)
- 「基本詳細」と「プラットフォームの詳細」「アプリケーションコード」で以下を設定します
- アプリケーション名:
eb-lab-app(「新しいアプリケーションが作成されます」と表示されます) - 環境名:
eb-lab-env - ドメイン名プレフィックス: 空欄のまま(Elastic Beanstalk が自動で決めます)
- プラットフォーム:
PHP - プラットフォームブランチ・プラットフォームのバージョン: 表示された推奨のまま
- アプリケーションコード:
ローカルファイルを選び、「ファイルを選択」でeb-lab-v1.zipを選択 - バージョンラベル:
v1
- アプリケーション名:
環境のタイプ(ウェブサーバー環境・単一インスタンス)は、既定で選ばれているものをそのまま使います。
Elastic Beanstalk には 2 つの IAM ロールが必要です。サービスロールは Elastic Beanstalk が EC2 インスタンスを監視したり、プラットフォームを更新したりするために使い、EC2 インスタンスプロファイルはインスタンスがログの書き込みなどを行うために使います。
- 「サービスアクセス - 任意」のセクションを開きます
- 「サービスロール」と「EC2 インスタンスプロファイル」が、どちらも
デフォルトロールを作成になっていることを確認します。aws-elasticbeanstalk-service-roleとaws-elasticbeanstalk-ec2-roleという名前のロールが、環境の作成時に自動で作られます(既にこのロールがあるアカウントでは、別のロールを使用を選んで既存のロールを選びます) - 「EC2 キーペア」は空欄のままにします(このハンズオンではインスタンスにログインしません)
VPC を指定しないとデフォルト VPC が使われるため、ここで前提条件の VPC を選びます。
- 「ネットワーク - 任意」のセクションを開き、以下を設定します
- VPC:
eb-lab-vpc - インスタンスサブネット:
eb-lab-public-subnet-1aが選ばれていることを確認します(VPC を選ぶと自動で入ります。入らない場合はドロップダウンから選びます) - EC2 セキュリティグループ: 選択しない(Elastic Beanstalk が作成します)
- VPC:
- その他のセクションはデフォルトのままにし、ページ下部の「作成」をクリックします
単一インスタンス環境では、インスタンスに Elastic IP アドレスが自動で割り当てられるため、パブリック IP アドレスの設定は不要です。
環境の作成を待ってアクセスする
環境の概要画面に切り替わり、Elastic Beanstalk が環境の作成を始めます。作成中は下部の「イベント」タブに、リソースの作成状況が順に追加されていきます。初回の作成には数分かかります。
- 「環境の概要」のヘルスが
Ok(緑色)になるまで待ちます - 「実行中のバージョン」が
v1、プラットフォームが PHP になっていることを確認します
「環境の概要」の「ドメイン」に表示されている URL(eb-lab-env.〜.ap-northeast-1.elasticbeanstalk.com のような形式)をクリックするか、左側ナビゲーションの「環境に移動」をクリックします。HTTP での接続のため、ブラウザに警告が表示されることがあります。
Hello from Elastic Beanstalk (v1) と、応答したサーバーのホスト名が表示されることを確認します。サーバーを自分で用意しなくても、zip をアップロードしただけでアプリが公開されたことが確認できます。
Elastic Beanstalk が作ったリソースを確認する
Elastic Beanstalk が裏で作ったリソースを CloudFormation から確認します。
- 上部の検索バーに
CloudFormationと入力し、表示された「CloudFormation」を選択します - 「スタック」の一覧で、Elastic Beanstalk が作成したスタックを選択します(スタック名は
awseb-<環境 ID>-stackの形式で、環境 ID は Elastic Beanstalk の環境の概要に表示されるe-で始まる ID です。「タグ」タブのelasticbeanstalk:environment-nameがeb-lab-envになっているものが今回の環境のスタックです) - 「リソース」タブを選択します
Auto Scaling グループ(AWS::AutoScaling::AutoScalingGroup)、起動テンプレート(AWS::EC2::LaunchTemplate)、セキュリティグループ(AWS::EC2::SecurityGroup)、Elastic IP(AWS::EC2::EIP)などが、このスタックで作られていることが確認できます。負荷分散環境の場合は、ロードバランサーや CloudWatch アラームもこのスタックに含まれます。
EC2 コンソールの「インスタンス」を開くと、名前が eb-lab-env のインスタンスが 1 台起動していることも確認できます。Elastic Beanstalk は、環境の名前を Name タグとしてリソースに付けます。
新しいバージョンをデプロイする
Elastic Beanstalk のコンソールに戻り、eb-lab-v2.zip をデプロイします。
- 上部の検索バーに
Elastic Beanstalkと入力し、表示された「Elastic Beanstalk」を選択します - 左側ナビゲーションの「環境」を選択し、
eb-lab-envを選択します - 環境の概要画面で「アップロードとデプロイ」をクリックします
- 表示されたダイアログで以下を設定します
- 「ファイルを選択」で
eb-lab-v2.zipを選択 - バージョンラベル:
v2
- 「ファイルを選択」で
- 「デプロイ」をクリックします
デプロイの進み具合は、環境の概要の「イベント」タブに順に記録されます。ヘルスは一時的に灰色(Info)になることがありますが、デプロイが終わってアプリケーションがヘルスチェックに応答すると緑色の Ok に戻ります。この環境のデプロイポリシーはデフォルトの「一度にすべて(All at once)」で、インスタンスが 1 台だけなので、デプロイの間はアプリケーションが一時的に応答しなくなることがあります。
環境のイベントとヘルスを確認する
- 環境の概要画面の下部で「イベント」タブを選択します
新しいバージョンのデプロイが始まったこと、インスタンスへのデプロイが完了したこと、環境の更新が正常に完了したことなどが、時刻つきで記録されていることが確認できます。デプロイがうまくいかないときは、まずこの「イベント」を見て、どの段階で止まったかを確かめます。
- 環境の概要画面の「健全性とモニタリング」タブを選択します
「拡張インスタンスの状態」にインスタンスごとのヘルスステータスが表示されます。インスタンスのステータスが Ok になっていることを確認します。環境の概要に戻ると、「実行中のバージョン」が v2 に変わっていることも確認できます。
ブラウザで環境のドメインに再度アクセスし、Hello from Elastic Beanstalk (v2) が表示され、背景の色が変わっていることを確認します。
左側ナビゲーションの eb-lab-app の下にある「アプリケーションバージョン」を選択すると、v1 と v2 の 2 つのバージョンが並んでいることも確認できます。古いバージョンを選んでデプロイし直せば、前のバージョンに戻すこともできます。