メモ > サーバ > サービス: AWS > Elastic Beanstalk
Elastic Beanstalk
※最低限の設定で、インフラを自動構築してくれる。
結果的にVPC・EC2・RDSなどが作成される。
※今新規に構築するなら、ECSやEKSなどコンテナを使うサービスを検討するといい。
AWSでおてがる開発シリーズ!AWS Elastic Beanstalkでアプリデプロイ編 | MISO
https://www.tdi.co.jp/miso/aws-elastic-beanstalk
■プログラムの準備
まずはWordPressをzipでデプロイしてみる。
あらかじめ以下からWordPressを入手しておく。
https://ja.wordpress.org/download/
もしくは自分でプログラムを用意する場合、作成したプログラムをzip圧縮しておく。
例えば以下のプログラムを作成した場合、
test/index.php
test/about.php
test/css/common.css
test/js/common.js
「test」フォルダを選択して圧縮すると http:// 〜デプロイ先〜 /test/index.php でアクセスすることになる。
公開フォルダ直下に配置したければ、「test」フォルダ内のファイルをすべて選択して圧縮する。
圧縮ファイルの名前は案件名で問題ないと思われる。
バージョンごとにファイル名を変更したりしなくても、Elastic Beanstalk の画面でバージョンラベルを設定できる。
■アプリケーションの作成
Elastic Beanstalk → 新しいアプリケーションの作成(画面右上)
※「今すぐ始める」からだと、設定を省略してすぐにアプリケーションが起動できる。
「サンプルのアプリケーションを起動」と紹介されているので、これは基本的にはお試し用かも。
「新しいアプリケーションの作成」画面が開くので、以下のように入力する。
アプリケーション名はEC2のインスタンス名などに使われるので、案件の内容を直感的に把握できる英数字にしておく。
アプリケーション名: EB-WordPress
説明: Elastic Beanstalk のテスト
「作成」をクリック。
■環境の作成
はじめは「このアプリケーションの環境は現在存在しません。」と表示されている。
「今すぐ作成しましょう。」をクリック。
「ウェブサーバー環境」をクリックして「選択」をクリック。
「ウェブサーバー環境の作成」画面になる。
「環境情報」は変更せず。
「基本設定」の「プラットフォーム」を「事前設定済みプラットフォーム」の「PHP」に変更し、
さらに「アプリケーションコード」を「コードのアップロード」にし、WordPress公式から入手した wordpress-5.2.2-ja.zip をアップロードする。
自分でプログラムを作成した場合、そのzipファイルをアップロードする。
「より多くの設定を行う」をクリック(「環境の作成」をクリックすると、ただちに作成される。はず。)
※EIPを使わない設定にはできる?要確認。
「EbWordpress-env の設定」画面が開く。
それぞれ必要な箇所を設定して「保存」をクリックするとこの画面に戻ってくる。
「ソフトウェア」でApacheやPHPに関する一部の設定を行える。
「インスタンス」でインスタンプタイプやセキュリティグループを設定できる。デフォルトのセキュリティグループは、HTTP(80)とSSH(22)の全アクセスのみを許可するようになっている。
「容量」で単一インスタンスで運用するのか、複数インスタンスで負荷分散するのか設定できる。オートスケーリングを使用する場合もこの画面から設定する。
「ロードバランサー」は、複数インスタンスで負荷分散する場合に自動追加される。
「セキュリティ」でキーペアを選択できる。SSHでアクセスするバイアは選択しておく。
「通知」で重要イベントのメール受信アドレスを設定できる。
「ネットワーク」で使用するVPCやサブネットを選択できる。
「データベース」でRDSを追加できる。
今回RDSのユーザー名とパスワードは以下のように設定した。
ユーザー名: webmaster
パスワード: gV0+8k6BM#z7
必要な設定を行ったら「環境の作成」をクリック。
画面が遷移して以下が表示された。しばらく待つ。
「EbWordpress-env を作成しています。
この操作には数分かかります。..」
10分ほどで完了し、「ヘルス OK」となった。
ページ上部に
「環境 ID: e-fnegyzsjf9, URL: EbWordpress-env.cxbmzusags.ap-northeast-1.elasticbeanstalk.com」
のように表示されている。
これをもとに、以下のURLでWordPressにアクセスできる。
http://ebwordpress-env.cxbmzusags.ap-northeast-1.elasticbeanstalk.com/wordpress/
通常の手順でWordPressをセットアップしてみる。
「さあ、始めましょう!」をクリック。
データベース名: ebdb (自動でこの名前になるらしい。)
ユーザー名: webmaster
パスワード: gV0+8k6BM#z7
データベースのホスト名: develop.xxxxx.ap-northeast-1.rds.amazonaws.com (「設定」画面でエンドポイントを確認。)
上のように設定して「送信」をクリック。
「インストール実行」をクリック。
サイトのタイトル: EBテスト
ユーザー名: admin
パスワード: MdMme^4v)n@f(nzrP@ (自動作成されたもの。)
メールアドレス: example@example.comm
上のように設定して「WordPressをインストール」をクリック。
完了したら管理画面にログインし、投稿やメディアアップロードなどを試す。
■SSHでの接続
SSHで接続したければ、22番ポートを開くためのセキュリティグループを設定しておく必要がある。
構築時に設定しなかった場合は、あとから手動で設定する。
キーペアも必要なので、構築時に選択しなかった場合は手動で紐付ける。
設定 → セキュリティ → 変更
「EC2キーペア」が空欄なので、作成済みのキーに変更する。
ただし後からキーペアを紐付けると。
Changes to option EC2KeyName settings will not take effect immediately. Each of your existing EC2 instances will be replaced and your new settings will take effect then.
という警告が表示された。
この設定は即時反映では無いとのこと。
存在するEC2は新しいものに置き換えられるとのこと。
■プログラムの更新
Elastic Beanstalk のダッシュボードで「アップロードとデプロイ」ボタンを押すと、新たなプログラムをアップロード&デプロイできる。
また、
EB-WordPress(アプリケーション名) → アプリケーションバージョン
から過去にデプロイしたプログラムを一覧表示できる。
ここから
任意のプログラムを選択 → アプション → デプロイ
とすれば、過去のプログラムに戻したりできる。
■環境プロパティの利用
WordPressの設定ファイルの内容、メディアなどは消えてしまうので注意。(データベースはRDSなので、投稿内容は残る。)
「EC2は使い捨て」の思想で設計する必要がある。
アップロードファイルはS3に保存すればいいが、アプリケーションの設定は「環境プロパティ」を使って管理できる。
Elastic Beanstalk の画面に設定を切り出し、自由に書き換えることができる。
設定 → ソフトウェア → 変更 → 環境プロパティ
で設定でき、例えば API_ENDPOINT という名前の値は、以下のようにすれば取得できる。
$endpoint = $_SERVER['API_ENDPOINT'];
通常の $_SERVER の内容に加えて、他にもデフォルトで以下のような値を参照できる。
Array
(
[PHP_MEMORY_LIMIT] => 256M
[PHP_MAX_EXECUTION_TIME] => 60
[PHP_DISPLAY_ERRORS] => Off
[PHP_COMPOSER_OPTIONS] =>
[PHP_ALLOW_URL_FOPEN] => On
[PHP_ZLIB_OUTPUT_COMPRESSION] => Off
[PHP_DOCUMENT_ROOT] => /
[PHP_DATE_TIMEZONE] => UTC
環境プロパティの名前は、半角英数字で設定する。
設定したものは /etc/php.d/environment.ini 内に以下のような形式で記録される。
よって「!」などアンダーバー以外の記号を名前に含めると環境が起動できなくなるので注意。
また、値に日本語を使うと文字化けするので、半角英数字のみで設定する。
API_ENDPOINT="xxxxx"
aws.api_endpoint="xxxxx"
PHP_MEMORY_LIMIT="256M"
aws.php_memory_limit="256M"
PHP_MAX_EXECUTION_TIME="60"
aws.php_max_execution_time="60"
PHP_DISPLAY_ERRORS="Off"
aws.php_display_errors="Off"
PHP_COMPOSER_OPTIONS=""
aws.php_composer_options=""
PHP_ALLOW_URL_FOPEN="On"
aws.php_allow_url_fopen="On"
PHP_ZLIB_OUTPUT_COMPRESSION="Off"
aws.php_zlib_output_compression="Off"
PHP_DOCUMENT_ROOT="/"
aws.php_document_root="/"
PHP_DATE_TIMEZONE="UTC"
aws.php_date_timezone="UTC"
aws.log_dir="/var/app/support/logs"
環境プロパティとその他のソフトウェアの設定 - AWS Elastic Beanstalk
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environments-cfg-softwaresettings.html
AWS Elastic Beanstalk PHP プラットフォームを使用する - AWS Elastic Beanstalk
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_PHP.container.html
RDSを使用している場合、RDSへの接続情報は以下の環境変数から取得できる。
リポジトリ内のプログラムには、直接パスワードなどを書く必要は無さそう。
$_SERVER['RDS_HOSTNAME']
$_SERVER['RDS_PORT']
$_SERVER['RDS_DB_NAME']
$_SERVER['RDS_USERNAME']
$_SERVER['RDS_PASSWORD']
PHP アプリケーション環境に Amazon RDS DB インスタンスを追加 - AWS Elastic Beanstalk
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_PHP.rds.html
Elastic Beanstalk の細かな設定は、.ebextensions ファイルから行うもの?
設定ファイル (.ebextensions) による高度な環境のカスタマイズ - AWS Elastic Beanstalk
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebextensions.html
■プログラムの直接編集
Elastic Beanstalk で作成されるWebサーバは、基本的には通常のEC2と同じ。
よって非推奨ではあるが、SSHからプログラムを直接書き換えることはできる。(緊急対応や検証のとき用に。)
例えばプラットフォームが「PHP」の場合、デフォルトでは /var/www/html が公開ディレクトリなので、この中のファイルを書き換えれば反映される。
なお、/var/www/html は /var/app/current/ へのシンボルリンクになっている。
■環境の削除
アクション → 環境の終了
確認のために表示される「環境の名前」には、今回は「EbWordpress-env」と入力する。
EC2やRDSは削除され、EIPも開放される。
■エラー例とその対応
以下のエラーになって止まった。
2019-09-18 18:35:59 UTC+0900 INFO Launched environment: EbWordpress-env. However, there were issues during launch. See event log for details.
2019-09-18 18:35:58 UTC+0900 INFO Environment health has transitioned to Pending. Initialization in progress (running for 8 seconds). There are no instances.
2019-09-18 18:35:56 UTC+0900 ERROR Creating security group failed Reason: Resource creation cancelled
2019-09-18 18:35:56 UTC+0900 ERROR Creating EIP failed Reason: The maximum number of addresses has been reached. (Service: AmazonEC2; Status Code: 400; Error Code: AddressLimitExceeded; Request ID: c9a2a2d1-cbda-4477-8523-3659b776944d)
2019-09-18 18:35:56 UTC+0900 ERROR Stack named 'awseb-e-fnegyzsjf9-stack' aborted operation. Current state: 'CREATE_FAILED' Reason: The following resource(s) failed to create: [AWSEBEIP, AWSEBSecurityGroup].
EIPを上限まで使用しているので作成できないとある。
不要なEIPを開放し、「アクション → 環境の再構築」を実行。
「Elastic Beanstalk は 更新しています の環境です。」と表示された。これで再度しばらく待つと完了できた。
■Spring Boot で作成したJavaプログラムのデプロイ
Spring Boot で作成したJARファイルをデプロイする場合、「事前設定済みプラットフォーム」では「Java」を選択する。
(「Tomcat」ではないので注意。Spring Bootで作成したJARファイルにはTomcatが含まれているため。)
「アプリケーションコード」を「コードのアップロード」にし、demo-0.0.1-SNAPSHOT.jar をアップロードする。
(あらかじめ Spring Boot で作成したJARファイル。)
「インスタンス」のデフォルトのセキュリティグループは、HTTP(80)とSSH(22)の全アクセスのみを許可するようになっている。
EC2インスタンスに外部から直接アクセスする場合、8080番ポートも許可しておく。
ロードバランサーを使用する場合、セキュリティグループはいじらずにロードバランサーからのアクセス先ポートを8080番にすればいいかもしれない。
(要検証。)
デプロイしたプログラムは /var/app/current/application.jar に配置されているみたい?
(要検証。)
■参考
以下は参考になるかもしれないが難易度が高いかも。
ゼロから始めるJavaでAWS Elastic Beanstalk #1〜 EB CLIを使ったJava Webアプリ環境構築 〜 - Qiita
https://qiita.com/riversun/items/9d53238fef611ce7d466
以下は古いが以前にメモしていたもの。
AWS Elastic Beanstalkで環境構築自動化 - Qiita
https://qiita.com/supertaihei02/items/b2373890b7e739ded318