0
1

More than 1 year has passed since last update.

Elastic Beanstalk環境の複数インスタンス上Dockerコンテナ内に同時にコマンド実行する方法

Last updated at Posted at 2021-12-30

ローカルからElastic Beanstalk環境で立ち上がっている複数インスタンス上Dockerコンテナ内に、同時にコマンド実行するコマンド

▼超参考
Elastic Beanstalk 特定環境の全インスタンス上でコマンドを実行する方法 - Qiita

複数インスタンス上Dockerコンテナ内に同時にコマンド実行するパイプライン

CLIで以下パイプラインを実行

aws elasticbeanstalk describe-instances-health --environment-name my-env | jq -r ".InstanceHealthList[].InstanceId" | xargs -L1 -P2 -t -I {} eb ssh my-env --instance {} --command "sudo docker ps -a | grep 'entrypoint.sh' | awk '{print \$NF}' | xargs -t -I {} sudo docker exec {} bundle exec rails routes"

my-envというEB環境に立ち上がっている2台のインスタンス内Railsアプリケーション(Docker)にrailsコマンドが実行できます。
※もっとスマートに書ける方法をご存知の方がいましたらアドバイスいただけると嬉しいです!!

必要なもの

  • AWS CLI
  • EB CLI
  • jq

(簡単な)解説

1. インスタンス情報取得

  • aws elasticbeanstalk describe-instances-health --environment-name my-env
    • EB環境my-envのインスタンス情報を取得
  • jq -r ".InstanceHealthList[].InstanceId"
    • 取得したインスタンス情報をjqに渡してインスタンスIDのみを抽出

2. インスタンスSSH接続

  • xargs -L1 -P2 -t -I {}
    • 渡ってきたインスタンスIDを使用して以下eb sshコマンド作成
    • インスタンスが2台のため2プロセスを使って並列処理、それぞれ渡す引数は1つずつ
  • eb ssh my-env --instance {} --command ""
    • インスタンスIDを指定してeb ssh
    • インスタンス内で実行するコマンドを引数に記載(中身は後述)

3. docker情報取得(インスタンス内)

  • sudo docker ps -a
    • インスタンス内のDockerコンテナ情報を表示
  • grep 'entrypoint.sh' | awk '{print \$NF}'
    • Dockerコンテナ情報から対象のコンテナをgrepし、awkでNAMESを抽出

4. dockerコンテナ内コマンド実行

  • xargs -t -I {} sudo docker exec {} bundle exec rails routes"
    • 渡ってきたDockerコンテナ名を使用してdocker execコマンドを作成
    • docker execコマンドにコンテナ内で実行したいコマンドを記載する(bundle exec ~)

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1