Fargateで実行したコンテナに簡単にログインできるようになった - Amazon ECS Exec -

## 概要

Fargateで起動したコンテナに対してログインするには、SSHの設定をする必要があったり、SSHの設定をしたくない場合はSSMエージェントをいれて無理やり接続できる状態にするということが必要であったが、今回のリリースによりサーバ側に特別な設定を行わずにコンテナにログインすることが可能になったので試してみた。

過去の方法参考
- https://enokawa.hatenablog.jp/entry/2019/09/05/104545
- https://qiita.com/omukaik/items/4b721a93c45180ce6dbe

## 公式ドキュメント系
- https://aws.amazon.com/jp/about-aws/whats-new/2021/03/amazon-ecs-now-allows-you-to-execute-commands-in-a-container-running-on-amazon-ec2-or-aws-fargate/
- https://aws.amazon.com/jp/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/
- https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html

### クライアント側の要件（AWS-CLI）

> AWS CLIを使用して execコマンドを開始する場合、インストールする必要があるパッケージは、AWSCLIのSSMSessionManagerプラグインのみです。使用しているプラ​​ットフォーム（Linux、Mac、Windows）に応じて、指示に従って適切なバイナリを設定する必要があります。本日、AWS CLI v1が更新され、このロジックが含まれるようになりました。AWS CLIv2は今後数週間で更新されます。AWS CLIv1を利用可能な最新バージョンにアップグレードすることも忘れないでください。このバージョンには、追加のECS Execロジックと、セッションマネージャープラグインをフックしてコンテナーへの安全な接続を開始する機能が含まれています。

- AWS CLI v1がインストールと、sesssoinManagerプラグインがインストールされていれば利用可能。v2については後日対応予定とのこと

### サーバー側の要件（AWS Fargate）

>ECSタスクとそのコンテナがFargateで実行されている場合、FargateにはこのECS機能を有効にするためのすべてのインフラストラクチャソフトウェア要件がすでに含まれているため、何もする必要はありません。Fargateソフトウェアスタックはいわゆる「プラットフォームバージョン」（AWS Fargateプラットフォームバージョンの入門書が必要な場合はこのブログをお読みください）で管理されているため、使用していることを確認するだけで済みますPV 1.4（これは最新バージョンであり、に付属しています）。ECS EXEC前提条件）。

- fargateの場合は、Platformバージョンが1.4以上であれば利用可能
- 上記に加え、ECSのサービスを「--enable-execute-command」な状態に更新 or 新規作成する必要あり → 後述
  - https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html

## 最新のaws-cli（v1：1.19.28 以降）のインストール
- 自分の環境には、aws cli v2 がインストールされていたので、v1をインストールする。以下の記事を参考に、v1とv2を共存できる環境にし、aws-v1 コマンドにてv1のcliを起動できる環境とした
    - https://dev.classmethod.jp/articles/aws-cli-v1-and-v2-coexistence/

- sesssoinManagerプラグインをインストールする
    - https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

```bash
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"

$ unzip sessionmanager-bundle.zip

$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

# インストールの確認
$ session-manager-plugin
> The Session Manager plugin is installed successfully. Use the AWS CLI to start a session.
```


## ECSサービスを作成 or 更新
- 「--enable-execute-command」を指定したサービスを作成または既存のサービスを更新する（現在はCLIからのみ有効か？）
- 新規にpublic-nextworkで起動するコンテナを作成して接続できるか試して見た。プライベートネットワークで必要な通信設定等は試していないので、要確認


- 新規サービスを作成する場合

```
$ aws-v1 ecs create-service \
    --cluster [クラスター名] \
    --task-definition [タスク定義] \
    --enable-execute-command \ // このオプション指定する必要あり
    --service-name [サービス名] \
    --desired-count 1 \
    --platform-version LATEST（1.4以上を指定） \
    --launch-type FARGATE \
    --network-configuration '{
      "awsvpcConfiguration": {
        "subnets": [subnet-id],
        "securityGroups": [sg-id],
        "assignPublicIp": "ENABLED" 
      }
    }'
```

- 既存のサービス更新する場合
    - 既存のサービスについても、「--enable-execute-command」を有効にした後、新たなタスクを起動させることでコンテナへのログインが可能になる

```
$ aws-v1 ecs update-service \
    --cluster [クラスター名] \
    --enable-execute-command \
    --service [サービス名] \
    --desired-count 1
```


- managedAgentsが起動していることを確認する

```
$ aws-v1 ecs describe-tasks \
    --cluster [クラスター名] \
    --tasks [タスクID]

> // 実行結果の中に「managedAgents」の項目が存在していることを確認する
"managedAgents": [
      {
          "lastStartedAt": 1615903414.582,
          "name": "ExecuteCommandAgent",
          "lastStatus": "RUNNING"
      }
  ]
```


## exeute-commandの実行
- 上記の設定を行った後で新規に起動したタスクにおいて、指定したコンテナにrootユーザでログインが可能

```
＄aws-v1 ecs execute-command  \
    --region [リージョン] \
    --cluster [クラスター名] \
    --task [タスクID] \
    --container [コンテナー名] \
    --command "/bin/bash" \
    --interactive

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


Starting session with SessionId: ecs-execute-command-*****************
root@ip-192-168-1-6:/# 
```

## 無効化
- 「--disable-execute-command」を指定することで、「managedAgents」を起動しないように設定することも可能

```
$ aws-v1 ecs update-service \
    --cluster [クラスター名] \
    --disable-execute-command \
    --service [サービス名] \
    --desired-count 1
```

## あとがき
- 現在はaws cli v1にのみ対応しており、後ほどv2にも対応していただけるそうです！！