AWS EC2のサーバー再起動時にミドルウェアサービスを自動起動する
株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい
また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。
前提
AWSのEC2でサーバーを再起動した際に、アプリケーションが立ち上がるようにする方法をまとめました。
今回はEC2のサーバー内をいじる形で再起動するように設定します。
今回利用するchkconfigについて
chkconfigとはシステム(OS)の状態に応じて、サービスの起動や停止を設定することができる仕組みです。
例えば、サーバ起動時にNginxを起動させたいという場合に、chkconfigを設定することで自動でサービスやアプリケーションを立ち上がるようにできます。
起動時に実行するコマンドの記述
再起動の際に特定のコマンドを実行するようにするため、/etc/init.d/app-start
に以下のような記述をします。
※ここではNginxを起動すると仮定して記述しました。
#!/bin/sh
# chkconfig: 345 99 10
# description: start shell
case "$1" in
start)
#実行したいコマンドを記述
systemctl start nginx
;;
stop)
echo "stop!"
;;
*) break ;;
esac
ファイルを作成したら以下のコマンドを実行して、ファイルに実行権限を付与します。
sudo chmod +x /etc/init.d/app-start
起動時にrootユーザ以外のユーザーで実行したいコマンドの記述
また、先ほど行った設定はrootユーザーによって実行されるコマンドになります。
Webアプリケーションなどを運用している際には、特定のユーザー(デプロイ専用のユーザー)でアプリケーションサーバーを実行したいなどの場合があると思います。例えば、アプリケーションをデプロイするユーザーによってアプリケーションのサーバーを起動したい時などです。
その場合には、さきほど作成した/etc/init.d/app-start
に、以下のような記述を追加します。
#!/bin/sh
# chkconfig: 345 99 10
# description: start shell
case "$1" in
start)
# 実行したいコマンドを記述
systemctl start nginx
# 特定のユーザーで実行したいコマンドを記述
# 以下のようにすることで特定のユーザーのホームディレクトリのstart.shファイルを実行する
su -l ユーザー名 "sh /home/ユーザー名/start.sh"
;;
stop)
echo "stop!"
;;
*) break ;;
esac
/home/ユーザー名
にstart.sh
ファイルを作成sて、特定のユーザーで実行したいコマンドを記述します。
※以下はRailsでサーバーを起動させるためのコマンドになります。
cd /var/www/アプリケーション名
bundle exec unicorn -E production -c config/unicorn.rb -D
chkconfigに登録
記述が終わったら以下のコマンドを実行し、chkconfigに登録します。
sudo chkconfig --add app-start
sudo chkconfig app-start on
以上でサーバーを再起動した際に、サービスやアプリケーションが自動で立ち上がるようになります。
Discussion