🌟

ECSにSSMでアクセスするの際のコマンドを少し便利にするスクリプト

2023/02/22に公開

前提

今回ECSにSSMする際に毎回タスクIDが変わってしまいその都度、AWSコンソール上で確認しにくのが手間なのでそれを簡略化するためのスクリプトを書いていきますが、1つのサービス内でタスクが1つの想定で書いていきます。
※ 複数扱っている場合などはスクリプトの内容を変更するなり各自でお願いします。

ECSで起動しているDockerコンテナ内にアクセスする

ECSへAWS CLIのSSMを使用してログインする手順は以下の通りになります。

aws ecs execute-command --cluster ${CLUSTER_NAME} --task ${TASK_ID} --container ${CONTAINER_NAME} --interactive --command "/bin/bash"

ただこのコマンドを打つのに、WEBコンソール上で、CLUSTER_NAMECONTAINER_NAMEはリソースを消さない限りは変わることはありませんが、TASK_ID に関してはタスク更新(CDツールやもしくは手動でのService更新)をするたびに変わってしまいます。
今回別のAWSコマンドを使用するなどして動的に利用できるようにしていきます。

スクリプトの内容

このスクリプトは、AWS CLIを使用してECS上で実行中のコンテナに対して、aws ecs execute-commandコマンドを実行することで、コンテナ内でインタラクティブなシェルを起動することを目的としています。

#!/bin/bash

CLUSTER_NAME=""
SERVICE_NAME=""
CONTAINER_NAME=""

TASK_ARNS=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --service-name ${SERVICE_NAME} --desired-status RUNNING --query 'taskArns[*]' --output text | awk '{print $1}')

if [ -n "$TASK_ARNS" ]; then
  FIRST_TASK_ARN=$(echo "$TASK_ARNS" | head -n1)
else
  echo "No tasks found"
  exit 1
fi

TASK_ID=$(echo "${FIRST_TASK_ARN}" | cut -d / -f 3)

echo "Task ID: ${TASK_ID}"

aws ecs execute-command --cluster ${CLUSTER_NAME} --task ${TASK_ID} --container ${CONTAINER_NAME} --interactive --command "/bin/bash"

以下に処理の説明を行っていきます。

  1. ECSクラスター、サービス名、および対象のコンテナ名を指定します。
  2. aws ecs list-tasksコマンドを使用して、指定されたECSクラスターで実行中のサービスに属するタスクのARNのリストを取得します。このとき、--desired-statusオプションを使用して、実行中のタスクのARNのみを取得します。
  3. 取得したタスクARNのリストから、最初のタスクARNを取得します。
  4. 取得したタスクARNから、タスクIDを取得します。
  5. aws ecs execute-commandコマンドを使用して、タスクIDおよびコンテナ名を指定して、タスクの実行中のコンテナに対して、インタラクティブなシェルを起動します。

これにより、ECS上で実行中のコンテナに対して、手軽にSSH接続することができます。

Mac上でコマンド実行できるようにする

zshrc などに以下の記述を加えて source ~/.zshrcでターミナルを起動するとコマンドとして実行できるようになります。

alias {任意のコマンド名}='{スクリプトを置いた任意のパス}'

{}部分は除いた形で入力してください

Discussion