yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

ECS接続用のシェルスクリプトを書いた

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やawssedで必要な部分地道に切り取ってく感じ

#!/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に接続します