调用TranscriptFileUri获取转录文件时遭遇403权限拒绝问题
问题详情
架构流程:React Native 客户端 → AWS API Gateway → AWS Lambda 函数 → AWS S3 → AWS Transcribe → AWS S3
当前状态:
- Lambda 可成功上传音频文件至S3存储桶、启动转录任务
- 能手动访问S3中的转录文件
- 通过
TranscriptFileUri获取转录JSON文件时收到403响应
转录文件所在S3存储桶的CORS配置:
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "PUT" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [ "ETag" ] } ]
Lambda函数相关代码:
response = client.start_transcription_job( TranscriptionJobName=jobName, LanguageCode='en-US', MediaFormat='mp4', Media={ 'MediaFileUri': s3Path }, OutputBucketName = 'my-transcription-bucket', OutputKey = str(user_id) + '/' ) while True: result = client.get_transcription_job(TranscriptionJobName=jobName) if result['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']: break time.sleep(5) if result['TranscriptionJob']['TranscriptionJobStatus'] == "COMPLETED": data = result['TranscriptionJob']['Transcript']['TranscriptFileUri'] data = requests.get(data) print(data)
Cloudwatch日志输出:<Response [403]>
解决办法
1. 给Lambda执行角色添加S3读取权限
Lambda执行角色需要拥有访问转录输出桶的GetObject权限,给角色附加以下IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-transcription-bucket/*" } ] }
2. 改用boto3直接读取S3对象
不要通过requests.get请求TranscriptFileUri,改用AWS SDK(boto3)直接从S3获取转录文件,避免URL权限问题:
import boto3 # 初始化S3客户端 s3_client = boto3.client('s3') # ... 原有转录任务代码保持不变 ... if result['TranscriptionJob']['TranscriptionJobStatus'] == "COMPLETED": # 构造输出文件的S3键(Transcribe会在指定的OutputKey后拼接任务名+后缀) output_key = f"{user_id}/{jobName}.json" # 从S3获取文件内容 s3_response = s3_client.get_object(Bucket='my-transcription-bucket', Key=output_key) transcript_content = s3_response['Body'].read().decode('utf-8') print(transcript_content)
3. 检查S3桶策略
确认转录输出桶的桶策略没有阻止Lambda执行角色的访问,确保策略中包含允许该角色执行GetObject操作的规则。
注意:CORS配置不影响Lambda的服务器端请求,无需调整。
内容的提问来源于stack exchange,提问作者Kronax
相关产品推荐
相关产品推荐

