使用S3访问点调用Bedrock Data Automation遇权限拒绝问题求助
问题:使用S3访问点调用Bedrock Data Automation时出现AccessDeniedException
我正在使用Bedrock Data Automation,希望通过S3访问点访问数据:
- 文件存储在S3桶
data-bucket中,路径为bda-input/file.pdf - 已为该桶创建S3访问点
my-data-bucket-ap,策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListViaAccessPoint", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789:role/bda-role" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:us-east-1:123456789:accesspoint/my-data-bucket-ap", "arn:aws:s3:us-east-1:123456789:accesspoint/my-data-bucket-ap/object/*" ] } ] }
- 访问点别名为
my-data-bucket-ap-wdfeg-s3alias - 角色
arn:aws:iam::123456789:role/bda-role拥有完全访问权限,且与Bedrock、SageMaker、Lambda、S3建立了信任关系 - 桶策略允许账号内所有角色通过S3访问点访问
通过Lambda调用Bedrock Data Automation项目的代码如下:
import os import time import json import boto3 from pathlib import Path from urllib.parse import urlparse AWS_REGION = os.environ["AWS_REGION"] s3 = boto3.client('s3') bda = boto3.client("bedrock-data-automation-runtime", region_name=AWS_REGION) def lambda_handler(event, context): s3_uri = "s3://my-data-bucket-ap-wdfeg-s3alias/bda-input/file.pdf" s3_output_uri = "s3://my-data-bucket-ap-wdfeg-s3alias/bda-out/" DATA_AUTOMATION_PROJECT_ARN = "" profile_arn="" resp = bda.invoke_data_automation_async({ "inputConfiguration": {"s3Uri": s3_input_uri}, "outputConfiguration": {"s3Uri": s3_output_uri}, "dataAutomationConfiguration": { "dataAutomationProjectArn": project_arn, "stage": "LIVE" } })
执行代码时出现错误:
An error occurred (AccessDeniedException) when calling the InvokeDataAutomationAsync operation: Access Denied. Check S3 URIs and read/write permissions.
我已验证通过S3访问点读取文件正常,因此推测问题出在invoke_data_automation_async函数上。想请教:
- 是否有人尝试过通过S3访问点调用Bedrock Data Automation?
- 使用S3访问点别名的S3 URI是否有效?
- 是否因Bedrock无法定位URI导致权限拒绝?
解决方案
1. 修正S3访问点URI格式
Bedrock Data Automation目前不支持直接使用访问点别名的S3 URI格式(s3://访问点别名/路径),需要改用访问点ARN标准URI格式:
s3://arn:aws:s3:<区域>:<账号ID>:accesspoint/<访问点名称>/<文件路径>
对应你的场景,输入和输出URI应修改为:
s3_input_uri = "s3://arn:aws:s3:us-east-1:123456789:accesspoint/my-data-bucket-ap/bda-input/file.pdf" s3_output_uri = "s3://arn:aws:s3:us-east-1:123456789:accesspoint/my-data-bucket-ap/bda-out/"
2. 修复代码中的变量错误
你的代码存在两处变量不匹配问题,可能引发隐性错误:
- 定义了
s3_uri但调用时用了未定义的s3_input_uri,需改为"s3Uri": s3_input_uri(先统一变量名) - 定义了
DATA_AUTOMATION_PROJECT_ARN但调用时用了project_arn,需统一变量名并补充实际ARN
修正后的核心代码片段:
def lambda_handler(event, context): s3_input_uri = "s3://arn:aws:s3:us-east-1:123456789:accesspoint/my-data-bucket-ap/bda-input/file.pdf" s3_output_uri = "s3://arn:aws:s3:us-east-1:123456789:accesspoint/my-data-bucket-ap/bda-out/" project_arn = "你的Bedrock Data Automation项目ARN" resp = bda.invoke_data_automation_async({ "inputConfiguration": {"s3Uri": s3_input_uri}, "outputConfiguration": {"s3Uri": s3_output_uri}, "dataAutomationConfiguration": { "dataAutomationProjectArn": project_arn, "stage": "LIVE" } })
3. 确认Bedrock的权限传递
即使Lambda角色有访问权限,Bedrock服务执行时需要能继承角色的S3访问点权限:
- 检查
bda-role的信任策略,确保包含Bedrock服务主体:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": ["bedrock.amazonaws.com", "lambda.amazonaws.com"] }, "Action": "sts:AssumeRole" } ] } - 确认访问点策略的
Resource范围已覆盖输入输出路径(当前策略的object/*已满足,无需修改)
内容的提问来源于stack exchange,提问作者vll1990
相关产品推荐
相关产品推荐

