基础数据自动化与S3访问点
我正在处理Bedrock数据自动化,希望通过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函数,尝试调用BDA项目
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"
}
})
使用这段代码(我知道它并不完整),我遇到了一个错误:
发生错误 (AccessDeniedException):在调用InvokeDataAutomationAsync操作时:访问被拒绝。请检查S3 URI与读写权限。
我尝试通过S3访问点读取该文件,结果可以读取。因此我推断问题出在函数上
invoke_data_automation_async()
有没有人尝试过用S3访问点来调用BDA?带有S3访问点别名的URI能工作吗?还是可能因为BDA无法定位该URI而导致访问被拒绝?
解决方案
BDA不会在 s3Uri 字段中解析S3访问点别名。当BDA处理你的请求时,它的内部服务角色直接使用你提供的URI访问S3,并且它期望的是实际的桶名,而不是访问点别名。
你的Lambda能通过该访问点读取,是因为 你的 角色能够解析该别名。BDA的服务角色不能。
在调用BDA时,请使用实际的桶名:
s3_input_uri = "s3://data-bucket/bda-input/file.pdf"
s3_output_uri = "s3://data-bucket/bda-out/"
The AccessDeniedException 的说法具有误导性。据我所知,这只是解析失败,而不是权限问题。
这是在许多接受 s3:// URI的 AWS服务(如SageMaker、Textract异步、Transcribe等)中常见的坑;跨服务的S3 URI对访问点别名/ARN的支持不一致。请通过对BDA执行角色的IAM策略来控制访问。