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

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策略

  • AmazonRekognitionReadOnlyAccess
  • AmazonS3FullAccess
  • AWSLambdaBasicExecutionRole

错误信息

图片分析出错: 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:43:11