ECSで動かしてるFageteにECS Execで入りたい場面がちょくちょくあるんだけど毎回クラスタ名とタスクID、コンテナ名を貼り付けてコマンドを作るのが面倒だった
aws ecs execute-command \ --cluster <クラスタ名> \ --task <タスクID> \ --container <コンテナ名>\ --interactive \ --command "/bin/bash"
例えばRailsのサービスを2つ運用していてそれぞれのサービスの構成が
- クラスタ4つ(production環境、development環境、demo環境、test環境)
- クラスタ1つの中にサービス2つ(アプリケーション本体とバッチ用サービス)
- さらにアプリケーション本体のタスクにはRailsのコンテナとNginxのコンテナが入っている。。
みたいな状況だと結構面倒。タスクIDは管理画面に確認しにいくか別途コマンド叩いて調べないといけないし。
なのでシェルスクリプトで接続先のクラスタ、サービス、コンテナを選択できるシェルスクリプトを作ってみた。
aws-cliコマンドでクラスタ、サービス、タスクID、コンテナの情報を引っ張ってきて後はjqやaws、sedで必要な部分地道に切り取ってく感じ
#!/bin/bash echo ECSコンテナに接続します。クラスタ、サービス、コンテナ名を選択してください。 echo echo ? クラスタを選択してください echo CLUSTER_NAMES=`aws ecs list-clusters --output text \ | awk -F'/' '{print $2}'` select CLUSTER_NAME in $CLUSTER_NAMES exit do if [ "$CLUSTER_NAME" = "exit" ]; then echo 処理を中断します exit 0 fi break done echo echo $CLUSTER_NAMEが選択されました echo echo ? コンテナを選択してください fi echo SERVICE_NAMES=`aws ecs list-services --cluster $CLUSTER_NAME --output text \ | awk -F'/' '{print $3}'` select SERVICE_NAME in $SERVICE_NAMES exit do if [ "$SERVICE_NAME" = "exit" ]; then echo 処理を中断します exit 0 fi break done echo echo $SERVICE_NAMEが選択されました echo TASKID=`aws ecs list-tasks \ --cluster $CLUSTER_NAME \ --service-name $SERVICE_NAME --output text \ | awk -F'/' '{print $3}' | head -1` CONTAINER_NAMES=`aws ecs describe-tasks --cluster $CLUSTER_NAME \ --tasks $TASKID \ | jq '.tasks[0].containers[].name' \ | sed 's/"//g'` echo ? コンテナを選択してください echo select CONTAINER_NAME in $CONTAINER_NAMES exit do if [ "$CONTAINER_NAME" = "exit" ]; then echo 処理を中断します exit 0 fi break done echo echo $CONTAINER_NAMEが選択されました echo $CONTAINER_NAMEに接続します echo if [ `echo $CONTAINER_NAME | grep 'nginx'` ] ; then SHELL_PATH="/bin/sh" elif [ `echo $CONTAINER_NAME | grep 'demoa_service'` ] ; then SHELL_PATH="/bin/ash" elif [ `echo $CONTAINER_NAME | grep 'demob_service'` ] ; then SHELL_PATH="/bin/bash" else echo "error unexpected container" exit 1 fi aws ecs execute-command \ --cluster $CLUSTER_NAME \ --task $TASKID \ --container $CONTAINER_NAME \ --interactive \ --command $SHELL_PATH
こんな感じで動く。実行サーバはaws-cliのver2が入っているEC2でbashで呼び出す想定。
bash ecs_connection.sh ECSコンテナに接続します。クラスタ、サービス、コンテナ名を選択してください。 ? クラスタを選択してください 1) demoa-service-production 3) demoa-service-development 5) demoa-service-development 2) demoa-service-demo 4) demoa-service-production 6) exit #? 3 demoa-service-developmentが選択されました ? コンテナを選択してください 1) demoa-service-development-app 3) exit 2) demoa-service-development-batch #? 2 demoa-service-development-appが選択されました ? コンテナを選択してください 1) demoa_service_development_app 2) demoa_service_development_nginx 3) exit #? 2 demoa_service_development_appが選択されました demoa_service_development_appに接続します