FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

ECSタスクにexecするためのラッパースクリプトを用意してみた

こんにちは フリューのピクトリンク開発をしているあわたです。
ECSのタスクにexecする為に毎回コンソールで情報確認してターミナルに戻るっていうのが面倒になったのでラッパーを書いてみました。
以外と便利だったので公開しておきます(半分以上覚え書きですが…)

※1 voyagerとかpictlinkとかはプロジェクト名だっりサービス名だったりします。
※2 クラスターリストとかタスクリストが表示されてる状態です。

実行環境について

  • aws-cliの実行環境ができていること

ということでスクリプトの掲載です。

#!/usr/bin/env bash

Usage() {
    echo %0 -p AWSプロファイル名
    exit 0
}

PROFILE=
# 引数解析
while getopts p:d OPT; do
    case $OPT in
    "p") PROFILE=$OPTARG;;
    "d") DEBUG="echo";;
    *) Usage;;
    esac
done

# profile指定があるときの追加パラメータ
# 無いときはdefaultかAWS_PROFILE指定だと思うので無視
if [ "${PROFILE}" != "" ]; then
    PARAMETER="--profile ${PROFILE}"
fi

echo "クラスターを選択"
select CLUSTER in $(AWS_PAGER="" aws ecs list-clusters ${PARAMETER} --output text | sed -e 's@.*cluster\/@@' | sort) exit
do
    if [ "${CLUSTER}" = "exit" ]; then
        echo "やっぱやめます"
        exit 0;
    fi
    break;
done

echo "タスクを選択"
select TASK in $(AWS_PAGER="" aws ecs list-tasks --cluster ${CLUSTER} ${PARAMETER} --output text | sed -e 's@.*cluster\/@@' | sort) exit
do
    if [ "${TASK}" = "exit" ]; then
        echo "やっぱやめます"
        exit 0;
    fi
    break;
done

echo "コンテナを選択"
select CONTAINER in $(AWS_PAGER="" aws ecs describe-tasks --cluster ${CLUSTER} --tasks ${TASK} ${PARAMETER} --output json | jq -r ".tasks[].containers[].name") exit
do
    if [ "${CONTAINER}" = "exit" ]; then
        echo "やっぱやめます"
        exit 0;
    fi
    break;
done

${DEBUG} aws ecs execute-command --cluster ${CLUSTER} --task ${TASK} --container ${CONTAINER} --interactive --command "/bin/bash" ${PARAMETER}

たいしたことはしていないので、スクリプトをファイルに保存して実行権限を付ければ動くと思います。
各項目の選択は数字で行う事だけ知っていれば使い方に悩むこともあまり無いかと。
3回も呼出ししているので少々時間はかかるけれども、コンソールを開くことに比べれば… という感じですね。

おまけ

上のやつを実行するとクラスターがスクロールアウトしてしまって見辛い、選択しにくいという問題が…
そこで fzf で選択するように修正したのもあるので貼り付けておきます。

#!/usr/bin/env bash

Usage() {
    echo %0 -p AWSプロファイル名
    exit 0
}

PROFILE=
# 引数解析
while getopts p:d OPT; do
    case $OPT in
    "p") PROFILE=$OPTARG;;
    "d") DEBUG="echo";;
    *) Usage;;
    esac
done

# profile指定があるときの追加パラメータ
# 無いときはdefaultかAWS_PROFILE指定だと思うので無視
if [ "${PROFILE}" != "" ]; then
    PARAMETER="--profile ${PROFILE}"
fi

echo "クラスターを選択"
CLUSTER=$(AWS_PAGER="" aws ecs list-clusters ${PARAMETER} --output text | sed -e 's@.*cluster\/@@' | sort |  fzf)
if [ "${CLUSTER}" = "" ]; then
    echo "やっぱやめます"
    exit 0;
fi

echo "タスクを選択"
TASK=$(AWS_PAGER="" aws ecs list-tasks --cluster ${CLUSTER} ${PARAMETER} --output text | sed -e 's@.*cluster\/@@' | sort | fzf)
if [ "${TASK}" = "" ]; then
    echo "やっぱやめます"
    exit 0;
fi

echo "コンテナを選択"
CONTAINER=$(AWS_PAGER="" aws ecs describe-tasks --cluster ${CLUSTER} --tasks ${TASK} ${PARAMETER} --output json | jq -r ".tasks[].containers[].name" | fzf)
if [ "${CONTAINER}" = "" ]; then
    echo "やっぱやめます"
    exit 0;
fi

${DEBUG} aws ecs execute-command --cluster ${CLUSTER} --task ${TASK} --container ${CONTAINER} --interactive --command "/bin/bash" ${PARAMETER}

やってることは一緒だけど、少しシンプルになりました。
絞り込みをして選択できるのでこっちの方が便利かもしれない!