とっくの昔ですが、ECSにECS Exec機能が追加されています。
- デバッグに Amazon ECS Exec を使用する - Amazon Elastic Container Service
- [アップデート] 実行中のコンテナに乗り込んでコマンドを実行できる「ECS Exec」が公開されました | DevelopersIO
ECS Execとは?
ECSサービス経由で起動したECSタスクの中でコマンドを実行できる機能です。docker exec
, docker-compose exec
と同様です。
なお、単発で実行したECSタスクでは利用できないみたいです。
ECS Exec を有効化する必要はあるの?
以下に示す通り、ECS Execを有効化するのは難しい作業ではありません。ただ、ECS Execを使いたくなるのは問題発生時だと思うので、その時に慌てて設定するより、事前に有効化しておくべきだと思います。
なおECS Execを有効化しても追加料金やセキュリティ懸念といったデメリットはありません。
有効化手順
Terraformのバージョンアップ
一般論ですが、Terraformのバージョンがすごく古い場合はUpgrade Guidesに従ってバージョンを上げておきましょう。
AWS Plugin のバージョンアップ
ECS Execに対応している、 3.34.0
以降にバージョンアップします。
providers.tf や versions.tf でバージョン管理している(はずですよね?)ので、そこで最新版を指定します。
# versions.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 3.40.0" # 最新版のバージョンを指定
}
}
}
$ terraform init -upgrade=true
platform_version
の更新
1.4.0以降を使用します。
resource "aws_ecs_service" "api" {
# ...
platform_version = "1.4.0"
# ...
}
enable_execute_command = true
の追加
resource "aws_ecs_service" "api" {
# ...
enable_execute_command = true
# ...
}
IAMポリシーの追加
以下のようなIAMポリシーを作成し、ECSタスクのタスクロール(タスク実行ロールではない)に紐付けます。
// ECSのタスクロール
resource "aws_iam_role" "task_role" {
# ...
}
data "aws_iam_policy_document" "ecs_task_role_ssmmessages" {
version = "2012-10-17"
statement {
actions = [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
]
resources = ["*"]
}
}
resource "aws_iam_policy" "ecs_task_role_ssmmessages" {
name_prefix = "${var.app_name}-ecs_task-ssmmessages"
policy = data.aws_iam_policy_document.ecs_task_role_ssmmessages.json
}
resource "aws_iam_role_policy_attachment" "ecs_task_role_ssmmessages" {
role = aws_iam_role.task_role.name
policy_arn = aws_iam_policy.ecs_task_role_ssmmessages.arn
}
terraform apply
terraform apply
で変更内容を確認しながら、適用します。
$ terraform apply
ECSタスクの再生成
ECS Execが使えるのは execute_command = true
の設定以降に作成されたECSタスクのみです。
cliコマンドからは以下のコマンドで、ECSサービスのタスクを再生成できます。
$ aws ecs update-service --service=【サービス名】 --cluster=【クラスター名】 --force-new-deployment
AWSのWEBコンソールからやる場合は、ECSサービスの「更新」で「新しいデプロイの強制」にチェックを入れて更新します。
ECS Execを使う
$ aws ecs execute-command --task=【タスクID】 --interactive --cluster=【クラスター名】 --container=【コンテナ名】 --command /bin/sh
ここで【タスクID】は e11f51133d2540c19cdbd2dc153fbf50
のような英数字のIDで、AWSのWEBコンソールなどで確認できます。