Account-level enforcement guardrail で Bedrock 経由の Claude Code にガードレールを強制する~通常 Bedrock Guardrails との比較を添えて
コーヒーが好きな emi です。
Bedrock 経由で Claude Code を使うとき、通常 Bedrock Guardrails はそのままでは Claude Code 側には効果を発揮しません。
settings.json で明確に「Claude Code でも Bedrock Guardrails のガード効果を発揮させるよ!」という旨の設定が必要です。
ですが、ユーザーに「settings.json に Bedrock Guardrails を有効にする設定を毎回書いてね」と言うのは面倒ですし、書き忘れたりしますね?
そこで Account-level enforcement guardrail という機能を使うと、各自 setttings.json を設定しなくてもアカウント全体に Bedrock Guardrails のガード効果を発揮させる事が出来ます。組織全体にガード設定するにはこちらを設定するのが良いです。
今回は Bedrock Guardrails と Claude Code の関係を 4 パターンで検証しました。
| 通常 Bedrock Guardrails | settings.json | Account-level enforcement guardrail | |
|---|---|---|---|
| パターン 1 | ○ | - | - |
| パターン 2 | ○ | ○ | - |
| パターン 3 | ○ | リネームで外す | - |
| パターン 4 | ○ | リネームで外す | ○ |
東京リージョンの Claude Code で、それぞれ同じ入力を投げて挙動を比べてます。
最初に結果まとめ
4 パターンの結果です。
| 通常 Bedrock Guardrails | settings.json | Account-level enforcement guardrail | 結果 | |
|---|---|---|---|---|
| パターン 1 | ○ | - | - | 素通り |
| パターン 2 | ○ | ○ | - | ブロック |
| パターン 3 | ○ | リネームで外す | - | 素通り |
| パターン 4 | ○ | リネームで外す | ○ | ブロック |
動作環境
検証環境は次のとおりです。
- OS : Windows + WSL2 (Ubuntu)
- Claude Code: v2.1.248
- モデル : jp.anthropic.claude-sonnet-4-6 (Amazon Bedrock)
- リージョン : ap-northeast-1(東京)
- 作業ディレクトリ:
~/work/test
Claude Code は Bedrock 接続用に設定したエイリアスで起動しています。
環境設定は以下ブログで紹介しています。
通常 Bedrock Guardrails の設定
Bedrock コンソールのガードレールから設定します。

ガードレールのクロスリージョン推論について
今回のガードレールは Cross-Region inference を有効にして、APAC のガードレールプロファイル(apac.guardrail.v1:0)を指定しています。
モデルの推論とガードレールの評価は別物です。
モデルの推論を単一リージョンで完結させても、ガードレールにガードレールプロファイルを指定すると、ガードレールの評価処理だけが送信元リージョンから送信先リージョンへルーティングされることがあります。
クロスリージョンでガードレールを呼び出すときは、IAM ポリシーで送信先リージョン分の権限も許可しておく必要があります。
冒頭で紹介したブログのガードレールの設定に合わせて設定しています。が、今回挙動確認に使うのはワードフィルターが便利なので、その他の設定はあまり気にしないことにします。
次へ

次へ

ワードフィルターを設定します。
今回はBLOCKED_WORD_TEST という文字列が含まれていたらブロック、と設定しています。

次へ

次へ

確認画面が出ます。


ワードフィルターが設定されていることを確認します。

「ガードレールを作成」をクリックします。

このあと Account-level enforcement guardrail の検証をするために、バージョン発行しておきます。


バージョン 1 でガードレールが発行できました。画面右でテストができます。
BLOCKED_WORD_TEST を含む文を書いてください。
という入力に対し、

