尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【Bug已解决】AWS Bedrock Agent Access Denied with Claude 3 解决方案

【Bug已解决】AWS Bedrock Agent Access Denied with Claude 3 解决方案 【Bug已解决】AWS Bedrock Agent Access Denied with Claude 3 解决方案一、现象长什么样你在 AWS Bedrock 上创建/运行一个 Agent用 Claude 3 模型遇到Access Denied访问被拒绝或 Agent 调用模型时报AccessDeniedException/is not authorized to perform: bedrock:InvokeModel你的 IAM 用户能直接InvokeModel但 Agent 跑起来就 Access DeniedAgent 的执行角色execution role是你容易忽略的一环报错指向的是 Agent 背后的角色不是你登录的 IAM 用户模型访问Model Access明明已批准仍被拒。一句话Bedrock Agent 在运行时用的是它自己的执行角色execution role而不是你当前登录的 IAM 身份。Access Denied 几乎总是这个执行角色缺少bedrock:InvokeModel或bedrock:InvokeModelWithResponseStream权限或该角色未被授权使用对应的 Claude 3 模型。二、背景Bedrock Agent 的权限模型有两层你的 IAM 身份用来创建/管理 Agent需要bedrock:CreateAgent等Agent 的执行角色execution roleAgent 实际调用模型、读写知识库、调工具时用的就是这个角色。它需要bedrock:InvokeModel及流式版权限且Resource覆盖你用的 Claude 3 模型 ARN若该模型需要推理配置见 923角色还要能调用对应 profile跨服务如调用 Lambda 工具、读 S3 知识库的相应权限。很多人只给自己 IAM 用户加权限忘了 Agent 的执行角色——结果我能调Agent 不能调报 Access Denied。三、根因根因是Agent 执行角色缺少调用模型的权限Agent 运行 - 用 execution role 调 Claude 3 - role 没有 bedrock:InvokeModel on 该模型 ARN - AccessDeniedException修复方向找到 Agent 的执行角色给它加bedrock:InvokeModel*Resource 指向模型 ARN或*视安全策略。四、最小可运行复现下面用 IAM 策略思路演示执行角色需含 InvokeModel{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [ bedrock:InvokeModel, bedrock:InvokeModelWithResponseStream ], Resource: arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0 } ] }若角色策略里没有这段Agent 调用该模型即 Access Denied。注意 Resource 要匹配你实际用的模型 ARN 区域与 ID。from dataclasses import dataclass from typing import List dataclass class _AgentRoleCheck: allowed_actions: List[str] allowed_resources: List[str] def can_invoke(self, model_arn: str) - bool: has_action bedrock:InvokeModel in self.allowed_actions has_resource any(model_arn r or r * for r in self.allowed_resources) return has_action and has_resource def main(): # 错误执行角色只有其他权限没有 InvokeModel bad _AgentRoleCheck(allowed_actions[s3:GetObject], allowed_resources[*]) print(bad.can_invoke(arn:...:anthropic.claude-3-5-sonnet-20241022-v2:0)) # False - Denied # 正确 good _AgentRoleCheck( allowed_actions[bedrock:InvokeModel, bedrock:InvokeModelWithResponseStream], allowed_resources[arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0], ) print(good.can_invoke(arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0)) # True五、解决方案第一层最小直接修复最小修复是给 Agent 的执行角色加bedrock:InvokeModel权限打开 Bedrock 控制台 → Agents → 你的 Agent → 找到Execution role ARN到 IAM → Roles → 该角色 → 添加内联策略{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [bedrock:InvokeModel, bedrock:InvokeModelWithResponseStream], Resource: arn:aws:bedrock:*:*:foundation-model/anthropic.claude-3-* } ] }确保 Bedrock 控制台的Model Access里 Claude 3 已批准模型访问是你账户级执行角色权限是角色级两者都要若用推理配置见 923Resource 要覆盖对应 profile ARN。六、解决方案第二层结构化改进把Agent 执行角色权限校验做成策略创建/改角色前自检from dataclasses import dataclass, field from typing import List dataclass(frozenTrue) class BedrockAgentAccessPolicy: Bedrock Agent 权限策略确保执行角色能调模型。 规则 - 执行角色必须含 bedrock:InvokeModel(Stream) - Resource 必须覆盖所用模型 ARN或 * - 与账户级 Model Access 是两层都要满足 required_actions: tuple ( bedrock:InvokeModel, bedrock:InvokeModelWithResponseStream ) def diagnose(self, *, role_actions: List[str], role_resources: List[str], model_arn: str) - List[str]: problems [] for act in self.required_actions: if act not in role_actions: problems.append(f执行角色缺少 {act}) ok_res any(model_arn r or r * for r in role_resources) if not ok_res: problems.append(f执行角色 Resource 未覆盖模型 {model_arn}) return problems def is_ready(self, **kw) - bool: return not self.diagnose(**kw) def demo() - None: policy BedrockAgentAccessPolicy() print(policy.diagnose( role_actions[bedrock:InvokeModel], role_resources[arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0], model_arnarn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-5-sonnet-20241022-v2:0)) # [] - 就绪 if __name__ __main__: demo()七、解决方案第三层断言 / CI 守护import pytest from your_module import BedrockAgentAccessPolicy def test_missing_action_detected(): policy BedrockAgentAccessPolicy() problems policy.diagnose( role_actions[s3:GetObject], role_resources[*], model_arnarn:x) assert any(InvokeModel in p for p in problems) def test_missing_resource_detected(): policy BedrockAgentAccessPolicy() problems policy.diagnose( role_actions[bedrock:InvokeModel], role_resources[arn:other], model_arnarn:target) assert any(Resource in p for p in problems) def test_ready_ok(): policy BedrockAgentAccessPolicy() assert policy.is_ready( role_actions[bedrock:InvokeModel, bedrock:InvokeModelWithResponseStream], role_resources[arn:target], model_arnarn:target) def test_wildcard_resource_ok(): policy BedrockAgentAccessPolicy() assert policy.is_ready( role_actions[bedrock:InvokeModel, bedrock:InvokeModelWithResponseStream], role_resources[*], model_arnarn:target) def test_stream_action_also_required(): policy BedrockAgentAccessPolicy() problems policy.diagnose( role_actions[bedrock:InvokeModel], # 缺 stream 版 role_resources[*], model_arnx) assert any(InvokeModelWithResponseStream in p for p in problems) def test_policy_frozen(): policy BedrockAgentAccessPolicy() assert bedrock:InvokeModel in policy.required_actionsCI 在部署 Agent 前跑diagnose断言执行角色权限齐备避免运行时 Access Denied。八、排查清单是否只给自己的 IAM 用户加权限忘了 Agent 的执行角色Agent 用角色调模型。执行角色是否含bedrock:InvokeModel和bedrock:InvokeModelWithResponseStreamResource 是否覆盖所用的 Claude 3 模型 ARN或*账户级 Model Access 里 Claude 3 是否已批准角色权限和模型访问是两层。是否用了推理配置923角色 Resource 要覆盖 profile ARN。Agent 是否还调 Lambda/ S3/ KB这些也需要角色相应权限。九、小结Bedrock Agent 用 Claude 3 报 Access Denied根因是 Agent 的执行角色缺少bedrock:InvokeModel权限或 Resource 未覆盖模型 ARN而不是你登录的 IAM 身份——Agent 运行时用的是它自己的角色。最小修复是给执行角色加bedrock:InvokeModel(Stream)且 Resource 覆盖模型 ARN并确保账户级 Model Access 已批准结构化做法是抽成BedrockAgentAccessPolicy自检最后用 pytest 守护执行角色权限齐备避免运行时被拒。
返回列表