Lambda调用Rekognition DetectLabels遇AccessDeniedException求助
问题排查:Lambda调用Rekognition DetectLabels时权限拒绝错误
场景描述
上传图片至第一个S3 Bucket后触发Lambda函数,Lambda调用Amazon Rekognition分析图片标签并将结果存储到第二个S3 Bucket,但CloudWatch日志显示调用DetectLabels操作时出现权限拒绝错误,第二个Bucket无输出内容。使用AWS根用户操作,Lambda关联的IAM角色已附加AmazonRekognitionReadOnlyAccess、AmazonS3FullAccess、AWSLambdaBasicExecutionRole三个策略,策略模拟器显示Lambda被允许调用DetectLabels接口。
Lambda代码
import boto3 import json def lambda_handler(event, context): # 从S3事件中提取存储桶和对象键 source_bucket = event['Records'][0]['s3']['bucket']['name'] source_key = event['Records'][0]['s3']['object']['key'] # 创建Amazon Rekognition客户端 rekognition_client = boto3.client('rekognition') # 为Rekognition指定源S3对象 image_source = {'S3Object': {'Bucket': source_bucket, 'Name': source_key}} try: # 检测图片中的标签 response = rekognition_client.detect_labels(Image=image_source) # 从响应中提取标签 labels = [{'Name': label['Name'], 'Confidence': label['Confidence']} for label in response['Labels']] # 指定用于存储分析结果的目标S3 Bucket destination_bucket = 'bucket2-lambda-rekognition-100-ca-central1-26nov23' destination_key = f'rekognition-analysis/{source_key.split("/")[-1]}' # 将分析结果以JSON格式保存到目标S3 Bucket s3_client = boto3.client('s3') s3_client.put_object( Bucket=destination_bucket, Key=destination_key, Body=json.dumps(labels), ContentType='application/json' ) print(f"图片分析完成。分析结果已保存至 {destination_bucket}/{destination_key}") return { 'statusCode': 200, 'body': '图片分析及结果存储已成功完成。' } except Exception as e: print(f"图片分析出错: {e}") return { 'statusCode': 500, 'body': '图片分析及结果存储失败。' }
附加的IAM策略
AmazonRekognitionReadOnlyAccessAmazonS3FullAccessAWSLambdaBasicExecutionRole
错误信息
图片分析出错: 调用DetectLabels操作时发生错误(AccessDeniedException):
排查建议
- 检查源S3 Bucket的桶策略:确认是否允许Rekognition服务读取桶内对象。即使Lambda有S3权限,Bucket本身的策略可能拒绝Rekognition访问。需添加允许
rekognition.amazonaws.com执行s3:GetObject的桶策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rekognition.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的源Bucket名称/*" } ] } - 验证Lambda角色的信任关系:确保信任策略允许Lambda服务扮演该角色,信任策略需包含:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } - 检查源对象的权限与状态:确认源图片未开启对象锁、版本控制导致无法读取,或上传时设置的私有权限未授权Rekognition访问。
- 对齐Rekognition与S3区域:若源Bucket位于
ca-central-1,需确保Rekognition客户端指定同区域创建,避免跨区域访问权限问题:rekognition_client = boto3.client('rekognition', region_name='ca-central-1') - 查看完整CloudWatch日志:AccessDeniedException通常会附带详细原因(如缺少具体权限),需提取完整错误信息定位问题。
- 确认策略权限范围:检查
AmazonRekognitionReadOnlyAccess策略是否包含rekognition:DetectLabels权限,该策略默认允许所有Rekognition只读操作,包括DetectLabels。
内容的提问来源于stack exchange,提问作者ALIMUL HASAN
相关产品推荐
相关产品推荐

