業務効率化ツールは生成AIを使って作ろう

こんにちは、サーバエンジニアの池脇です。
みなさん業務効率化は行なっていますか？
エンジニアは仕事の性質上、定常タスクが多いのではないかと思います。しかしながら定常タスクにはあまり時間を割きたくない……そういった考えから業務効率化ツールを作成する方も少なくないはずです。
そんな **業務効率化ツールの作成を生成AIを使って楽にしよう！** というのが今回の記事の趣旨となります。

## 前提
今回は **ChatGPT-4o** を利用してツールの作成を行います。

また作成するツールは以下が動作する環境を前提とします。
- Bash (ローカル上)
- AWS CLI (ローカル上)
- MySQLコマンドラインクライアント (踏み台サーバ上)

あくまで一例を提示するだけですので、適宜自身の環境で作成したいツールに置き換えて考えてください。

## プロンプトを考える
生成AIを利用する上でプロンプト(生成AIに対する命令)は重要です。
しかしながら求めた機能を備えたツールを作成するためにどうしたらいいかについて考えると初めは悩んでしまうと思います。
そんな時はまず **実際に行っている作業の手順をそのまま伝えて** ツール化をお願いしてみましょう。
例えば以下の通りです。
>
>```
>$ aws ecs list-tasks --cluster cluster_name --service-name service_name --output text | awk -F '/' '{print $3}'
>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>$ aws ecs execute-command --cluster cluster_name --container container_name --task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --interactive  --command bin/bash
>
>The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
>
>
>Starting session with SessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXX
>root@:/# mysql -u user -h host_name -P3306 -p password db_name
>
>〜中略〜
>
>MySQL [db_name]> select * from table_name where login_id = 'login_id' \G;
>+--------------------------------------+----------+---------+
>| id                                   | login_id | name    |
>+--------------------------------------+----------+---------+
>| 00000000-0000-0000-0000-000000000000 | login_id | 名前     |
>+--------------------------------------+----------+---------+
>1 row in set (0.002 sec)
>```
>この一連の処理をBashスクリプト化して叩きたいです

このように普段叩いているコマンド流れをそのままコピーしてBashスクリプト化をお願いしてみます。
回答はどうなるでしょうか？

>以下は、あなたが示した一連の処理をBashスクリプト化したものです。このスクリプトは、指定されたECSクラスターとサービス名からタスクIDを取得し、そのタスクに対してコマンドを実行して、MySQLデータベースに接続し、特定のユーザー情報を取得します。
>```bash
>#!/bin/bash
>
># 設定
>CLUSTER_NAME="cluster_name"
>SERVICE_NAME="service_name"
>CONTAINER_NAME="container_name"
>DB_USER="user"
>DB_HOST="host_name"
>DB_PORT="3306"
>DB_NAME="db_name"
>LOGIN_ID="login_id"
>
># タスクIDを取得
>TASK_ID=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --service-name ${SERVICE_NAME} --output text | awk -F '/' '{print $3}')
>
># ECSタスク内でコマンドを実行
>aws ecs execute-command --cluster ${CLUSTER_NAME} --container ${CONTAINER_NAME} --task ${TASK_ID} --interactive --command "mysql -u${DB_USER} -h${DB_HOST} -P${DB_PORT} -p${DB_PASSWORD} ${DB_NAME} -e \"select * from i_user where login_id = '${LOGIN_ID}';\""
>```
>このスクリプトを実行する前に、以下の点を確認してください：
>1. DB_PASSWORD 環境変数が設定されていることを確認してください。MySQLのパスワードはセキュリティ上の理由>からスクリプトに直接書かない方が良いです。
>2. AWS CLIがインストールされており、適切に設定されていることを確認してください。
>3. ecs-execute-command が使用できるように、必要なIAM権限が設定されていることを確認してください。
>4. このスクリプトに実行権限を付与するために、以下のコマンドを実行します：
>   
>```bash
>   chmod +x your_script_name.sh
>```
>このスクリプトを実行することで、あなたが示した一連の処理が自動的に行われます。

