创建 Amazon S3 事件通知以调用 Lambda 函数时,为什么会出现“Unable to validate the following destination configurations”(无法验证以下目标配置)错误?

上次更新时间:2021 年 12 月 9 日

当我尝试创建 Amazon Simple Storage Service (Amazon S3) 事件通知以调用 AWS Lambda 函数时,我收到以下错误:“Unable to validate the following destination configurations.Not authorized to invoke function”(无法验证以下目标配置。未获得调用函数的授权)为什么我会收到此错误,我该如何解决?

简短描述

如果您的 Amazon S3 存储桶没有调用 Lambda 函数所需的权限,则 Lambda 会返回以下错误:

“Unable to validate the following destination configurations.Not authorized to invoke function”(无法验证以下目标配置。未获得调用函数的授权)

注意:当您执行以下任一操作时,所需的权限将自动添加到函数的基于资源的策略中:

可能导致此错误的常见原因

  • Lambda 函数的基于资源的策略被删除或移除,并且已将更改保存到该函数的 Amazon S3 事件通知中。
  • S3 存储桶具有缺少所需权限的 Lambda 函数的事件通知,并且另一个事件通知保存在存储桶中。
  • 已通过以下任何方式添加新的 Amazon S3 事件通知,而函数的基于资源的策略没有所需的权限:
    AWS 开发工具包
    AWS 命令行参考 (AWS CLI)
    AWS CloudFormation 堆栈

注意:如果您已更新权限,但函数仍未调用,请参阅为什么我的 Amazon S3 事件通知不调用 Lambda 函数?

解决方法

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

执行以下任意一项操作。

重新创建事件通知

Amazon S3 控制台中删除事件通知。然后,再次添加通知

注意:在 Amazon S3 控制台中重新创建事件通知会将适当权限添加到 Lambda 函数的基于资源的策略中。

使用 AWS CLI 将所需权限添加到 Lambda 函数的基于资源的策略中

使用 Lambda AddPermission API 将所需调用权限添加到 Lambda 函数的基于资源的策略中。要提交更改,请运行以下 AWS CLI 命令:

重要提示:myLambdaFunction 替换为您的 Lambda 函数名称。将 S3StatementId 替换为将该语句从相同策略中其他语句区分开的唯一值。将 arn:aws:s3:::myS3Bucket 替换为 S3 存储桶的 Amazon Resource Name (ARN)。将 accountId 替换为您的 AWS 账户 ID

$ aws lambda add-permission --function-name myLambdaFunction --principal s3.amazonaws.com \
--statement-id S3StatementId --action "lambda:InvokeFunction" \
--source-arn arn:aws:s3:::myS3Bucket \
--source-account accountId