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 { …​ }-只有条件为真时,政策才适用

  • unless { …​ }-政策仅在条件为假时适用

  • when guardrails { …​ }-只有在一个或多个护栏的输出上声明的条件评估为真时,政策才适用

  • unless guardrails { …​ }-只有在一个或多个护栏的输出中断言的条件评估为 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 网关配置的身份验证类型,主体属性会有所不同。

OAuth 声明(标签)

对于 OAuth-authenticated 网关,来自 OAuth 令牌的 JWT 声明将作为标签存储在实体上。 OAuthUser 智威汤逊声明示例:

{ "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-authenticated 网关,委托人有一个包含调用方的 IAM ARN 的id属性。IAM 委托人不支持标签。

主体格式

IAM-authenticated 网关的 Cedar 主体是AgentCore::IamEntity。该principal.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 ==的角色匹配。

与 lik e 匹配的图案

您也可以使用带通配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(所有条件都必须为真)

  • ||-OR(至少有一个条件必须为真)

  • !-不是(否定条件)

示例:

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