Bashスクリプトを出力してくれましたね。
実際に動かして動作確認をしてみましょう。

```
$ ./test.sh

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


Starting session with SessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXX
+--------------------------------------+----------+---------+
| id                                   | login_id | name    |
+--------------------------------------+----------+---------+
| 00000000-0000-0000-0000-000000000000 | login_id | 名前     |
+--------------------------------------+----------+---------+


Exiting session with sessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXX.
```

無事同じ出力結果を得ることができました！
これで簡単に業務効率化ツールの作成が完了しました。

## さらに使いやすくしてみる
しかしこのままではお世辞にも使いやすいツールとはいえません。
さらなる改良を生成AIにお願いしてみましょう。
今回はあえてざっくりと以下のようにお願いしてみます。

>変数化したパラメータを外部ファイルから取得するようにしたいです

回答はこうなりました。

>外部ファイルから変数を取得するようにするには、設定ファイルを作成し、その設定ファイルをスクリプト内で読み込むようにします。以下の手順で行います：
>
>1.設定ファイル (config.env) を作成します。必要な変数をこのファイルに記述します。
>```bash
># config.env
>CLUSTER_NAME="cluster_name"
>SERVICE_NAME="service_name"
>CONTAINER_NAME="container_name"
>DB_USER="user"
>DB_HOST="host_name"
>DB_PORT="3306"
>DB_NAME="db_name"
>LOGIN_ID="login_id"
>DB_PASSWORD="your_dev_db_password"
>```
>2.スクリプト (execute_command.sh) を作成し、設定ファイルを読み込むようにします。
>```bash
>#!/bin/bash
>
># 設定ファイルを読み込む
>source config.env
>
># タスクIDを取得
>TASK_ID=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --service-name ${SERVICE_NAME} --output text | awk -F '/' '{print $3}')
>
># ECSタスク内でコマンドを実行
>aws ecs execute-command --cluster ${CLUSTER_NAME} --container ${CONTAINER_NAME} --task ${TASK_ID} --interactive --command "mysql -u${DB_USER} -h${DB_HOST} -P${DB_PORT} -p${DB_PASSWORD} ${DB_NAME} -e \"select * from i_user where login_id = '${LOGIN_ID}' \G;\""
>```
>3.スクリプトに実行権限を付与します。
>```bash
>chmod +x execute_command.sh
>```
>4.スクリプトを実行します。
>```bash
>./execute_command.sh
>```
>これで、スクリプトは config.env ファイルから設定を読み込み、指定された操作を実行します。設定ファイルを変更することで、スクリプトの動作を簡単に変更できるようになります。

こちらも実行してみます。
```
$ ./execute_command.sh

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


Starting session with SessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXX
+--------------------------------------+----------+---------+
| id                                   | login_id | name    |
+--------------------------------------+----------+---------+
| 00000000-0000-0000-0000-000000000000 | login_id | 名前     |
+--------------------------------------+----------+---------+


Exiting session with sessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXX.
```

問題なく実行できました。
ざっくりとしたプロンプトだったため不便になりそうな部分は解消してもらうようにしましょう。また`config.env`については環境ごとにファイル分けを行うことも提案してみましょう。

>LOGIN_IDはスクリプト実行時に引数から受け取るようにしたいです。
>またconfig.envは環境ごとに別ファイルを定義し、ファイル一覧を表示して番号を入力することで選択する形をとりたいです。

回答はこのようになりました。

