NTTテクノクロス株式会社の渡邉です。
自分の環境でClineが失敗するパターンを見るとCLI実行、特にAWS CLIで引っかかることが多いのに気づいたため、解析した結果をシェアします。
表題の件
Cline経由でAWS CLIを使うと、結果の取得が失敗することがある。この状況を再現させやすいプロンプトは、例えばこう。
AWS東京リージョンの SecurityGroupをAWS CLIで調べて危険な設定のものを一覧にして
このプロンプトを元にClineはSecurityGroupを参照するコマンドをCLIで実行するのだが、結果が取得できない。
aws ec2 describe-security-groups --region ap-northeast-1
{
"SecurityGroups": [
{
"GroupId": "sg-01234567890",
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"UserIdGroupPairs": [],
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
:
ターミナルを見ると「:」でどうやら止まっていることがわかる。@terminal
メンションを使って伝えようとするも、コマンド実行中の扱いとなり、結果をうまく取得できない。
原因
これはPager(ページ分割)が働いてlessで開かれているからだ。AWS CLI v2からは原則、Client-sideのPagerとして、lessコマンドがデフォルトとなっている。
AWS CLI version 2 provides the use of a client-side pager program for output. By default, this feature returns all output through your operating system’s default pager program.
https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-pagination.html#cli-usage-pagination-clientside
ちなみにAWS CLIのページング処理には下の2つが存在し、ここで問題になるのは後者である。
- サービス側ページネーション抑止用の
--no-paginate
- クライアント側 Pager 抑止用の
--no-cli-pager
OSのPAGER
環境変数を設定していれば別だが、特に何も設定してない時はAWS CLI 側で出力先を別のスクリーンに切り替えて出力する。そのため、ClineからVS CodeのTerminalを取得するAPIを叩いてもうまくいかずに、画面が空であると誤認してしまう。
解決方法
こだわりがなければ、Clineの動く環境全体でAWS CLIのPagerを無効化する設定を入れればよい。解法はいくつかある。
# 1. コマンド単位でのPager無効化
aws ec2 describe-security-groups --no-cli-pager
# 2. プロファイル単位でのPager無効化
aws configure set cli_pager ''
# 3. セッション単位で無効化
export AWS_PAGER=""
Clineでの実用的な話をすると、3. セッション単位での無効化
を参考に、Cline向けのルールファイル.clinerules
へ、例えばこのように書けばよい。
## rule
- AWS CLIを使う時は必ず`export AWS_PAGER=""`を適用する。
別解
AWS CLIに関してはこれで十分なのだが、そもそもターミナルへの標準出力を経由しなければPager対応は考えなくてよい。要は中間ファイルに吐かせて読む。AWS CLIに限らずCLI出力の処理で困る度に独自のワークアラウンドを探すのは大変だし、これをルール化するのも一案だろう。
## rule
- データ参照用にCLIを使う時は、必ず取得結果を`tmp/`に格納する。
まとめ
簡潔にまとめると2行になってしまいました。これだけ覚えて帰ってください。
- AWS CLIの出力が取得できないならPager設定を調整する
- 複数のCLIツールが標準出力でハマるなら、中間ファイルを挟む動きにする