
Kiro CLI 2.0 のヘッドレスモードを試してみた — API キー認証でエージェントを非対話実行
2026/4/13、Kiro CLI 2.0 がリリースされました。
主な新機能は以下の 3 つです。
- ヘッドレスモード — CI/CD パイプラインやスクリプトから非対話的に実行
- Windows サポート — Windows 11 でネイティブに動作
- ターミナル UI(TUI)の GA — リッチな表示とサブエージェント監視
本記事では、Kiro Pro ライセンスを IAM Identity Center(SSO)で利用する環境において、ヘッドレスモードのセットアップから実行までを紹介します。
ヘッドレスモードとは
Kiro CLI 2.0 で追加されたヘッドレスモードは、API キーで認証し、--no-interactive フラグでプロンプトを渡すことで、インタラクティブなターミナルセッションなしに Kiro を実行する機能です。
従来の課題
これまで Kiro CLI の認証にはブラウザでのインタラクティブなサインイン(kiro-cli login)が必須でした。EC2 上の Jenkins のように永続的な実行環境であれば、事前にログインしてセッションを維持することで --no-interactive の利用は可能でしたが、以下のような環境では Kiro の利用が困難でした。
- AWS CodeBuild(CodePipeline から起動される一時的なコンテナ環境)
- AWS Lambda(サーバーレス実行環境)
- AWS Step Functions(ワークフロー内のタスク実行)
- GitHub Actions(ジョブごとに使い捨てのランナー環境)
これらの環境ではブラウザを開けず、セッションを事前に維持する手段もないため、Kiro を CI/CD パイプラインに組み込むことが実質的にできませんでした。
API キーによる解決
ヘッドレスモードでは、Kiro ポータルで発行した API キーを環境変数 KIRO_API_KEY にセットするだけで認証が完了します。ブラウザ認証は不要で、セッション切れの心配もありません。これにより、上記のようなエフェメラルな実行環境でも Kiro を CI/CD パイプラインに組み込めるようになりました。
前提条件
本記事では以下の環境を前提としています。
- 認証方式: AWS IAM Identity Center(SSO)経由での Kiro 利用
- 課金: Kiro 利用費は AWS 利用費に含まれる(AWS 請求統合)
- サブスクリプション: Kiro Pro / Pro+ / Power(API キー認証はこれらのプランで利用可能)
- 管理者設定: Kiro Console で API Keys の生成が有効化されていること
検証環境
| 項目 | 値 |
|---|---|
| OS | macOS (Darwin) |
| Kiro CLI | 2.0.0 |
| 認証方式 | IAM Identity Center(SSO) |
| サブスクリプション | Kiro Pro |
| リージョン | us-east-1 |
手順 1: 管理者設定 — API Keys の有効化
IAM Identity Center の管理者アカウントで AWS マネジメントコンソールの Kiro 設定画面 を開き、API キーの生成を有効化します。
- AWS マネジメントコンソールにサインイン
- Kiro の Settings 画面を開く
- 下部の Kiro タブを選択
- Kiro settings セクションの API keys を On に切り替え

手順 2: API キーの生成
管理者が API Keys の生成を許可したら、ユーザーは API キーの作成が可能になります。特別な IAM 権限は不要で、Kiro アプリに紐づけられたユーザーであれば作成できます。
2-1. Kiro ポータルにサインイン
app.kiro.dev にアクセスし、「Your organization」を選択します。

2-2. IAM Identity Center の情報を入力
Start URL と Region を入力して「Continue」をクリックします。

2-3. SSO でサインイン
IAM Identity Center のサインイン画面でユーザー名とパスワードを入力します。

2-4. API Keys セクションを開く
サインイン後、Account ページの API Keys セクションを展開します。

2-5. キーを作成
Key name に識別しやすい名前を入力し、「Create key」をクリックします。

2-6. キーをコピー
生成された API キー(ksk_ で始まる文字列)をコピーします。

