AWS FargateでECS Execの有効化、Linuxコンテナへログインまでのコマンドを簡単にまとめました(fish shellユーザ向け)

ECS Execするまでのコマンドまとめ。
2021.08.03

AWS Fargateで検証しているとECS Execを使いたい場面が度々訪れませんか?

新たに構築した検証環境ですとECS Exec有効化して、タスクをデプロイし直してからコンテナ上でコマンド実行できたり、ログインできたりします。

ログインまでの準備がめんどくさいです。

確認コマンドはコピペで実行できるようにまとめました。私は普段fish shellを使っていることもあり、fish shell仕様です。他のshellお使いの方は置き換えて読んでください。

bashの読み替え例

変数代入

# fish
$ set NAME hoge

# bash
$ NAME=hoge

変数展開

# fish
$ echo $NAME

# bash
$ echo $NAME

コマンド実行結果を変数に代入

# fish
$ set HERE (pwd)

# bash
$ HERE=$(pwd)

ECS Execとは

ECS Execを使うための前提条件、詳細は以下のリンクをご確認ください。

ログインまでの必要作業

  1. AWS CLIからECS Execの有効化
  2. ECS Execが有効化されたタスクを再デプロイ
  3. ECS Exec実行可能

実行環境

項目 バージョン
aws cli 2.2.14
Fargate Platform 1.4.0
fish 3.3.0

事前準備

クラスター名など4項目がAWS CLIの引数でよく使われるため変数に入れておきます。クラスターが復数ある場合を考えると、マネジメントコンソールから確認した方が手っ取り早いのではないかと思いつつも、AWS CLIから確認します。

CONTAINERNAMEはここの名前です。

変数設定例

set CLUSTERNAME sample-test-cluster
set SERVICENAME sample-test-service
set TASKDEFNAME sample-test-webapp-taskdefinition
set CONTAINERNAME webapp

確認コマンド

echo $CLUSTERNAME
echo $SERVICENAME
echo $TASKDEFNAME
echo $CONTAINERNAME

AWS CLIから確認

クラスター名一覧出力

aws ecs list-clusters

実行結果

{
    "clusterArns": [
        "arn:aws:ecs:ap-northeast-1:12345679012:cluster/sample2-test-cluster",
        "arn:aws:ecs:ap-northeast-1:12345679012:cluster/sample-test-cluster"
    ]
}

ARN指定でも、末尾のクラスター名のみ指定でもどちらでも問題ありません。ECS Execを使うクラスター名を変数に入れます。

  • arn:aws:ecs:ap-northeast-1:12345679012:cluster/sample-test-cluster
  • sample-test-cluster
set CLUSTERNAME <Cluster>

サービス名一覧出力

aws ecs list-services --cluster $CLUSTERNAME

実行結果

{
    "serviceArns": [
        "arn:aws:ecs:ap-northeast-1:12345679012:service/sample-test-cluster/sample-test-service"
    ]
}

ARN指定でも、末尾のサービス名のみ指定でもどちらでも問題ありません。ECS Execを使うサービス名を変数に入れます。

  • arn:aws:ecs:ap-northeast-1:12345679012:service/sample-test-cluster/sample-test-service
  • sample-test-service
set SERVICENAME <Service>

タスク定義一覧出力

aws ecs list-task-definition-families

実行結果

{
    "families": [
        "firelens-dev-task",
        "firelens-dev-webapp-task",
        "firelens-test-webapp-taskdef",
        "sample-test-webapp-taskdefinition",
        "sample2-test-webapp-taskdefinition",
    ]
}

ECS Exec対象のタスク定義名を確認して変数に入れます。

set TASKDEFNAME <TaskDefinition>

コンテナ名一覧を出力

コンテナ名を取得するために現在起動中タスクのARNを変数に入れます。

set TASKNAME (aws ecs list-tasks --cluster $CLUSTERNAME --query "taskArns[0]" --output text)

コンテナ名一覧を出力します。

aws ecs describe-tasks --cluster $CLUSTERNAME --tasks $TASKNAME --query "tasks[].containers[].name"

実行結果

[
    "webapp",
    "log_router"
]

ECS Execしたいコンテナ名を変数に入れます。

set CONTAINERNAME <Container>

準備完了です。

ECS Exec有効化

ECS Execの機能を有効化します。enableExecuteCommandtrueであることを確認します。

ECS Exec有効化

aws ecs update-service \
    --cluster $CLUSTERNAME\
    --service $SERVICENAME \
    --enable-execute-command \
	| grep enableExecuteCommand

ECS Exec有効化したタスクを実行

ECS Exec機能を有効化した後に起動したタスクではじめてECS Execが利用できます。 したがって、タスクを強制デプロイして新しいタスクに入れ替えます。

実行環境によっては注意してください。

タスク強制デプロイ

aws ecs update-service \
    --cluster $CLUSTERNAME \
    --service $SERVICENAME \
	--task-definition $TASKDEFNAME \
	--force-new-deployment

タスクARNが入れ替わり、新しいタスクがデプロイされるまで暫く待ちます。

aws ecs list-tasks --cluster $CLUSTERNAME

入れ替わった新規タスクのARNを変数に入れます。

set TASKNAME (aws ecs list-tasks --cluster $CLUSTERNAME --query "taskArns[0]" --output text)

確認コマンド

echo $TASKNAME

ECS Execでコンテナに接続

ECS Execでコンテナへログインしてみましょう。

aws ecs execute-command \
    --cluster $CLUSTERNAME \
    --task $TASKNAME \
	--container $CONTAINERNAME \
    --interactive \
    --command "/bin/sh"

ログインできたら成功です。

実行結果

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

Starting session with SessionId: ecs-execute-command-03967e78f5ec44116
sh-4.2#

コンテナ内でlsコマンド打った様子。

sh-4.2# ls
AWS_FOR_FLUENT_BIT_VERSION  boot  ecs		 etc	     home  lib64  managed-agents  mnt  proc  run   srv	tmp  var
bin			    dev   entrypoint.sh  fluent-bit  lib   local  media		  opt  root  sbin  sys	usr

おわりに

デバッグしたいときにECS Execするまでが手間で、いつも億劫なのでコマンドまとめてみました。 せっかくなのでfish shellも試しに一度触ってみてはいかがでしょうか。

参考