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 オプションも用意されていて環境変数のチェックが手軽にできますが、testleader_only オプションは残念ながら併用できません…。