この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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を使うための前提条件、詳細は以下のリンクをご確認ください。
ログインまでの必要作業
- AWS CLIからECS Execの有効化
- ECS Execが有効化されたタスクを再デプロイ
- 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の機能を有効化します。enableExecuteCommand
がtrueであることを確認します。
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も試しに一度触ってみてはいかがでしょうか。