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プラグインのインストール
以下のドキュメントを参考にしながらインストールしてください。
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 を使用