>了解しました。以下の手順で、設定ファイルを環境ごとに定義し、スクリプト実行時にファイル一覧から番号を入力して選択する形にします。また、`LOGIN_ID` をスクリプト実行時に引数から受け取るようにします。
>### 1. 環境ごとの設定ファイルを作成
>#### `config_dev.env`
>```bash
># config_dev.env
>CLUSTER_NAME="cluster_name_dev"
>SERVICE_NAME="service_name"
>CONTAINER_NAME="container_name"
>DB_USER="user_dev"
>DB_HOST="host_name_dev"
>DB_PORT="3306"
>DB_NAME="db_name_dev"
>DB_PASSWORD="your_dev_db_password"
>```
>#### `config_prod.env`
>```bash
># config_prod.env
>CLUSTER_NAME="cluster_name_prod"
>SERVICE_NAME="service_name"
>CONTAINER_NAME="app"
>DB_USER="user_prod"
>DB_HOST="host_name_prod"
>DB_PORT="3306"
>DB_NAME="db_name_prod"
>DB_PASSWORD="your_prod_db_password"
>```
>### 2. スクリプトを修正して、引数から LOGIN_ID を受け取り、設定ファイルを選択
>#### `execute_command.sh`
>```bash
>#!/bin/bash
>
># 引数のチェック
>if [ "$#" -ne 1 ]; then
>    echo "Usage: $0 <login_id>"
>    exit 1
>fi
>
>LOGIN_ID=$1
>
># 設定ファイルの一覧を表示
>echo "Select environment configuration file:"
>CONFIG_FILES=(*.env)
>select CONFIG_FILE in "${CONFIG_FILES[@]}"; do
>    if [ -n "$CONFIG_FILE" ]; then
>        echo "You selected $CONFIG_FILE"
>        break
>    else
>        echo "Invalid selection. Please try again."
>    fi
>done
>
># 選択した設定ファイルを読み込む
>if [ ! -f "$CONFIG_FILE" ]; then
>    echo "Configuration file $CONFIG_FILE does not exist!"
>    exit 1
>fi
>
>source $CONFIG_FILE
>
># タスクIDを取得
>TASK_ID=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --service-name ${SERVICE_NAME} --output text | awk -F '/' '{print $3}')
>
># ECSタスク内でコマンドを実行
>aws ecs execute-command --cluster ${CLUSTER_NAME} --container ${CONTAINER_NAME} --task ${TASK_ID} --interactive --command "mysql -u${DB_USER} -h${DB_HOST} -P${DB_PORT} -p${DB_PASSWORD} ${DB_NAME} -e \"select * from i_user where login_id = '${LOGIN_ID}';\""
>```
>### 3. スクリプトに実行権限を付与
>```bash
>chmod +x execute_command.sh
>```
>### 4. スクリプトを実行
>```bash
>./execute_command.sh login_id
>```
>スクリプトを実行すると、設定ファイルの一覧が表示されます。リストから番号を入力して環境を選択し、`LOGIN_ID` を引数として受け取って指定された操作を実行します。

回答の通りにファイルを準備し、実行してみます。

```
$ ./execute_command.sh
Usage: ./execute_command.sh <login_id>

$ ./execute_command.sh login_id
Select environment configuration file:
1) config_dev.env
2) config_prod.env
#? 1
You selected config_dev.env

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


Starting session with SessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXX
+--------------------------------------+----------+---------+
| id                                   | login_id | name    |
+--------------------------------------+----------+---------+
| 00000000-0000-0000-0000-000000000000 | login_id | 名前     |
+--------------------------------------+----------+---------+


Exiting session with sessionId: ecs-execute-command-XXXXXXXXXXXXXXXXXXXXXXXXXX.
```

問題なく動作しています。
この通り生成AIとの簡単なやり取りを経て、かなり使い勝手の向上したツールが作成できました！

## まとめ
今回は生成AIを活用して業務効率化ツールとしてのBashスクリプトを作成する方法をご紹介しました。
具体的には
- **現行の作業手順をプロンプトとしてそのまま伝える**
- **使いやすくするために改良したい部分を明確に伝える**

この2点を踏まえるだけで簡単にツールの作成ができます。

これによって定常タスクの時間を大幅に削減し、他の業務に専念できるかと思います。みなさんも生成AIを駆使して、今後も効率化の可能性を探求していきましょう！