LoginSignup
26
14

More than 3 years have passed since last update.

ECS Exec を有効化する手順(Fargate/Terraform の場合)

Last updated at Posted at 2021-05-17

とっくの昔ですが、ECSにECS Exec機能が追加されています。

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コンソールなどで確認できます。

26
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
14