概要
メタップスペイメントのフロントチーム(以下、当チーム)では、Fargate (ECS on Fargate) へ接続する際に、以下の当社作成のツールを利用しています。
当記事はそのご紹介になります。
なぜ作ったのか?
AWS CLI コマンド等を用いて、Fargate に接続する際には 32 桁のタスク名を指定する必要があります。
タスク名を毎回調べるのは少し手間がかかり、特に開発中でデプロイを日に何回も行う場合はその影響が大きくなってしまいます。
その負荷を減らす目的で作成してみました。
また、コンテナ内部でどのような操作をしたか、ログで残せるようにしたかったため、その機能も追加しています。
具体的な導入の流れ
実行環境の構築
まず、Session Manager プラグインをインストールします。
次に 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接続ツール についてご紹介させていただきました。
当ツールは公開リポジトリで配布していますので、もしご興味がございましたらお使いいただけますと幸いです。
以上になります。