個人的備忘録：ECS の enableExecuteCommand が false の場合に有効化する方法を紹介してみた

## はじめに

ECS の `execute-command` 機能を使用すると、コンテナに直接シェルアクセスできるため、デバッグやメンテナンスが容易になります。

しかし、`enableExecuteCommand` が `false` の場合、`execute-command` を実行しようとするとエラーが発生し、コンテナにアクセスできません。

本記事では、このエラーの解決策と `enableExecuteCommand` を有効にする方法について詳しく解説します。

## 概要

`enableExecuteCommand` が `false` になっていると、ECS タスクで `execute-command` が無効になっており、以下のようなエラーが発生します。

```
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.
```

この状態では `aws ecs execute-command` を使ってコンテナに入ることができません。

本記事では、`enableExecuteCommand` を有効にする方法と、エラーの解決策について詳しく解説します。

## 補足：タスクの `executionRoleArn` に SSM の権限があるか確認

ECS Exec は AWS Systems Manager (SSM) エージェントを利用するため、タスクの実行ロール (`executionRoleArn`) に `AmazonSSMManagedInstanceCore` のポリシーが付与されているか確認してください。

```json
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonSSMManagedInstanceCore",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
        },
        {
            "PolicyName": "AmazonECSTaskExecutionRolePolicy",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
        }
    ]
}
```


## 1. enableExecuteCommand の現在の状態を確認

まず、ECS タスクの `enableExecuteCommand` が `false` になっているかどうかを確認します。

```sh
aws ecs describe-tasks --cluster <ECSクラスタ名> --tasks <タスクID> --query 'tasks[*].enableExecuteCommand'
```

✅ 出力が `true` なら問題なし。すぐに `execute-command` を実行できます。
❌ 出力が `false` の場合、以下の手順で `execute-command` を有効化する必要があります。

## 2. enableExecuteCommand を有効にする

`execute-command` を有効化するために、ECS の サービス (`ecs-service`) に設定を適用し、タスクを再デプロイする必要があります。

### (1) enableExecuteCommand を有効化

まず、ECS サービス (`my-ecs-service`) の `enableExecuteCommand` を `true` に設定します。

```sh
aws ecs update-service --cluster <ECSクラスタ名> \
  --service <ECSサービス名> \
  --enable-execute-command
```

✅ この設定を行うことで、新しく起動するタスクで `execute-command` が有効になります。

## 3. taskRoleArn の設定を確認

もし `enableExecuteCommand` の有効化に失敗した場合、以下のようなエラーが出ることがあります。

```
An error occurred (InvalidParameterException) when calling the UpdateService operation:
The service couldn't be updated because a valid taskRoleArn is not being used.
```

これは ECS タスク定義 (`task definition`) に `taskRoleArn` が設定されていないために発生します。

### (1) taskRoleArn の確認

```sh
aws ecs describe-task-definition --task-definition <タスク定義名> --query 'taskDefinition.taskRoleArn'
```

- 何も表示されない（null）場合 → `taskRoleArn` が設定されていない
- ARNが表示される場合 → そのIAMロールが正しく設定されているか確認

### (2) taskRoleArn を設定

ECS タスク定義にタスクロール (`taskRoleArn`) を追加する必要があります。

#### Terraform の場合

```hcl
resource "aws_iam_role" "ecs_task_role" {
  name = "ecs-task-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Principal = { Service = "ecs-tasks.amazonaws.com" }
      Action = "sts:AssumeRole"
    }]
  })
}

resource "aws_ecs_task_definition" "main" {
  family                   = "my-task"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "256"
  memory                   = "512"
  execution_role_arn       = aws_iam_role.ecs_task_execution_role.arn
  task_role_arn            = aws_iam_role.ecs_task_role.arn  # タスクロールを設定
}
```

#### AWS コンソールで修正する場合

1. ECS → タスク定義 → `my-task` を開く
2. 新しいバージョンを作成
3. タスクロール (`taskRoleArn`) を `ecsTaskExecutionRole` に設定
4. タスク定義を保存

## 4. ECSタスクを強制再デプロイ

タスク定義 (`task definition`) を修正した場合は、新しいタスクを起動し直す必要があります。

```sh
aws ecs update-service --cluster <ECSクラスタ名> \
  --service <ECSサービス名> \
  --force-new-deployment
```

✅ このコマンドを実行すると、新しいタスクが `enableExecuteCommand=true` の状態で作成されます。

## 5. execute-command でシェルに入る

### (1) 新しいタスクIDを取得

```sh
aws ecs list-tasks --cluster <ECSクラスタ名> --service-name <ECSサービス名>
```

### (2) タスク内にシェル接続

```sh
aws ecs execute-command --cluster <ECSクラスタ名> \
  --task <新しいタスクID> \
  --container my-app-repo \
  --command "/bin/sh" \
  --interactive
```

✅ これでECSのコンテナに入れるようになります。

## まとめ

ECS の `enableExecuteCommand` が `false` になっていると、`aws ecs execute-command` を使ってコンテナに入ることができません。

この問題を解決するためには、ECS サービスの `enableExecuteCommand` を `true` に設定し、タスクを再デプロイする必要があります。

私の環境では、`taskRoleArn` が正しく設定されていることを確認し、必要に応じて修正することで、エラーが解消できました。