You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:05:40