CDKでアプリケーション推論プロファイルを作成しClineで利用する
はじめに
ClineやClaude CodeをBedrockを使って組織で使う際に、組織やチーム、個人に以下のようなニーズがあります。
- 権限の付与
- リクエストの使用状況の把握
- 使用料金の把握
このニーズのアプローチとしてアプリケーション推論プロファイルを使う方法があります。
- 1 つのリージョンのアプリケーション推論プロファイルを作成するには、基盤モデルを指定します。そのモデルでそのリージョンに対して行われたリクエストの使用状況とコストが追跡されます。
- 複数のリージョンのアプリケーション推論プロファイルを作成するには、クロスリージョン (システム定義) 推論プロファイルを指定します。推論プロファイルは、選択したクロスリージョン (システム定義) 推論プロファイルで定義されたリージョンにリクエストをルーティングします。推論プロファイルのリージョンに対して行われたリクエストの使用状況とコストが追跡されます。
今回はこちらをチーム、ユーザーがいる想定でCDKでリソースを構築しようと思います。
ただこの管理方法でもいくつか課題はあり、AWS様よりLiteLLM Proxyを使った手法も紹介されています。今回はこちらの方法に関しては触れません。
前提
CDKで実装するリソースは以下です。
- IAMユーザー
- 上記のアクセスキーを格納するシークレットマネージャー
- アプリケーション推論プロファイル
IAMユーザーの権限設定はこちらの記事を参考に作成しました。
コスト分配タグを使ったユーザー毎のコストの確認も行いたいと思います。
BedrockでClaudeモデルの有効化
Claudeモデルの有効化をします。今回はClaude Sonnet 4を使います。アプリケーション推論プロファイルには、クロスリージョンプロファイルを紐づける予定です。以下の資料を確認し、Claudeモデルを有効化するリージョンを確認します。
以上より、以下のBedrockのSonnet 4モデルを有効化します。
- us-east-1(バージニア北部)
- us-east-2(オハイオ)
- us-west-2(オレゴン)
オレゴンから有効化します。(マネジメントコンソールのどこかわからない場合、こちらを参考にしてください。)
オレゴンでの有効化が確認できました。
同じような手順でus-east-2(オハイオ)とus-east-1(バージニア北部)も適用してください。
us-east-2(オハイオ)の有効化
us-east-1(バージニア北部)の有効化
CDK実装
リポジトリはこちらです。不明点がありましたらこちらをご参照ください。
ライブラリは以下を利用します。アプリケーション推論プロファイルは、@cdklabs/generative-ai-cdk-constructs
を利用します。
タグは仮でteam, name, emailを定義します。
CDKで作成するリソースは以下の通りです。
- クロスリージョンプロファイル
- アプリケーション推論プロファイル
- IAMユーザー
- シークレットマネージャーのシークレット(作成したIAMユーザーのアクセスキー、シークレットキーを格納)
デプロイ
export AWS_REGION="us-west-2"
# AWSからデプロイ権限取得(aws-vaultなど)
# CDK利用が初回の場合は必要なコマンド
npx cdk bootstrap
npx cdk deploy
作成されたリソースの確認
アプリケーション推論プロファイルが作成されていることを確認します。
aws bedrock list-inference-profiles \
--region 'us-west-2' \
--type-equals 'APPLICATION' \
--no-cli-pager
{
"inferenceProfileSummaries": [
{
"inferenceProfileName": "sonnet4-asgard-baldur",
"createdAt": "2025-05-24T23:50:07.396192+00:00",
"updatedAt": "2025-05-24T23:50:07.396192+00:00",
"inferenceProfileArn": "arn:aws:bedrock:us-west-2:111111111111:application-inference-profile/g3ys3rof2rl2",
"models": [
{
"modelArn": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0"
},
{
"modelArn": "arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0"
(中略)
アプリケーション推論プロファイルが、6ユーザー分作成されていることが分かります。
$ aws bedrock list-inference-profiles \
--region 'us-west-2' \
--type-equals 'APPLICATION' \
--no-cli-pager | jq '.inferenceProfileSummaries | length'
6
タグがついているリソースは以下のコマンドで確認できます。olympusチームとasgardチームにそれぞれ3つずつアプリケーションプロファイルが設定されていることがわかります。簡易ではありますが、アプリケーション推論プロファイルにもタグが正しく設定されていそうです。
$ aws resourcegroupstaggingapi get-resources \
--tag-filters Key=team,Values=olympus \
--no-cli-pager | jq '.ResourceTagMappingList | length'
3
$ aws resourcegroupstaggingapi get-resources \
--tag-filters Key=team,Values=asgard \
--no-cli-pager | jq '.ResourceTagMappingList | length'
3
Clineの動作確認
シークレットマネージャーにクレデンシャルが生成されているので確認し、AWSのプロファイル設定を実施します。
AWSのプロファイル設定をします。今回はAWS CLIの平文管理のものを紹介します。必要に応じてaws-vaultなどを利用し、セキュアストレージにクレデンシャルを格納するようにしてください。
今回は検証用にzeusとfreyjaのプロファイルをそれぞれ作ります。
[zeus]
aws_access_key_id=<アクセスキー>
aws_secret_access_key=<シークレットキー>
[freyja]
aws_access_key_id=<アクセスキー>
aws_secret_access_key=<シークレットキー>
[profile zeus]
region=us-west-2
output=json
source_profile=zeus
[profile freyja]
region=us-west-2
output=json
source_profile=freyja
次にユーザーに紐づいているアプリケーション推論プロファイルを確認します。arn:aws:bedrock:us-west-2:111111111111:application-inference-profile/<id>
のARNを控えます。
Clineの設定
バージョンはv3.17.5
を利用します。
以下のように設定をします。ポイントはカスタムモデルを指定し、先ほど控えたアプリケーション推論プロファイルのARNを直接指定することです。
動作の確認が取れました。
おまけ(Claude Code)
Claude CodeとSonnet 4の場合は以下の429エラーになりました。これはSonnet v4に特有だと推測しています。(3.7では動作を確認しています revision)
export AWS_REGION="us-west-2"
export AWS_PROFILE="zeus"
export CLAUDE_CODE_USE_BEDROCK=1
export ANTHROPIC_MODEL="arn:aws:bedrock:us-west-2:111111111111:application-inference-profile/z7e2p7z54pcz"
claude
❯ claude "クエリ"
╭────────────────────────────────────────────────────────────╮
│ ✻ Welcome to Claude Code! │
│ │
│ /help for help, /status for your current setup │
│ │
│ cwd: /Users/shuntaka/repos/github.com/shuntaka9576/hoge │
│ │
│ ──────────────────────────────────────────────────────── │
│ │
│ Overrides (via env): │
│ │
│ • Model: arn:aws:bedrock:us-west-2:111111111111:applicat │
│ ion-inference-profile/z7e2p7z54pcz │
│ • Prompt caching: off │
╰────────────────────────────────────────────────────────────╯
※ Tip: Use /memory to view and manage Claude memory
> クエリ
⎿ API Error (429 Too many tokens, please wait before trying again.) · Retrying in 1 seconds… (attempt 1/10)
⎿ API Error (429 Too many tokens, please wait before trying again.) · Retrying in 1 seconds… (attempt 2/10)
✢ Thinking… (3s · ↑ 0 tokens · esc to interrupt)
(中略)
サービスクォータは以下です、↑の例はトークンは少ないはずなので、違和感があります。(Clineは動作していますし。。)
issueも切られていたので、おそらく本体側のバグと予想しています。Claude CodeとBedrock Sonnet 4で動作した方がいれば、情報頂けると嬉しいです。(Claude Codeはクローズドソースで、npm上も難読化処理がされているため)
コスト分配タグの確認
さいごに
LiteLLM Proxyを使った手法も試してみたいですね!