手順 3: ヘッドレスモードの基本実行
API キーを環境変数にセットし、--no-interactive フラグでプロンプトを渡します。
$ export KIRO_API_KEY=ksk_************************************
$ touch hoge
$ kiro-cli chat --no-interactive --trust-all-tools "List files in current directory"
All tools are now trusted (!). Kiro will execute tools without asking for confirmation.
Agents can sometimes do unexpected things so understand the risks.
Learn more at https://kiro.dev/docs/cli/chat/security/#using-tools-trust-all-safely
Reading directory: /Users/your-username/work/project (using tool: read, max depth: 0, max entries: 1000, excluding: defaults)
✓ Successfully read directory /Users/your-username/work/project (1 entries)
- Completed in 0.0s
> There's just one file in the current directory:
- hoge (empty file, 0 bytes)
▸ Credits: 0.05 • Time: 6s
API キー認証でツールの実行(ディレクトリ読み取り)まで正常に動作しました。
手順 4: セキュリティレビューの実行
ヘッドレスモードの実用的なユースケースとして、コードのセキュリティレビューを試してみました。
脆弱なサンプルコードの準備
意図的に脆弱性を含むコードを用意しました。
mkdir -p sample-app && cat > sample-app/app.py << 'EOF'
import os
import subprocess
def get_user_data(user_id):
query = "SELECT * FROM users WHERE id = " + user_id
result = subprocess.call("echo " + query, shell=True)
password = "admin123"
api_key = "AKIAIOSFODNN7EXAMPLE"
return result
def process_file(filename):
f = open(filename, "r")
data = f.read()
return data
# TODO: Add input validation
# TODO: Implement proper error handling
# FIXME: This function is too slow
def calculate(x, y):
return x / y
EOF
モデルの選択
ヘッドレスモードでは /model コマンドが使えないため、事前に settings でモデルを指定します。
# モデルを設定
$ kiro-cli settings chat.defaultModel claude-opus-4.6
# 設定を確認
$ kiro-cli settings chat.defaultModel
claude-opus-4.6 (global)
Claude Opus 4.6 でのセキュリティレビュー
--trust-tools=read,grep で読み取り権限のみを付与し、ファイルの変更が行われないようにしています。
$ kiro-cli chat --no-interactive --trust-tools=read,grep \
"sample-app/app.py のセキュリティ脆弱性をレビューしてください。各問題について重大度(Critical/High/Medium/Low)と修正方法を日本語で一覧にしてください。"
> まずファイルの内容を確認します。
Reading file: /Users/your-username/work/project/sample-app/app.py, all lines (using tool: read)
✓ Successfully read 487 bytes from /Users/your-username/work/project/sample-app/app.py
- Completed in 0.0s
> 以下がセキュリティレビューの結果です。
### セキュリティ脆弱性一覧
| # | 脆弱性 | 重大度 | 該当行 | 説明 |
|---|--------|--------|--------|------|
| 1 | SQLインジェクション | Critical | L5 | user_id を文字列結合でクエリに埋め込んでおり、任意のSQL文を実行される危険がある |
| 2 | OSコマンドインジェクション | Critical | L6 | subprocess.call(..., shell=True) にユーザー入力を直接渡しており、任意のコマンドを実行される |
| 3 | ハードコードされたパスワード | High | L7 | password = "admin123" がソースコードに平文で埋め込まれている |
| 4 | ハードコードされたAPIキー | High | L8 | AWSアクセスキーがソースコードに平文で埋め込まれている。リポジトリ経由で漏洩するリスクが高い |
| 5 | ファイルリソースの未クローズ | Medium | L12 | open() の戻り値を close() せず、with 文も使っていないためリソースリークが発生する |
| 6 | パストラバーサル | Medium | L11-13 | filename を検証せずに open() しており、../../etc/passwd 等で任意ファイルを読み取られる |
| 7 | ゼロ除算 | Low | L19 | y が 0 の場合に ZeroDivisionError が発生する。入力バリデーションもエラーハンドリングもない |
### 修正方法
1. SQLインジェクション — パラメータ化クエリ(プレースホルダ)を使う。
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
2. OSコマンドインジェクション — shell=True を使わず、引数をリストで渡す。
そもそもこの echo 呼び出し自体が不要なら削除する。
subprocess.call(["echo", query], shell=False)
3. ハードコードされたパスワード — 環境変数やシークレットマネージャから取得する。
password = os.environ["APP_PASSWORD"]
4. ハードコードされたAPIキー — 同様に環境変数やAWS Secrets Manager等から取得する。
api_key = os.environ["AWS_ACCESS_KEY_ID"]
5. ファイルリソースの未クローズ — with 文を使う。
with open(filename, "r") as f:
data = f.read()
6. パストラバーサル — ファイルパスを正規化し、許可ディレクトリ内かを検証する。
safe_dir = "/allowed/path"
real = os.path.realpath(filename)
if not real.startswith(safe_dir):
raise ValueError("不正なファイルパス")
7. ゼロ除算 — 入力を検証してからの除算、またはエラーハンドリングを追加する。
def calculate(x, y):
if y == 0:
raise ValueError("除数に0は指定できません")
return x / y
▸ Credits: 0.39 • Time: 22s
7 件の脆弱性が検出され、各項目に該当行と修正コード付きで提示されました。
DeepSeek 3.2 での比較
同じプロンプトを DeepSeek 3.2 で実行し、モデルによる違いを確認しました。
$ kiro-cli settings chat.defaultModel deepseek-3.2
$ kiro-cli chat --no-interactive --trust-tools=read,grep \
"sample-app/app.py のセキュリティ脆弱性をレビューしてください。各問題について重大度(Critical/High/Medium/Low)と修正方法を日本語で一覧にしてください。"
> sample-app/app.py の内容を確認しました。以下のセキュリティ脆弱性を確認しました:
| 脆弱性 | 重大度 | 修正方法 |
|---------|--------|----------|
| SQLインジェクション | Critical | パラメータ化クエリの使用 |
| シェルコマンドインジェクション | Critical | シェルコマンドの使用を避ける |
| ハードコード認証情報 | High | 環境変数/シークレットマネージャー |
| ファイル操作 | Medium | パス検証と正規化 |
| 例外処理 | Medium | 適切なエラーハンドリング |
| ログ記録 | Low | セキュリティログの実装 |
▸ Credits: 0.13 • Time: 21s
モデル比較
| Claude Opus 4.6 | DeepSeek 3.2 | |
|---|---|---|
| 検出数 | 7 件 | 6 件(重複あり、実質 8 件) |
| 出力の精度 | 行番号付きで正確 | 一部重複検出あり |
| 修正コード | 各項目に具体的なコード例 | 概要レベルの説明 |
| クレジット消費 | 0.39 | 0.13 |
| 実行時間 | 22 秒 | 21 秒 |
Opus 4.6 は行番号の特定や修正コードの具体性で優れていますが、クレジット消費は約 3 倍です。DeepSeek 3.2 は主要な脆弱性を検出しつつコストを抑えられるため、CI/CD で頻繁に実行するケースではコスト効率の良い選択肢になります。
まとめ
Kiro CLI 2.0 のヘッドレスモードを IAM Identity Center(SSO)環境でセットアップし、API キーの生成から実行までを検証しました。
従来はブラウザ認証が必須だったため、CodeBuild や Lambda、Step Functions、GitHub Actions のようなエフェメラルな実行環境では Kiro の利用が困難でした。ヘッドレスモードの API キー認証により、これらの環境でも Kiro を CI/CD パイプラインに組み込めるようになりました。
セキュリティに関する注意
- IAM ロールの最小権限化:
--trust-all-tools指定時、Kiro はawsCLI を含む任意のコマンドを実行できます。実行環境の IAM ロール権限がそのまま Kiro の操作範囲になるため、ジョブに必要な最小限の権限のみ付与してください - ツール許可の最小化: CI/CD では
--trust-all-toolsではなく--trust-tools=read,grepのように、なるべく必要なカテゴリのみ許可した利用をおすすめします - シークレット管理: API キーは各プラットフォームのシークレット管理機能(Secrets Manager、Repository secrets 等)に保存し、ソースコードへの直接記載は避けてください
- 定期的なローテーション: 不要になったキーは Kiro ポータル で速やかに失効させてください









