【MP社製】Fargate接続ツール(1)

本投稿は、メタップスアドベントカレンダー7日目のエントリー記事です。

# 概要
メタップスペイメントのフロントチーム（以下、当チーム）では、Fargate (ECS on Fargate) へ接続する際に、以下の当社作成のツールを利用しています。
当記事はそのご紹介になります。

https://github.com/metaps/connect_to_fargate

# なぜ作ったのか？
AWS CLI コマンド等を用いて、Fargate に接続する際には 32 桁のタスク名を指定する必要があります。
タスク名を毎回調べるのは少し手間がかかり、特に開発中でデプロイを日に何回も行う場合はその影響が大きくなってしまいます。
その負荷を減らす目的で作成してみました。
また、コンテナ内部でどのような操作をしたか、ログで残せるようにしたかったため、その機能も追加しています。

# 具体的な導入の流れ
## 実行環境の構築
まず、Session Manager プラグインをインストールします。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

次に pyenv を利用して python の実行環境を構築します。
以下は Windows 11, WSL 2 で構築した例になります。

```
curl https://pyenv.run | bash
cat <<'EOF' >> ~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOF
source ~/.bashrc
pyenv --version
```

当手順では以下のバージョンがインストールされたものと仮定します。

```
$ pyenv --version
pyenv 2.4.20
```

次に git clone して python やライブラリをインストールします。

```
git clone https://github.com/metaps/connect_to_fargate
cd connect_to_fargate
pyenv install 3.11.9
pyenv local 3.11.9
pip install -r requirements.txt
```

すると以下の状態になるかと思います。
※ライブラリのバージョンは変更される場合があります。

```
$ pyenv versions
  system
* 3.11.9 (set by <ディレクトリ>/connect_to_fargate/.python-version)
$ python --version
Python 3.11.9
$ pip freeze
blessed==1.20.0
boto3==1.35.76
botocore==1.35.76
editor==1.6.6
inquirer==3.4.0
jmespath==1.0.1
python-dateutil==2.9.0.post0
readchar==4.2.1
runs==1.2.2
s3transfer==0.10.4
six==1.17.0
urllib3==2.2.3
wcwidth==0.2.13
xmod==1.8.1
```

## Fargate にログインしてみる
これでツールが使える環境が整いましたため、以下のコマンドで実際に Fargate へ接続できるか試してみます。

```
python connect_to_fargate.py
```

実行例としては以下になります。

```
$ python connect_to_fargate.py
処理を開始します
[?] 接続先が存在するクラスター名を選択してください:
   default
 ❯ project-a

クラスター名: project-a

[?] 接続先が存在するサービス名を選択してください:
 ❯ project-a-1-development
   project-a-2-development

サービス名: project-a-1-development

[?] 接続先が存在するタスク名を選択してください:
 ❯ 0123456789abcdefghijklmnopqrstuv

タスク名: 0123456789abcdefghijklmnopqrstuv

[?] 接続先のコンテナ名を選択してください:
   app
 ❯ web

コンテナ名: web

以下のFargateに接続します
----------------------------------------
クラスター名: project-a
サービス名: project-a-1-development
タスク名: 0123456789abcdefghijklmnopqrstuv
コンテナ名: web
----------------------------------------

[?] こちらに接続してよろしいですか:
 ❯ yes
   no

Fargateにログインします

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


Starting session with SessionId: ecs-execute-command-zyxwvutsrqponmlkjihgfedcba
root@ip-172-31-10-10:/var/www/html#
```

成功すると上記のようにコンテナに接続できます。

試しに、ll コマンド（ls -l コマンド）を実行してから、exit コマンドで切断してみます。

```
root@ip-172-31-10-10:/var/www/html# ll
total 1116
drwxrwxrwt 15 www-data www-data   4096 Dec  4 21:07 .
drwxr-xr-x  1 root     root       4096 Dec  4 03:09 ..
-rw-r--r--  1 root     root       1231 Dec  4 03:09 .env.example
drwxr-xr-x  8 root     root       4096 Dec  4 21:06 .git
-rw-r--r--  1 root     root        204 Jul 12 05:12 .gitignore
drwxr-xr-x 14 root     root       4096 Dec  4 21:06 app
（省略）
root@ip-172-31-10-10:/var/www/html# exit
exit


Exiting session with sessionId: ecs-execute-command-zyxwvutsrqponmlkjihgfedcba.

CompletedProcess(args='/usr/local/bin/aws ecs execute-command --cluster project-a --task 0123456789abcdefghijklmnopqrstuv --container web --interactive --command /bin/bash | tee ./connect_to_fargate.py_20241205173230737710.log', returncode=0)
Fargateからログアウトしました
```

すると無事切断がされ、ログも出力されました。

## 操作ログを確認する
操作ログが出力されたので確認してみます。

```
$ cat ./connect_to_fargate.py_20241205173230737710.log

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


Starting session with SessionId: ecs-execute-command-zyxwvutsrqponmlkjihgfedcba
root@ip-172-31-10-10:/var/www/html# ll
total 1116
drwxrwxrwt 15 www-data www-data   4096 Dec  4 21:07 .
drwxr-xr-x  1 root     root       4096 Dec  4 03:09 ..
-rw-r--r--  1 root     root       1231 Dec  4 03:09 .env.example
drwxr-xr-x  8 root     root       4096 Dec  4 21:06 .git
-rw-r--r--  1 root     root        204 Jul 12 05:12 .gitignore
drwxr-xr-x 14 root     root       4096 Dec  4 21:06 app
（省略）
root@ip-172-31-10-10:/var/www/html# exit
exit


Exiting session with sessionId: ecs-execute-command-zyxwvutsrqponmlkjihgfedcba.

2024-12-05 17:33:12,206:connect_to_fargate.py:INFO:CompletedProcess(args='/usr/local/bin/aws ecs execute-command --cluster project-a --task 0123456789abcdefghijklmnopqrstuv --container web --interactive --command /bin/bash | tee ./connect_to_fargate.py_20241205173230737710.log', returncode=0)
2024-12-05 17:33:12,207:connect_to_fargate.py:INFO:Fargateからログアウトしました
```

こちらも操作内容と同じ内容が出力されておりました。

# まとめ
今回は当チームで利用している **[Fargate接続ツール](https://github.com/metaps/connect_to_fargate)** についてご紹介させていただきました。
当ツールは公開リポジトリで配布していますので、もしご興味がございましたらお使いいただけますと幸いです。

https://github.com/metaps/connect_to_fargate

## 次回
@koda-h さんが改修されたFargate接続ツールの短縮コマンドについて、ご紹介されております。
こちらもご覧いただけますと幸いです。

https://qiita.com/koda-h/items/d86129f141e79e958b90

以上になります。