ローカルから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
のインスタンス情報を取得
- EB環境
-
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 ~)
参考