AWSECS

ECS ExecでFargateのコンテナの中に入ってデバッグする (execute-command) AWS CLI版

ECS Execを使用して、ローカルPCからECS Fargateのコンテナの中に入ることができます。

ただ、残念ながらAWSコンソールでは、ECS Exec を有効にすることはできません

以前、こちらの記事でTerraformを使用しての設定方法を紹介しましたが、今回はAWS CLIで設定してみます。

スポンサーリンク

前提

ECS Fargateの構築

ECS Exec は、サービスの作成時や更新時に有効化することができます。今回は既にあるサービスに対して有効化します。

ECSって何?という方や、まだFargate を構築していない方は、以下の記事を見ながらチャレンジしてみてください。

AWS CLIのインストール

AWS CLIが必要になります。まだインストールしていない方は、以下の記事を参考にしてみてください。個人的にはAWS Vaultがオススメです。

AWS CLI Session Managerプラグインのインストール

以下のドキュメントを参考にしながらインストールしてください。

AWS CLI 用の Session Manager プラグインをインストールする - AWS Systems Manager
システムに Session Manager プラグインをインストールし、AWS CLI でマネージドノードに接続するセッションを開始と終了します。

ECS Execの有効化手順

まずAWSマネジメントコンソールから ECS Exec に必要なリソースを作成し、その後に AWS CLI でECS Execを有効化します。

SSMを許可するIAMポリシーの作成

まずIAMポリシーを作成します。

ECS Execが、SSM Session Manager の仕組みを利用しているため、SSMへのアクションを許可するポリシーを必要とします。

画面上部検索窓 [ IAM ] で検索 → 当該サービスをクリック → IAM画面の左ペイン [ ポリシー ] → [ ポリシーを作成 ] → JSON タブ を選択し以下のJSONを入力します。

{
   "Version": "2012-10-17",
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}

入力後、[ 次のステップ:タグ ] → [ 次のステップ:確認 ] を押下します。

次のポリシーの確認画面では、[ 名前 ] を入力し [ ポリシーの作成 ] を押下します。

タスクロールに作成したポリシーをアタッチ

次に作成したIAMポリシーを、タスクロールとして使用するIAMロールにアタッチします。

IAM画面の左ペイン [ ロール ] → [ ロールを作成 ] を押下し、次画面以降は以下の通り進めます。

信頼されたエンティティを選択

[信頼されたエンティティタイプ ] に AWSのサービス を選択し、[ ユースケース ] では 他のAWSのサービスのユースケースElastic Container Service を選択し、 Elastic Container Service Task にチェックを入れ、[ 次へ ] を押下します。

許可を追加

先程作成したポリシー名を探して、左のチェックボックスにチェックを入れ [ 次へ ] を押下します。

名前、確認、および作成

[ ロール名 ]を入力し [ ロールを作成 ] を押下します。

タスク定義に作成したタスクロールをアタッチ

次に作成したタスクロールを、ECSタスク定義にアタッチします。

画面上部検索窓 [ ECS ] で検索 → 当該サービスをクリック → ECS画面の左ペイン [ タスク定義 ] → 当該タスク定義を選択 → 最新のリビジョンをクリック → [ 新しいリビジョンの作成 ] を押下します。

タスク定義の新しいリビジョンの作成 画面の [ タスクロール ] のプルダウンで、先程作成したタスクロール名が表示されるので、それを選択 → 一番下までスクロールし [ 作成 ] を押下します。



AWS CLI で ECS Exec を有効化

ここからAWS CLIを使います。以下の表の通り作成したECSリソースに対して更新を行います。

クラスタ名zoo200-cluster
サービス名zoo200-service
タスク名zoo200-task
コンテナ名zoo200-container-httpd

まずECS Execが無効になっていることを確認

aws ecs のサブコマンド describe-services、describe-tasks でECS Execのステータスが “false”であることを確認します。

## サービスの設定値が無効 falseであることを確認
$ aws ecs describe-services \
--cluster zoo200-cluster \
--services zoo200-service \
--query 'services[0].enableExecuteCommand'
false
$
$
## 稼働中のタスクの設定値が無効 falseであることも確認
## まず稼働中タスクの確認
$ aws ecs list-tasks \
--cluster zoo200-cluster \
--service zoo200-service
{
    "taskArns": [
        "arn:aws:ecs:ap-northeast-1:123456789012:task/zoo200-cluster/b12e3xxxxx"
    ]
}
$
## タスクIDを指定してタスクの設定値を確認
$ aws ecs describe-tasks \
--cluster zoo200-cluster \
--tasks b12e3xxxxx \
--query 'tasks[0].enableExecuteCommand'
false
$
$
## 念の為ECS Execがエラーになることも確認
$ aws ecs execute-command \
--cluster zoo200-cluster \
--task b12e3xxxxx \
--container zoo200-container-httpd \
--interactive \
--command "bash"


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


An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn’t running. Wait and try again or run a new task with execute command enabled and try again.

$

ECS Execの有効化

list-task-definitions で最新のリビジョンを確認してから、update-service で、そのリビジョンを指定しつつ –enable-execute-commandで有効化します。(リビジョンを指定しない場合は最新が自動で適用されますが念の為)

$ aws ecs list-task-definitions \
--family-prefix zoo200-task \
--sort desc \
--max-items 10
{
    "taskDefinitionArns": [
        "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/zoo200-task:2",
        "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/zoo200-task:1"
    ]
}
$
## リビジョン1→2の場合はforce-new-deploymentは不要です。ここでは念の為指定してます。
$ aws ecs update-service \
--cluster zoo200-cluster \
--service zoo200-service \
--task-definition zoo200-task:2 \
--desired-count 1 \
--force-new-deployment \
--enable-execute-command
...
設定値がずらーっと標準出力されるのでスペースで飛ばします
...
$

ECS Execが有効になったことを確認

有効化前に確認したサブコマンドと同じサブコマンドで、今度は”true”が返ってくることを確認します。

## サービスの設定値が有効 true であることを確認
$ aws ecs describe-services \
--cluster zoo200-cluster \
--services zoo200-service \
--query 'services[0].enableExecuteCommand'
true
$
$
## 稼働中のタスクの設定値も有効 trueであることも確認
$ aws ecs list-tasks \
--cluster zoo200-cluster \
--service zoo200-service
{
    "taskArns": [
        "arn:aws:ecs:ap-northeast-1:123456789012:task/zoo200-cluster/ac089xxxxx"
    ]
}
$
$ aws ecs describe-tasks \
--cluster zoo200-cluster \
--tasks ac089xxxxx \
--query 'tasks[0].enableExecuteCommand'
true
$

ECS Execでコマンド実行

コマンドの構文や実行例はこちらの記事をご覧ください。

以下のようにexecute-commandで実行中のコンテナの中にはいることができます。

$ aws ecs execute-command \
--cluster zoo200-cluster \
--task ac089xxxxx \
--container zoo200-container-httpd \
--interactive \
--command "bash"


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


Starting session with SessionId: ecs-execute-command-0c6c7xxxxx
root@ip-172-31-20-206:/usr/local/apache2#
root@ip-172-31-20-206:/usr/local/apache2# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs	modules
root@ip-172-31-20-206:/usr/local/apache2#
root@ip-172-31-20-206:/usr/local/apache2# whoami
root
root@ip-172-31-20-206:/usr/local/apache2# exit
exit

Exiting session with sessionId: ecs-execute-command-0c6c7xxxxx.

$

今回は以上です〜ノシ

参考

アリガト━━━ヾ(´∀`)ノ━━━━♪

AWS CLI Command Reference ECS
デバッグ用にAmazon ECS Exec を使用