【AWS】ECS Execを利用してFargateに接続してみた

# はじめに
[以前の記事](https://qiita.com/kawatani32/items/b79da8af72fc4f0e7b31)で、ECS on Fargateを用いてWebサイトの構築を行いました。
何か問題が起きた際に既存Fargateに接続したいということがあるかと思います。
そこで、Serverworks様の[記事](https://blog.serverworks.co.jp/ecs-exec)を参考に、Fargateに接続できるまでの手順をまとめていきたいと思います。

# 個人環境
+ Windows10

## AWS CLIのインストール
AWS CLIがインストールされていない場合は、公開されている[インストール手順](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)を参考に、AWS CLIのインストールを行います。
※特に変更などせずデフォルトのままインストールを行っています。
※AWS CLIに任意の認証情報を設定してください。

## AWS CLI用のSession Managerプラグインのインストール
Session Managerプラグインがインストールされていない場合は、公開されている[インストール手順](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)を参考に、Session Managerプラグインのインストールを行います。
個人環境はWindowsなので、[Windows での Session Manager プラグインのインストール](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-windows.html)を参考にして、インストールを行いました。
※画面に従い、デフォルトのままインストールを行っています。


# タスク定義でタスク用ロールを付与する


| タスクロール名 | AWSのサービス | IAMポリシー |
|---|---|---|
| ECS-Exec-Fargate-role | Elastic Container Service Task | ECS-Exec-Fargate |


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

```:ECS-Exec-Fargate
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenDataChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:CreateControlChannel"
      ],
      "Resource": "*"
    }
  ]
}
```

前回の記事を参考に、タスク定義の内容を編集して試していきます。
タスクロールを事前に作成したIAMロール「ECS-Exec-Fargate-role」を指定し、他は変更しないで「タスクの作成」を行います。
![20231124_AWS_Fargate_ECS Exce_000001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784723/29ae70e1-6594-f7ba-08ad-f16e531ceced.jpeg)



| IAMユーザ名 | IAMポリシー |
|---|---|
| ecsexec-iam-acc-key01 | ECS-Exec-from-pc |

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

```:ECS-Exec-from-pc
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ecs:UpdateService",
        "ecs:ExecuteCommand",
        "ecs:DescribeTasks",
        "ecs:DescribeServices"
      ],
      "Resource": "*"
    }
  ]
}
```







 + **タスクとサービスに対する ECS Exec をオンにする**
```
aws ecs update-service --cluster <クラスター名> --service <サービス名> --enable-execute-command
```

+ **ECS Exec機能がオンとなっていることを確認する**
```
aws ecs describe-services --cluster <クラスター名> --service <サービス名> | Select-String -Pattern "enableExecuteCommand"
```

+ **ECS ExceでFargateに接続する**
```
aws ecs execute-command --cluster <クラスター名> --task <タスクID> --container <コンテナ名> --interactive --command "/bin/sh"
```



# 【番外編】ECS Exce接続ログを有効化する
ECS Exceで接続した際のログをCloudWatchロググループやS3に保存することができます。
今回は事前に作成したCloudWatchロググループにログを保存するように設定を行います。
## ECS Exce接続ログの有効化
ECS Exce接続ログの有効化を行います。
```
aws ecs update-cluster --cluster <クラスター名> --configuration executeCommandConfiguration="{ logging=OVERRIDE, logConfiguration={ cloudWatchLogGroupName=<CloudWatchロググループ名> } }
```
## 接続ログが有効化されていることを確認
cloudWatchLogGroupNameにECS Exce接続ログ有効化の際に指定したCloudWatchロググループの名前が記載されていることを確認する。
```
aws ecs describe-clusters --clusters <クラスター名>  --include CONFIGURATIONS
```

:::note info
ECS Exceログの有効化を行う際は、ECSタスクロールやIAMユーザに適切な権限がついていることを確認したうえで作業します。
```:ECS-Exec-Fargate-roleに追加する権限
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "logs:DescribeLogStreams",
            "Resource": "arn:aws:logs:*:<AWSアカウントID>:log-group:*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:<AWSアカウントID>:log-group:*:log-stream:*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "logs:DescribeLogGroups",
            "Resource": "*"
        }
    ]
}
```
```:ecsexec-iam-acc-key01に追加する権限
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecs:UpdateCluster",
                "ecs:DescribeClusters"
            ],
            "Resource": "arn:aws:ecs:*:<AWSアカウントID>:cluster/*"
        }
    ]
}
```

:::

# さいごに
コンテナ内にSSHなどをインストールせずに、コンテナに接続することができました。
何か問題が発生した際にECS Execでコンテナに接続して色々とできそうですね。

# 参考にしたURL

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html

https://blog.serverworks.co.jp/2023/10/24/104221

https://docs.aws.amazon.com/cli/latest/reference/ecs/describe-clusters.html