ECS Execを使って Fargateのコンテナにアクセスする

# はじめに
本記事では、[ECS Exec](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html) の機能を使って、稼働中の Fargate のコンテナにアクセスする時の**簡易な**手順について、記載しています。

アクセスする Fargate のコンテナ周りの環境は、下図になります。
![00_fargate_ecs_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/8d854ce9-beb3-9a7f-0c49-029cece783df.png)
ECS Execは、SSM エージェントのバイナリを、下図のようにコンテナにバインドマウントして、Systems Manager (SSM) の Session Manager 経由で、アクセスできるようにしているようです。
![ecs_exec_diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/3c52096c-bb6f-a9ea-1e96-dc7206a91712.png)
引用：[Github での Proposal](https://github.com/aws/containers-roadmap/issues/1050)
# 前提条件
## Fargate のコンテナサイド
- ECS サービスを実行するプラットフォームのバージョンが<font color="Red">1.4.0 </font> 以降であること。
- Fargate のコンテナが Systems Manager (SSM) のエンドポイントに接続できること。 

## アクセスするクライアントサイド
- ECS Exec コマンドを実行するための AWS CLI がインストールされていること。

|AWS CLI|対応バージョン|
|:---|:---|
|v1|<font color="Red">1.19.28</font> 以降|
|v2|<font color="Red">2.1.31</font> 以降|

- AWS CLI 用の Session Manager plugin がインストールされていること。

参考：
[AWS CLI バージョン 1 のインストール、更新、およびアンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html)
[AWS CLI バージョン 2 のインストール、更新、およびアンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)
[(オプション) AWS CLI 用の Session Manager plugin をインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)

# ECS Exec を有効にする
下記コマンドで、AWS CLI が対応するバージョンか確認します。

```
$ aws --version
aws-cli/1.19.92 Python/3.7.4 Darwin/18.7.0 botocore/1.20.92
```

下記コマンドで、[Session Manager plugin がインストールされているか検証します。](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-verify)（下記のメッセージが出力されていれば、OKです。）

```
$ session-manager-plugin

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

```

アクセスするタスク（コンテナ）の IAM ロール に下記のSSM エージェントの実行用のポリシーをアタッチします。

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

下記コマンドで、ECS サービスの ECS Exec を有効にします。

```
$ aws ecs update-service --region ap-northeast-1 --cluster [クラスター名] --service [サービス名] --enable-execute-command

## 出力結果
{
    "service": {
省略
        "enableExecuteCommand": true
    }
}

```

下記コマンドで、ECS サービスの ECS Exec が有効になったことを確認します。（ **true** と出力されていれば OK です ）

```
$ aws ecs describe-services --region ap-northeast-1 --cluster [クラスター名] --services [サービス名] | jq '.services[].enableExecuteCommand'

true
```

<font color="Red">**有効にしたサービス上で、新しく起動したタスクに対してのみ ECS Exec は使用できます。**</font>
サービスを更新するなどして、タスクを再デプロイして下さい。
![03_fargate_ecs_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/24391849-908b-8afe-df55-7ebd8bddf3d1.png)

# Fargate のコンテナにアクセス

ECS Exec を有効にしたサービス上で起動した **タスク ID** を確認します。
![01_fargate_ecs_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/db952138-f540-4417-fd5e-b12e14197451.png)

下記コマンドで、Fargate のコンテナにアクセスします。（Starting session...と出力されれば OK です）

```
aws ecs execute-command --region ap-northeast-1 --cluster [クラスター名] --task [タスク ID] --container [コンテナ名] --interactive --command "/bin/sh"


The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-07cfe2faxxxxxxxxxxxxxxxxx

```

Systems Manager (SSM) の Session Manager 上でも接続されていることを確認できます。
![04_fargate_ecs_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/4ea34cc3-9dce-61a9-053c-c6f88a7c5ec4.png)

# 詳細な使用方法
より詳細な使用方法は、下記が参考になります。

[New – Amazon ECS Exec による AWS Fargate, Amazon EC2 上のコンテナへのアクセス](https://aws.amazon.com/jp/blogs/news/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/)

[デバッグに Amazon ECS Exec を使用する](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html)