概要
AWSのPaaSであるElasticBeanstalkを利用している場合、アプリケーションのデプロイの際にスクリプトを自動実行する事ができます。この機能によって、アプリケーションが動作するのに必要な設定をコードによって明示的に記述する事ができます(所謂 Infrastructure as Codeと言われるものが実現できます)
なぜ必要か?
クラウドのインフラは基本的にOn Demandモデルであり、欲しい時に利用しそしてそれを使い捨てにします。これは従来のインフラの考え方と大きく異なっており、たとえば従来は必要なOSの設定やミドルウェアの設置を一度するとそのまま運用し続けていたのに対し、クラウドではそのインスタンスの生成と破棄が頻繁に行われます。持続的に運用し続けるプロダクションの環境であってもそれは同様で、オートスケール等はその良い例です。
ElasticBeanstalkの場合、Configuration -> Instances の設定で自動的に生成されるイメージを指定できます。下図のCUSTOM AMI IDのところに指定されているのが仮想イメージのIDです。下記の例で言えば、ElasticBeanstalkのApplication作成時に指定したNode.jsのAWSから提供されるAMIになります(幾つかバージョンが存在します)
自分の環境に適したOS設定・ミドルウェアの設置が行われた仮想イメージをここに指定するのも手ですし、あるいは上述したようにInfrastructure as Codeの考え方でデプロイ時に瞬時にその設定をスクリプトによって行う事もできます。
スクリプトの書き方
対象のアプリケーションのGitリポジトリのルートに.ebextensionsというフォルダを設置します。そしてその中にxxxx.configというファイルを作成します。ElasticBeanstalkの場合、この*.configファイルがアプリケーションデプロイ時に事前に読み込まれ実行される事になります。
AWS Elastic Beanstalk 環境のカスタマイズと設定
コマンドの内容については下記が詳しいです。
Linux を実行する EC2 インスタンス上のソフトウェアのカスタマイズ
例1 コマンドの実行
下記はEC2の時刻をJSTに合わせるものです。基本的にみんな必要になる設定だと思います。下記を<APP>/.ebextensions/00_linux.configという形で作成します。
# Errors get logged to /var/log/cfn-init.log. See Also /var/log/eb-tools.log
commands:
01-mv-localtime:
command: mv /etc/localtime /etc/localtime.bak
02-ln-zoneinfo:
command: ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
これでデプロイ時にJSTにする設定が走りますので、オートスケールしてもインスタンスのクラスをmicroからsmallに変えたりしても同じ設定になります。
例2 インストールとファイルのコピー
下記の例はsSMTPというMTAをインストールし、事前に用意しておいた.ebextensions/ssmtp/ssmtp.conf をしかるべき場所にコピーすると言う事を行っています。ここでポイントとなるのは、ファイルのコピーに container_commands を指定している点です。実は commands はアプリケーションの配備前に行われるので .ebextension以下のファイルはもちろんアプリケーション自体のファイルがまだ存在しない状態の中で実行されます。しかし、container_commandsは配備後に実行されるのでファイルに触る事ができます。
# Errors get logged to /var/log/cfn-init.log. See Also /var/log/eb-tools.log
commands:
01-ssmtp-yum-mail:
command: "yum install mailx -y"
ignoreErrors: true
02-ssmtp-install:
command: "yum --enablerepo=epel install ssmtp -y"
ignoreErrors: true
container_commands:
03-ssmtp-cp-ssmtp-conf:
command: "cp -f .ebextensions/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf"
04-ssmtp-switch-mta:
command: "ln -fs /usr/sbin/sendmail.ssmtp /etc/alternatives/mta"
※注意点として本来yumはcommandsではなくpackagesというディレクティブでインストールする事ができます。上記の例ではちょっと事情があってcommandsを利用しているだけです。