Memo

メモ > サーバ > サービス: 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

Advertisement