View a markdown version of this page

政策條件 - Amazon Bedrock AgentCore

政策條件

條件使用 whenunless子句將精細邏輯新增至政策:

when { principal.hasTag("username") && principal.getTag("username") == "refund-agent" && context.input.amount < 500 }

條件類型

  • when { …​ } - 政策僅在條件為 true 時才適用

  • unless { …​ } - 政策僅適用於條件為 false 的情況

  • when guardrails { …​ } - 只有在一或多個護欄的輸出上宣告的條件評估為 true 時 (政策) 才適用

  • unless guardrails { …​ } - 政策僅適用於在一或多個護欄的輸出上宣告的條件評估為 false (false) 的情況

工具引數

context.input 包含傳遞給工具呼叫的引數:

context.input.amount < 500

當使用者呼叫 RefundTool___process_refund時,引數如下:

{ "orderId": "12345", "amount": 450, "reason": "Defective product" }

政策可以存取這些值:

  • context.input.orderId → "12345"

  • context.input.amount → 450

  • context.input.reason →「瑕疵產品」

政策可以根據特定工具呼叫參數做出決策。

主體屬性

主體屬性會根據為 AgentCore Gateway 設定的身分驗證類型而有所不同。

OAuth 宣告 (標籤)

對於 OAuth 驗證的閘道,來自 OAuth 字符的 JWT 宣告會儲存為 OAuthUser 實體上的標籤。JWT 宣告範例:

{ "sub": "user-123", "username": "refund-agent", "scope": "refund:write admin:read", "role": "admin" }

這些宣告會成為委託人實體上的標籤。檢查標籤是否存在:

principal.hasTag("username")

取得標籤值:

principal.getTag("username") == "refund-agent"

模式比對:

principal.getTag("scope") like "*refund:write*"

IAM 實體屬性

對於 IAM 驗證的閘道,委託人具有包含發起人的 IAM ARN 的id屬性。IAM 主體不支援標籤。

主體實體格式

IAM 驗證閘道的 Cedar 主體為 AgentCore::IamEntityprincipal.id 屬性包含發起人的 IAM ARN。

對於透過擔任的 IAM 角色進行身分驗證的呼叫者, principal.id和 Cedar 實體 ID 使用 格式:

arn:aws:sts::<account-id>:assumed-role/<role-name>

例如,如果發起人擔任角色 MyServiceRole,則 Cedar 實體 ID 為:

AgentCore::IamEntity::"arn:aws:sts::123456789012:assumed-role/MyServiceRole"

此格式在調用之間是穩定的,因此您可以使用 principal == 進行確切的角色比對。

模式與 相符 like

您也可以使用 like運算子搭配萬用字元進行更廣泛的比對:

// Match any role in a specific account principal.id like "arn:aws:sts::123456789012:assumed-role/*" // Match specific AWS account (any ARN format) principal.id like "*:123456789012:*" // Match a specific IAM role name across any account principal.id like "arn:aws:sts::*:assumed-role/AdminRole"

邏輯運算子

使用邏輯運算子結合多個條件:

  • && - AND (所有條件都必須為 true)

  • || - OR (至少一個條件必須為 true)

  • ! - NOT (否定條件)

範例:

principal.hasTag("username") && // User must have username tag principal.getTag("username") == "refund-agent" && // Username must be "refund-agent" context.input.amount < 500 // Amount must be less than $500