AWS Elastic Beanstalk で1つのアプリケーションを元に複数の環境を作ることができて非常に便利です(WebApp と Worker など)。ただし、複数の環境を同じアプリケーションで動かすと .ebextensions
が同一になり、そのままだとそれぞれ実行されて困ってしまうケースがあります。
スケールアウトしている環境で、1台だけ実行したい場合は leader_only
オプションを使えば、先着順で決まったサーバ1台のみ .ebextensions
コマンドを実行できます。
複数の環境の場合は、それだけだとだめで標準でサポートはされていませんが、環境変数を条件にすることで使い分けることができます。
container_commands:
01_seed_db:
command: 'if [ "$BEANS_ENV" == "web" ]; then bundle exec rails db:seed; fi'
leader_only: true
02_compile-assets:
command: bundle exec rake assets:precompile
このように環境変数 BEANS_ENV
を予め各環境にセットしておき、環境変数が指定の場合かつ、 leader_only
を有効にすることで、全ての環境で1台だけ実行するコマンドを指定することができます。例えば DB マイグレーションなど。
ちなみに test
オプションも用意されていて環境変数のチェックが手軽にできますが、test
と leader_only
オプションは残念ながら併用できません…。