我正在尝试在云中创建一个使用 S3、Lambda 和 Rekognition 等的应用程序。
我现在遇到的问题是运行 Lambda 时出现以下错误:
An error occurred (InvalidS3ObjectException) when calling the SearchUsersByImage operation: Unable to get object metadata from S3. Check object key, region and/or access permissions.
我尝试谷歌搜索,并询问chatgpt,但它仍然不起作用。
这些服务位于同一区域 (eu-central-1),并使用 cloudformation (SAM) 创建。
我在 lambda 函数中添加了一个带有策略的角色,以便允许它与 S3 通信,但它仍然不起作用。这就是我的角色(我缩短了一点):
ProcessEmployeeImageExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: RekognitionSearchUserByImagePolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: rekognition:SearchUsersByImage
Resource: !GetAtt EmployeeCollection.Arn
- PolicyName: LambdaBasicExecutionPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- sqs:ChangeMessageVisibility
- sqs:ChangeMessageVisibilityBatch
- sqs:DeleteMessage
- sqs:DeleteMessageBatch
- sqs:GetQueueAttributes
- sqs:ReceiveMessage
Resource: !GetAtt ImagesQueue.Arn
- PolicyName: S3ReadPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: s3:GetObject
Resource: !GetAtt EmployeesArrivedImagesBucket.Arn
这就是我的 Lambda 资源的样子:
ProcessEmployeeImageFunction:
Type: AWS::Serverless::Function
Properties:
PackageType: Zip
CodeUri: process_employee_image/
Handler: app.lambda_handler
Runtime: python3.12
Architectures:
- x86_64
Role: !GetAtt ProcessEmployeeImageExecutionRole.Arn
查看 lambda 函数的仪表板时,它正确显示我的 lambda 可以与 S3 通信,但我仍然收到错误。
我还使用 AWS cli 来使用 Rekognition。使用 cli 一切正常,所以它与我上传的图像没有任何关系。
所以我认为这与我的 lambda 或我的 rekognition 集合不允许与我的 s3 存储桶对话有关?
有人知道如何解决这个问题吗?
遵循使用这些服务的 PAM 示例。事实上,它展示了这个用例:
React 应用程序 -> API 网关 -> Lambda 函数 -> 各种 AWS 服务。
参见:
浏览此示例,您将了解如何构建可以成功调用这些 AWS 服务的 LAMBDA 函数。您可以在此处的 AWS COde LIb 中找到此内容:
https://docs.aws.amazon.com/code-library/latest/ug/dynamodb_example_cross_PAM_section.html