
IAM ユーザーなしで Claude Code on Bedrock を使いたい!Cognito 認証ヘルパーを自作してみた
はじめに
Claude Code を Amazon Bedrock 経由で使う際、認証の仕組みにはいくつかの選択肢があります。
IAMユーザーを用意するパターンが最も簡単に利用できますが、開発者ごとに IAM ユーザーを作らずに既存の IdP の認証情報で Claude Code を使ってみたくなりました。
本記事は、Claude Code on Bedrock の認証パターンを整理した上で、その中の1パターンを試してみた記録となります。
Claude Code on Bedrock の認証パターンを整理する
Claude Code が Bedrock を利用する際の認証は、2 つの独立した軸で構成されます。
軸1: クレデンシャルの供給方式
Claude Code に AWS クレデンシャルを渡す方法です。
| 方式 | 仕組み | 認証ヘルパーが渡す情報 | ~/.aws/ 干渉 |
aws CLI 統合 |
|---|---|---|---|---|
| 直接設定 | 環境変数や ~/.aws/ に事前配置 |
(ヘルパー不使用。事前配置済みのクレデンシャル) | 場合による | 強い |
| awsAuthRefresh | credential-process → ~/.aws/config 経由 |
AWS 一時クレデンシャル(credential_process プロトコル形式の JSON) | あり | 強い |
| awsCredentialExport | 実行可能ファイルの stdout → Claude Code が直接受け取る | AWS 一時クレデンシャル(Credentials オブジェクト形式の JSON) |
なし | 弱い |
軸2: ユーザー管理・クレデンシャル取得方式
ユーザーをどう管理し、AWS クレデンシャルをどう取得するかです。
| 方式 | ユーザー管理 | セッション時間 | CloudTrail でのユーザー特定 |
|---|---|---|---|
| 開発者用 IAM | IAM ユーザー / SSO | IAM 設定次第 | 直接的 |
| 外部 IdP + Identity Pool | 外部 IdP | 1 時間固定 | 間接的 |
| 外部 IdP + IAM OIDC Federation | 外部 IdP | 最大 12 時間 | 直接的 |
全パターンのマトリクス
| 開発者用 IAM | 外部IdP + Identity Pool | 外部IdP + IAM OIDC Federation | |
|---|---|---|---|
| 直接設定 | パターン1 | (実用的でない) | (実用的でない) |
| awsAuthRefresh | パターン2 | パターン3 | パターン4 ← AWS Guidance |
| awsCredExport | パターン5 | パターン6 ← 今回実装&解説 | パターン7 ← 今回実装 |
パターン 1 は最もシンプルで、CLAUDE_CODE_USE_BEDROCK=1 と有効な AWS クレデンシャルがあれば動きます。AWS_PROFILE=<profile-name> claude (またはCLIのデフォルトプロファイルが有効な状態での claude ) や aws-vault exec <profile-name> -- claude がこれに該当します。
パターン 6(awsCredentialExport + Identity Pool) を実装し、本記事で解説します。
パターン 7(awsCredentialExport + IAM OIDC Federation) も比較のため実装しました。本記事では扱いませんが、後述の公開リポジトリで確認することができます。
パターン 4 は AWS が提供するパッケージ化されたソリューションです。
これらの機能を持つ認証ヘルパーの生成から、CloudFormation による AWS リソース構築、S3 経由の配布までを一括で提供しています。
awsAuthRefresh と awsCredentialExport の違い
外部 IdP を使う場合、どちらの供給方式でも「認証ヘルパー」と呼ばれる実行可能ファイルが必要です。
| 項目 | awsAuthRefresh | awsCredentialExport |
|---|---|---|
| クレデンシャルの流れ | credential-process(認証ヘルパーを呼び出し) → ~/.aws/ → AWS SDK |
認証ヘルパー → stdout → Claude Code |
~/.aws/ への書き込み |
あり | なし |
aws CLI との統合 |
同じプロファイルで利用可能 | Claude Code 専用 |
| Claude Code 固有か | いいえ(AWS SDK 標準) | はい |
~/.aws/ に触れたくない場合は awsCredentialExport、aws CLI と同じクレデンシャルを共有したい場合は awsAuthRefresh を選びます。
認証ヘルパーに必要な機能
実装言語に縛りはありません(シェルスクリプト、Go、Rust 等何でも可)。
| 機能 | 説明 |
|---|---|
| ユーザー認証 | IdP に対して認証し、ID Token を取得 |
| クレデンシャル取得 | ID Token → AWS 一時クレデンシャル |
| リフレッシュトークン管理 | 安全な場所に保存・自動更新 |
| クレデンシャル出力 | 各方式に応じた形式で出力 |
やってみた: awsCredentialExport + Identity Pool
今回作ったもの
Cognito ユーザー認証を経由して Claude Code on Bedrock を利用する環境一式です。
コードはこちらで公開しています。
リンク先はパターン6の Identity Pool パターンです。
パターン7の IAM OIDC Federation パターンも同一リポジトリ内にあります。
作成する AWS リソース
| # | リソース | 用途 |
|---|---|---|
| 1 | Cognito User Pool | ユーザー管理・認証 |
| 2 | Cognito User Pool ドメイン | Hosted UI(ブラウザログイン画面) |
| 3 | Cognito User Pool Client | OAuth 2.0 code フロー(パブリッククライアント + PKCE) |
| 4 | Cognito Identity Pool | ID Token → AWS 一時クレデンシャル変換 |
| 5 | IAM ロール | Bedrock の InvokeModel 権限 |
セキュリティ設計
| 情報 | 保存場所 | 平文ファイルへの書き出し |
|---|---|---|
| リフレッシュトークン(30 日有効) | macOS Keychain | しない |
| AWS 一時クレデンシャル(1 時間有効) | メモリのみ | しない |
| Cognito Client ID 等 | env.sh | する(秘密情報ではない) |
- IdP のトークンは Keychain(macOS)に保存する方式とした
- Linux(Secret Service), Windows(Credential Manager) にも同等の機能があるので、スクリプトを使い分けることでトークンの平文をストレージ上に保存する必要はない
- パブリッククライアント + PKCE (S256) を採用。Client Secret は不要
- AWS リソースの接続情報などを配布する際に秘密情報を含めたくなかったので、パブリッククライアントに変更した
管理者: セットアップ
前述の「作成する AWS リソース」に記載の AWS リソース群を作成し、Cognito に初期ユーザーを作成します。
export ADMIN_AWS_PROFILE=your-profile
cd claudecode-on-aws-poc/id-pool/admin
# 5 つの AWS リソースを一括作成
# env.sh(環境情報を記載)ファイルを作成
./setup
# ユーザー追加(Cognito から招待メールが送信される)
./add-user user@example.com
ユーザー: ログインから Claude Code 起動まで
1. Claude Code の設定
ユーザー全体設定ファイル(~/.claude/settings.json)、またはBedrock を利用したいプロジェクトの .claude/settings.json に設定します。
{
"env": {
"CLAUDE_CODE_USE_BEDROCK": "1",
"AWS_REGION": "ap-northeast-1"
},
"awsCredentialExport": "/path/to/claudecode-on-aws-poc/id-pool/bedrock-login"
}
2. ログイン
cd claudecode-on-aws-poc/id-pool
bedrock-login
ブラウザが開き、Cognito のログイン画面が表示されます。初回は仮パスワードでログインし、パスワード変更を求められます。
このとき、ローカル上にリダイレクト専用のローカル HTTP サーバーが立ち上がり、ログイン完了後のリダイレクトの待受を行います。
認証が完了すると Cognito のログイン画面からローカル HTTP サーバにリダイレクトがかかり、リフレッシュトークンが macOS Keychain に保存されます。
3. Claude Code 起動
claude
Claude Code が起動し、awsCredentialExport 経由で bedrock-login が呼び出され、Bedrock に接続されます。
4. ログアウト
cd claudecode-on-aws-poc/id-pool
bedrock-logout
Keychain のトークンをクリアし、ブラウザの Cognito セッションもログアウトします。
ハマったところ
試してみた中でトラブルとなったものをまとめました。
1. awsCredentialExport 失敗時のフォールバック
症状: awsCredentialExport がエラー終了(exit 1)してもClaude Code が動作し続ける。ログアウトしても使えてしまう。
原因: Claude Code は awsCredentialExport が失敗すると、AWS SDK 標準のクレデンシャルチェーン(~/.aws/sso/cache/ 等)にフォールバックします。
対策: Keychain にログアウトフラグを設定し、bedrock-login 内でフラグ検出時にエラー終了させる仕組みを実装しました。環境変数で AWS_PROFILE="" や AWS_CONFIG_FILE=/dev/null を設定しても SSO キャッシュが使われたため、フラグ方式に落ち着きました。
2. AWS CLI のページャーによる SIGPIPE
症状: スクリプトが終了コード 141 (SIGPIPE) で即座に終了。
対策: export AWS_PAGER="" をスクリプト冒頭に追加。(AWS CLI をシェルスクリプト内で利用する場合の一般的な対策)
3. Cognito ドメインのグローバル一意性
Cognito Hosted UI にはドメインが必要ですが、デフォルトのドメインプレフィックスは amazoncognito.com のサブドメインを全 AWS ユーザーで共有するため、グローバルに一意でなければなりません。
4. Claude Code 内での aws CLI 利用時の注意
awsCredentialExport で取得したクレデンシャルは Claude Code が Bedrock API を呼び出す際に使われますが、Claude Code 内で実行される aws CLI 等の子プロセスには渡されません。aws CLI はデフォルトのクレデンシャルチェーン(~/.aws/ の設定やプロファイル等)を参照します。
一方、 Bedrock 呼び出しのために settings.json 内で AWS_REGION 環境変数を設定している場合、その内容が aws CLI に渡されます。
Claude Code 内で aws CLI を呼び出す場合は、--profile と --region を明示的に指定してください。
認証方式の選び方
外部 IdP を使う 4 パターン
| 特性 | awsAuthRefresh + IdP | awsAuthRefresh + OIDC Fed. | awsCredExport + IdP | awsCredExport + OIDC Fed. |
|---|---|---|---|---|
| セッション時間 | 1 時間 | 最大 12 時間 | 1 時間 | 最大 12 時間 |
| CloudTrail でのユーザー特定 | 間接的 | 直接的 | 間接的 | 直接的 |
| ロールマッピング | 対応 | コード実装 | 対応 | コード実装 |
~/.aws/ 干渉 |
あり | あり | なし | なし |
| aws CLI 統合 | 強い | 強い | 弱い | 弱い |
選定ガイド
| ユースケース | 推奨 |
|---|---|
| 大規模組織、配布自動化、aws CLI 統合が必要 | awsAuthRefresh + IAM OIDC Federation(AWS Guidance) |
小〜中規模チーム、監査・長セッション重視、~/.aws/ 非干渉 |
awsCredentialExport + IAM OIDC Federation |
| PoC / 最短で動かしたい | awsCredentialExport + Identity Pool(今回の構成) |
| グループベースのアクセス制御が必要 | Identity Pool 系(ロールマッピング対応) |
まとめ
Claude Code on Bedrock の認証は「供給方式」×「クレデンシャル取得方式」の 2 軸で整理できます。本記事では awsCredentialExport + Cognito Identity Pool の構成で認証ヘルパーを自作し、以下を実現しました。
- IAM ユーザーを作らずに Cognito ユーザーだけで Bedrock を利用
~/.aws/に一切触れない構成- リフレッシュトークンは Keychain、AWS クレデンシャルはメモリのみ(平文ファイルに書かない)
- パブリッククライアント + PKCE でセキュアな認証









