Amazon Q Developer CLI Agent(q chat)がすごいらしいという話を聞いて、遊んでみた。
準備
特に何もしていないが、使えた。
~/Documents > q chat
Hi, I'm Amazon Q. Ask me anything.
Things to try
• Fix the build failures in this project.
• List my s3 buckets in us-west-2.
• Write unit tests for my application.
• Help me understand my git status
/acceptall Toggles acceptance prompting for the session.
/profile (Beta) Manage profiles for the chat session
/context (Beta) Manage context files for a profile
/help Show the help dialogue
/quit Quit the application
正式手順はこれらしい。
今回特にインストール操作はしていないが、以前からVS CodeでAmazon Q Developerを使っているので、その過程で過去に入れてたものと思われる。ちなみにOSはmacOS Sequoia、AWS CLIは2.25.6を使用中。
ちなみにAmazon Q CLIはAWS CLIを駆使することができるのが特徴の一つだが、これはaws configure
で構成したCLIプロファイルを使用して動作する模様。
いろいろ試してみる
何はともあれ、遊んでみる。
Case1: アプリを作ってもらう
> hello worldを指定した回数実行するコードを、Python、TypeScript、Go、Javaで表示するStreamlitアプリを書いて
q chatの生成結果
> hello worldを指定した回数実行するコードを、Python、TypeScript、Go、Javaで表示するStreamlitアプリを書いて
Streamlitを使って「Hello World」を指定した回数実行するコードを複数のプログラミング言語で表示するアプリを作成しましょう。
以下のコードを実装します。
まず、必要なファイルを確認しましょう。
Read from filesystem
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Reading directory: /Users/XXX with maximum depth of 0
Reading from filesystem...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Reading:
🟢 Completed in 0.2s
Read from filesystem
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Reading file: /Users/XXX/requirements.txt, all lines
Reading from filesystem...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Reading: requirements.txt
🟢 Completed in 0.0s
Read from filesystem
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Reading file: /Users/XXX/nova_chatbot.py, all lines
Reading from filesystem...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Reading: nova_chatbot.py
🟢 Completed in 0.0s
それでは、「Hello World」を指定した回数実行するコードを複数のプログラミング言語で表示するStreamlitアプリを作成します。
Write to filesystem
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Path: /Users/XXX/hello_world_app.py
+ 1: import streamlit as st
+ 2:
+ 3: # Streamlit アプリのタイトルとスタイル設定
+ 4: st.set_page_config(page_title="Hello World 複数言語サンプル", layout="wide")
+ 5: st.title("Hello World 複数言語サンプル")
+ 6:
+ 7: # サイドバーに回数入力用のスライダーを追加
+ 8: with st.sidebar:
+ 9: st.header("設定")
+ 10: count = st.slider("繰り返し回数", min_value=1, max_value=20, value=5)
+ 11: st.write(f"「Hello World」を {count} 回表示します")
+ 12:
+ 13: # Python のコード例
+ 14: st.header("Python")
+ 15: python_code = f'''
+ 16: # Python で Hello World を {count} 回表示
+ 17: for i in range({count}):
+ 18: print(f"Hello World {{i+1}}")
+ 19: '''
+ 20: st.code(python_code, language="python")
+ 21:
+ 22: # 実行結果のプレビュー
+ 23: python_output = "\n".join([f"Hello World {i+1}" for i in range(count)])
+ 24: with st.expander("実行結果を表示"):
+ 25: st.text(python_output)
+ 26:
+ 27: # TypeScript のコード例
+ 28: st.header("TypeScript")
+ 29: typescript_code = f'''
+ 30: // TypeScript で Hello World を {count} 回表示
+ 31: for (let i = 0; i < {count}; i++) {{
+ 32: console.log(`Hello World ${{i+1}}`);
+ 33: }}
+ 34: '''
+ 35: st.code(typescript_code, language="typescript")
+ 36:
+ 37: # 実行結果のプレビュー
+ 38: typescript_output = "\n".join([f"Hello World {i+1}" for i in range(count)])
+ 39: with st.expander("実行結果を表示"):
+ 40: st.text(typescript_output)
+ 41:
+ 42: # Go のコード例
+ 43: st.header("Go")
+ 44: go_code = f'''
+ 45: package main
+ 46:
+ 47: import (
+ 48: "fmt"
+ 49: )
+ 50:
+ 51: func main() {{
+ 52: // Go で Hello World を {count} 回表示
+ 53: for i := 0; i < {count}; i++ {{
+ 54: fmt.Printf("Hello World %d\\n", i+1)
+ 55: }}
+ 56: }}
+ 57: '''
+ 58: st.code(go_code, language="go")
+ 59:
+ 60: # 実行結果のプレビュー
+ 61: go_output = "\n".join([f"Hello World {i+1}" for i in range(count)])
+ 62: with st.expander("実行結果を表示"):
+ 63: st.text(go_output)
+ 64:
+ 65: # Java のコード例
+ 66: st.header("Java")
+ 67: java_code = f'''
+ 68: public class HelloWorld {{
+ 69: public static void main(String[] args) {{
+ 70: // Java で Hello World を {count} 回表示
+ 71: for (int i = 0; i < {count}; i++) {{
+ 72: System.out.println("Hello World " + (i+1));
+ 73: }}
+ 74: }}
+ 75: }}
+ 76: '''
+ 77: st.code(java_code, language="java")
+ 78:
+ 79: # 実行結果のプレビュー
+ 80: java_output = "\n".join([f"Hello World {i+1}" for i in range(count)])
+ 81: with st.expander("実行結果を表示"):
+ 82: st.text(java_output)
+ 83:
+ 84: # フッター
+ 85: st.markdown("---")
+ 86: st.caption("このアプリは Amazon Bedrock Nova Pro チャットボットプロジェクトの一部として作成されました。")
Enter y to run this tool, otherwise continue chatting.
> y
Writing to filesystem...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Creating: /Users/XXX/hello_world_app.py
🟢 Completed in 0.2s
アプリを作成しました!hello_world_app.pyというファイル名で保存しました。このアプリは以下の機能を持っています:
1. サイドバーで「Hello World」の繰り返し回数を1〜20回の間で設定できます
2. 4つのプログラミング言語(Python、TypeScript、Go、Java)でそれぞれ「Hello World」を指定回数表示するコードを表示します
3. 各言語のコードの実行結果をプレビューできます
アプリの実行方法:
bash
streamlit run hello_world_app.py
実行すると、ブラウザで自動的に開かれ、以下の内容が表示されます:
• タイトル「Hello World 複数言語サンプル」
• サイドバーに繰り返し回数を設定するスライダー(デフォルトは5回)
• 各プログラミング言語のコードブロック
• 各言語の実行結果を表示する展開可能なセクション
サイドバーのスライダーを動かすと、すべての言語のコード例と実行結果が動的に更新されます。
このアプリは既存のプロジェクト(Amazon Bedrock Nova Pro チャットボット)と同じ環境で動作するように設計されており、必要な
ライブラリ(streamlit)は既にインストールされています。
これは。。。
指示を実現するために自らツールを選択し、結果を踏まえて自ら次のアクションを判断して実行する、いわゆるAgentic Workflowが実現されていることが見て取れる。現在のディレクトリ内をコンテキストとして読み込んでいるようなので、単発のカード出力だけでなく対話的なリファクタリングも効率よくできそう(余談だが、通常こチャットボットでコーディングしようとするとこの辺が結構大変だったりする)。
コマンドひとつでここまでやってくれるというのは、今でこそ「すごいな」で済ませられるが、数年前、いやLLMが注目され始めた2年前でも夢物語だっただろう。
ちなみに実行してみた結果はこちら。
> !streamlit run hello_world_app.py
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8501
Network URL: http://172.16.xxx.xxx:8501
For better performance, install the Watchdog module:
$ xcode-select --install
$ pip install watchdog
作ったもの自体はシンプルなものだが、これを自然言語のコマンド一発だけで、ものの1分ほどでAIが作ってしまうことが驚異。
人力なら、詳しい人でも小一時間、プログラム初学者なら一日かかってもおかしくない。特にフロントエンドは、進化の速さ(生成AIに比べればのんびりしたものだが...)も相俟って敷居が高い印象だったが、学習コスト云々以前にもはやコードやライブラリを読み解く必要すらない時代に来ているのかも。
Case2: アカウントのコスト分析を行ってもらう
> このアカウントで一番コストがかかっているAWSサービスを調べて、対策を教えて
⠋ Thinking...
q chatの生成結果
> このアカウントで一番コストがかかっているAWSサービスを調べて、対策を教えて
⠋ Thinking...
Use AWS CLI
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Running aws cli command:
Service name: ce
Operation name: get-cost-and-usage
Parameters:
- GroupBy: [{"Key":"SERVICE","Type":"DIMENSION"}]
- Metrics: ["BlendedCost"]
- Granularity: "MONTHLY"
- TimePeriod: {"End":"2025-03-29","Start":"2025-02-01"}
Profile name: default
Region: us-east-1
Label: サービス別コスト情報の取得
Using AWS CLI...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
🟢 Completed in 1.514s
Use AWS CLI
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Running aws cli command:
Service name: ce
Operation name: get-cost-and-usage
Parameters:
- TimePeriod: {"End":"2025-03-29","Start":"2025-02-01"}
- Filter: {"Dimensions":{"Key":"SERVICE","Values":["AWS CloudTrail"]}}
- GroupBy: [{"Key":"USAGE_TYPE","Type":"DIMENSION"}]
- Metrics: ["BlendedCost"]
- Granularity: "MONTHLY"
Profile name: default
Region: us-east-1
Label: AWS CloudTrailのコスト詳細
Using AWS CLI...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
🟢 Completed in 1.465s
...(中略)...
アカウントのコスト分析を行った結果、以下のサービスが最もコストがかかっていることが分かりました。
## 最もコストがかかっているAWSサービス
1. AWS CloudTrail: 約xxx USD/月(2月)、約xxx USD/月(3月)
2. Amazon OpenSearch Service: 約xxx USD/月(2月)、約xxx USD/月(3月)
3. Amazon Virtual Private Cloud: 約xxx USD/月(2月)、約xxx USD/月(3月)
4. EC2 - Other: 約xxx USD/月(2月)、約xxx USD/月(3月)
5. Amazon SageMaker: 約xxx USD/月(2月)、約xxx USD/月(3月)
## 特に注目すべき問題点
### 1. AWS CloudTrail - 最大のコスト要因
CloudTrailのコスト内訳を見ると、ほとんどが「APN1-Ingestion-Bytes」(約1,615 USD/月)で、これはデータイベントの記録によるものです。現在、複数のCloudTrailが設定されています:
...(後略)...
## 実施すべきアクション
1. 最優先: CloudTrailのデータイベント記録を見直し、必要最小限のバケットのみに制限する
2. OpenSearchクラスターの最適化:
• 使用状況を確認し、必要に応じてインスタンスタイプをダウングレード
• 古いインデックスを削除またはアーカイブするポリシーを実装
3. VPCリソースの整理:
• 未使用のElastic IPを解放
• 不要なVPCエンドポイントを削除
これらの対策を実施することで、月間コストを大幅に削減できる可能性があります。特にCloudTrailのデータイベント記録の最適化だけでも、xxx USD以上のコスト削減が見込めます。
こちらも興味深い。いろんなコマンド(Cost Explorer、CloudTrail)を段階的に駆使してデータを集め、結論を出してくれていることが分かる。
ちなみにここでは後述の/acceptallを設定して実行したので、全ての試行錯誤が自動実行された上で、結論に至っている。人間がやることは、指示(プロンプト)を出すこと、LLM Agentが好き勝手するリスクを受け入れること、あとは珈琲でも飲みながら待つことだけだ。
便利コマンド
1. LLM Agentに一任する
しばらく使っているといちいちyで承認するのがダルくなってくるのだが、/acceptall
とすると、都度確認することなく、Agentがプロンプトの指示を実行する上で「よかれと思った」こと全てが自動的に実行される。q chat -a
として開始しても同様の挙動になる。
とても便利なのだが、非決定論的かつファイルの読み書きも可能なLLM Agentに全てを一任することになるので、注意と覚悟は必要。何かしらガードレールを敷けるといいのだが、現状そのような機能はなさそうなので、暴走して欲しくないなら無効にしておくのが無難か。
2. シェルにエスケープ
!
でエスケープしてシェルコマンドを実行できる。
> !aws --version
aws-cli/2.25.6 Python/3.12.9 Darwin/24.3.0 source/arm64
3. 終了したいときは
終了したいときは/quit
と打てばOK。
ちなみにquit
とやってしまうと、プロンプト扱いになってしまう。
> /quit
~/Documents >
まとめ
アイデア次第でかなり使えそうに感じた。Agenticなコーディング支援アプローチとしてはCLINEが有名だが(試してないが、Q Developerにも同様の機能はある模様)、IDEの中でツールを駆使しながらごりごりコードを書いてくれるAgentとは、また違った趣がある。また、AWS CLIをツールとして使い倒してくれる点も便利で、コード書きだけでなく日常的な運用のお供にも使えるのではと思われる。
このスピードで進化していくとなると、1年後には本当にAgentic Workflowが業務のそこここに組み込まれている未来もあり得る。
おまけ
今回知ったのだが、Amazon Q Developer CLIの機能の中には、シェルコマンド生成(q translate
)やコマンド補完(q inline
)も含まれている。ただ、q doctor
で診断を実行して知ったのだが、q inline
は他のコマンド補完ツールとは共存できない模様。当たり前と言えば当たり前かも知れない。
自分はzsh-autosuggestionsを愛用しているので、q inline
はひとまず見送る予定。この手の便利ツールは今後軒並み生成AIに置き換わっていくのかも知れないが、気に入ってる道具は、使えるうちは使い続けたいなと。