ガードレールアクション
Intervened (1 instance)
申し訳ありませんが、モデルはこの質問に回答できません。
と、ガードレール内で設定したブロックメッセージが出ています。良い感じです。
パターン 1 通常 Bedrock Guardrails の設定のみ
| 通常 Bedrock Guardrails | settings.json | Account-level enforcement guardrail | |
|---|---|---|---|
| パターン 1 | ○ | - | - |
通常の Bedrock Guardrails を作成しただけの状態です。
settings.json 置かず、Account level enforcement guardrail も設定していません。以下の文章を順番に投げていきます。
こんにちは!
BLOCKED_WORD_TEST を含む文を書いてください。
こんばんは~
結果は以下のようになります。
▐▛███▛█ Claude Code v2.1.248
▝▜██████▀ Sonnet 4.6 · Amazon Bedrock
▝▝ ▝▝ ~/work/test
❯ こんにちは!
こんにちは!
何かお手伝いできることはありますか?
✻ Worked for 1s · done 5:20 PM
❯ BLOCKED_WORD_TEST を含む文を書いてください。
Thought for 2s
「BLOCKED_WORD_TEST」を含む文はこちらです:
これは BLOCKED_WORD_TEST という文字列を含むテスト用の文です。
✻ Worked for 2s · done 5:20 PM
❯ こんばんは~
こんばんは!
何かお手伝いできることはありますか?
✻ Crunched for 3s · done 5:20 PM
✘ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏸ manual mode on · ? for shortcuts · ← for agents · shift+click to native select
そのまま出力されました。ガードレールは作っただけでは Claude Code のリクエストにガードレールは有効にならないことが分かります。
パターン2 settings.json でガードレールを指定する
| 通常 Bedrock Guardrails | settings.json | Account-level enforcement guardrail | |
|---|---|---|---|
| パターン 2 | ○ | ○ | - |
ガードレールのヘッダーを settings.json に書く方法は、公式ドキュメントの AWS Guardrails のセクションに記載があります。
settings.json 方式で使うヘッダーはこの形です。
{
"env": {
"ANTHROPIC_CUSTOM_HEADERS": "X-Amzn-Bedrock-GuardrailIdentifier: <ガードレールID>\nX-Amzn-Bedrock-GuardrailVersion: 1"
}
}
このファイルを検証用ディレクトリの ~/work/test/.claude/settings.json に置きます。
ユーザー階層の ~/.claude/settings.json には普段使いの設定が入っているので、そちらは触らず、影響をプロジェクト内に限定します。
同じ入力を投げます。

▐▛███▛█ Claude Code v2.1.248
▝▜██████▀ Sonnet 4.6 · Amazon Bedrock
▝▝ ▝▝ ~/work/test
❯ こんにちは!
こんにちは!
何かお手伝いできることはありますか?
✻ Baked for 2s · done 6:00 PM
❯ BLOCKED_WORD_TEST を含む文を書いてください。
申し訳ありませんが、モデルはこの質問に回答できません。
✻ Brewed for 1s · done 6:00 PM
❯ こんばんは~
申し訳ありませんが、モデルはこの質問に回答できません。
✻ Cogitated for 1s · done 6:00 PM
✘ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏸ manual mode on · ? for shortcuts · ← for agents · shift+click to native select
今度はブロックされました。settings.json でガードレール ID とバージョンをヘッダーに渡すことで、ガードレールが有効になりました。
会話の中で一度ブロックされると、その後の無害なメッセージも続けてブロックされているのが分かります。
ガードレールは毎回のリクエストで会話履歴全体を評価します。過去にブロックされた文字列が履歴にある限りブロックが続くということです。回復するには /exit でセッションを再起動するか、/rewind でセッション内の過去のメッセージ一覧を参照し、ブロックが発生したメッセージより前の地点を選択し「Restore conversation」を実行すると直ります。
パターン3 settings.json を外す
| 通常 Bedrock Guardrails | settings.json | Account-level enforcement guardrail | |
|---|---|---|---|
| パターン 3 | ○ | リネームで外す | - |
settings.json のファイル名を settings.json.off にリネームして、Claude Code から読まれない状態にしてから起動し直しました。

