🌊

AWS EC2のサーバー再起動時にミドルウェアサービスを自動起動する

2021/08/05に公開

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。

  • プロジェクトでRailsエンジニアが足りなくて困っている
  • Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
  • オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。

前提

AWSのEC2でサーバーを再起動した際に、アプリケーションが立ち上がるようにする方法をまとめました。
今回はEC2のサーバー内をいじる形で再起動するように設定します。

今回利用するchkconfigについて

chkconfigとはシステム(OS)の状態に応じて、サービスの起動や停止を設定することができる仕組みです。
例えば、サーバ起動時にNginxを起動させたいという場合に、chkconfigを設定することで自動でサービスやアプリケーションを立ち上がるようにできます。

起動時に実行するコマンドの記述

再起動の際に特定のコマンドを実行するようにするため、/etc/init.d/app-startに以下のような記述をします。
※ここではNginxを起動すると仮定して記述しました。

app-start
#!/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に、以下のような記述を追加します。

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