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