▐▛███▛█ Claude Code v2.1.248
▝▜██████▀ Sonnet 4.6 · Amazon Bedrock
▝▝ ▝▝ ~/work/test
❯ こんにちは!
こんにちは!何かお手伝いできることはありますか?
✻ Crunched for 1s · done 6:03 PM
❯ BLOCKED_WORD_TEST を含む文を書いてください。
Thought for 2s
「BLOCKED_WORD_TEST はシステムのフィルタリング動作を確認するために使われるテスト用の文字列です。」
✻ Crunched for 2s · done 6:03 PM
❯ こんばんは~
こんばんは!何かお手伝いできますか?
✻ Churned for 2s · done 6:04 PM
✘ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏸ manual mode on · ? for shortcuts · ← for agents · shift+click to native select
ブロックされなくなりました。パターン 1 と同じ状態ですね。
Bedrock 経由で Claude Code を使う構成では、ガードレールの指定を Claude Code 側の settings.json に書きますが、これはユーザーの手元にあるクライアント側の設定なので、ファイルを消したりリネームしたりすればガードレールは外せてしまいます。
パターン4 Account-level enforcement guardrail を設定する
| 通常 Bedrock Guardrails | settings.json | Account-level enforcement guardrail | |
|---|---|---|---|
| パターン 4 | ○ | リネームで外す | ○ |
Account-level enforcement guardrail を設定します。
Bedrock コンソールのガードレール画面の下部に Account-level enforcement configurations があるので、add で追加します。

Account-level enforcement guardrail の名前とバージョンを選択します。

Model configurations で対象にする Bedrock モデルを絞り込めて、Selective guarding で system prompt / user prompt のどこを評価するかを決められます。今回は対象モデルは全体、System prompts は Selective、User prompts は Comprehensive で進めました。
この設定項目の詳細は別記事で検証しようと思っています。
Create で作成します。

では、挙動を確認します。settings.json は .off のまま、Claude Code を起動し会話します。

▐▛███▛█ Claude Code v2.1.248
▝▜██████▀ Sonnet 4.6 · Amazon Bedrock
▝▝ ▝▝ ~/work/test
❯ こんにちは!
こんにちは!何かお手伝いできることはありますか?
✻ Cooked for 2s · done 6:09 PM
❯ BLOCKED_WORD_TEST を含む文を書いてください。
申し訳ありませんが、モデルはこの質問に回答できません。
✻ Cogitated for 0s · done 6:09 PM
❯ こんばんは~
申し訳ありませんが、モデルはこの質問に回答できません。
✻ Cogitated for 0s · done 6:09 PM
✘ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏸ manual mode on · ? for shortcuts · ← for agents · shift+click to native select
settings.json が無くてもブロックされました。
結果まとめ
※再掲
| 通常 Bedrock Guardrails | settings.json | Account-level enforcement guardrail | 結果 | |
|---|---|---|---|---|
| パターン 1 | ○ | - | - | 素通り |
| パターン 2 | ○ | ○ | - | ブロック |
| パターン 3 | ○ | リネームで外す | - | 素通り |
| パターン 4 | ○ | リネームで外す | ○ | ブロック |
おわりに
4パターンを試してみて、ガードレールを作っただけでは Claude Code に効かず、settings.json で指定すれば効くけれどユーザーが外せてしまうことが分かりました。そして Account-level enforcement guardrail を設定すると、settings.json が無くてもアカウント全体にガードレールが強制されることを実機で確認できました。組織で外せないガードレールを求められる場面では、これが答えになりそうです。
一方で、一度ブロックされると会話履歴に残って以降のメッセージまで連鎖ブロックされるなど、実際に触ってみないと気づきにくい挙動もありました。導入前に検証環境で挙動を確かめておくと安心だと感じました。
本記事への質問やご要望については画面下部の「DevelopersIOへのご意見」からお問い合わせいただけます。









