アプリケーションのデプロイ環境として、AWSから提供されるBeanstalkですが、
インフラ技術者から見たら、一体どんなことが出来るのでしょうか?
レジュメ
結論、簡単なシステム構成なら、簡単に構築でき、簡単にアプリケーションもデプロイ管理出来る仕組み
インフラ構築者目線で見た時に、Beanstalkを一番初めに気が付くのは
「簡単にインフラ構築が出来る」
という点です。
ただし、システム構成はAWSのテンプレートAMIを利用した簡単な良くあるシステム構成である前提ですけど。
Beanstalkのインフラ構築ではどんな設定が出来るの?
- ソフトウェア(ミドルウェアのごく一部の設定)
- インスタンス(インスタンスタイプ、ディスクサイズ、SG等の設定)
- 容量(オートスケールの簡易設定)
- ロードバランサー(ELBの簡易設定)
- ネットワーク(Beanstalkを配置するVPCや公開・内部設定、サブネットの設定)
- データベース(開発およびテスト用のデータベースとして。本番用は外部データベース接続も可能)
と言ったことがBeanstalk構築時に設定できます。
VPCもデフォルトVPC以外にも配置が出来ます。
EC2はどれだけカスタマイズ出来る?アンチウィルスソフトやログ収集
インスタンスのAMIは選択肢は無く、AWSから提供されたテンプレートAMIのみです(プラットフォーム)。
しかし、アプリケーションのデプロイ操作である
- アプリケーションコードや
- アップロードとデプロイ
でコマンドで実施できるものなら、インストールから設定変更まで何でもカスタマイズ可能です。
アプリケーションコードやアップローとデプロイ(デプロイZip)ではどのようなフォーマットのzipをアップロードすれば良いか?
ここがBeanstalkを理解する上で最も大変で調べが必要な部分ですね。
まず、デプロイZipの中身はデプロイされると基本的にすべて各アプリケーションのドキュメントルートにコピーされます。
例えば、プラットフォームとしてphpを選択した場合は、
EC2上の「/var/www/html/」がapacheでのドキュメントルートになっているため、デプロイZipは展開されすべて
「/var/www/html/」 にコピーされます。
重要!カスタマイズの鍵は「.ebextensions」フォルダ内
カスタマイズで重要なのは「.ebextensions」フォルダ内です。
こちらのファイルは、yamlもしくはjsonで記載をするのですが、こちらでどんなことが出来るかというと
例えば、
- AWSの設定変更
- AWSのリソース追加
から
- EC2へのパッケージインストール
- EC2へ設定ファイルを配置
- EC2でコマンド実行
等、何でも出来てしまいます。しかし、インフラ構築を自動化しておくという作業がポイントです。
設定ファイル (.ebextensions) による高度な環境のカスタマイズ - AWS Elastic Beanstalk
Apacheのドキュメントルートに対し
「.ebextensions」 のコマンド出力が実施できなかった!?
「.ebextensions」でApacheの設定ファイル(/etc/httpd/conf.d/test.conf)を追加することは 出来ましたが、
「.ebextensions」 で、コマンド実行した出力を「/var/www/html/」に出力させることが出来ませんでした。
その理由は、AWS内でデプロイ実施の自動作業と順番に関係するようです。
ドキュメントルートにコマンド出力しても自動作業内で削除されてしまっていたようです。
デプロイの自動作業と順番。コマンド発行順
これは正確な情報と、試した結果の経験則が混ざっているのですが、今までアップロードされたバージョンのデプロイZipはすべて管理されており、
- 「.ebextensions」内のファイルが実行される
- ドキュメントルートを綺麗に掃除してデプロイzipのファイルがコピー・配置される
といった順番で実行されているようです。
さらに、デプロイZipをコピー・配置する作業前後で以下のディレクトリにシェルスクリプトを配置することでコマンドが実行できます。(hookスクリプト)
- /opt/elasticbeanstalk/hooks/appdeploy/pre/*
- /opt/elasticbeanstalk/hooks/appdeploy/enact/*
- /opt/elasticbeanstalk/hooks/appdeploy/post/*
上記、パスに「.ebextensions」でシェルスクリプトを配置しておいてあげれば実施されます。
なかなか何でもカスタマイズ出来る気がしてきましたね!
ただし、ここまでカスタマイズするとBeanstalkは簡単にインフラを構築できる仕組みとは言えなくなってきますので注意が必要です。
プラットフォームフック - AWS Elastic Beanstalk
Elastic Beanstalk メモ - Qiita
参考: /opt/elasticbeanstalk/hooks/ 配下のファイル
/opt/elasticbeanstalk/hooks/configdeploy/enact/99_reload_app_server.sh
/opt/elasticbeanstalk/hooks/configdeploy/enact/.gitignore
/opt/elasticbeanstalk/hooks/configdeploy/pre/10_setup_envvars.sh
/opt/elasticbeanstalk/hooks/configdeploy/pre/.gitignore
/opt/elasticbeanstalk/hooks/configdeploy/pre/20_configure_php.sh
/opt/elasticbeanstalk/hooks/configdeploy/post/.gitignore
/opt/elasticbeanstalk/hooks/appdeploy/enact/99_reload_app_server.sh
/opt/elasticbeanstalk/hooks/appdeploy/enact/01_flip.sh
/opt/elasticbeanstalk/hooks/appdeploy/enact/.gitignore
/opt/elasticbeanstalk/hooks/appdeploy/pre/01_unzip.sh
/opt/elasticbeanstalk/hooks/appdeploy/pre/02_setup_envvars.sh /opt/elasticbeanstalk/hooks/appdeploy/pre/12_update_permissions.sh
/opt/elasticbeanstalk/hooks/appdeploy/pre/05_configure_php.sh
/opt/elasticbeanstalk/hooks/appdeploy/pre/.gitignore /opt/elasticbeanstalk/hooks/appdeploy/pre/10_composer_install.sh
/opt/elasticbeanstalk/hooks/appdeploy/post/01_monitor_httpd_pid.sh
/opt/elasticbeanstalk/hooks/appdeploy/post/.gitignore
/opt/elasticbeanstalk/hooks/postinit/.gitignore
/opt/elasticbeanstalk/hooks/preinit/02_web_user.sh
/opt/elasticbeanstalk/hooks/preinit/04_configure_php.sh
/opt/elasticbeanstalk/hooks/preinit/22_pear.sh
/opt/elasticbeanstalk/hooks/preinit/30_permissions.sh
/opt/elasticbeanstalk/hooks/preinit/01_setup_envvars.sh
/opt/elasticbeanstalk/hooks/preinit/05_composer.sh
/opt/elasticbeanstalk/hooks/preinit/.gitignore
/opt/elasticbeanstalk/hooks/preinit/11_logging.sh
/opt/elasticbeanstalk/hooks/preinit/03_packages.sh
/opt/elasticbeanstalk/hooks/preinit/10_layout.sh
/opt/elasticbeanstalk/hooks/preinit/23_apache.sh
/opt/elasticbeanstalk/hooks/.gitignore
/opt/elasticbeanstalk/hooks/restartappserver/enact/01_restart.sh /opt/elasticbeanstalk/hooks/restartappserver/enact/.gitignore /opt/elasticbeanstalk/hooks/restartappserver/pre/10_configure_php.sh
/opt/elasticbeanstalk/hooks/restartappserver/pre/.gitignore /opt/elasticbeanstalk/hooks/restartappserver/post/.gitignore