Amazon web services 无法为AWS中的Lambda函数设置S3触发器

Amazon web services 无法为AWS中的Lambda函数设置S3触发器,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我一直在互联网上寻找解决方案。我一直在尝试设置一个AWS Lambda函数,以便在每次将文件上传到特定的S3存储桶时向SNS发送消息。此时,我已经完成了函数设置,并且可以成功地调用它。但是,当我尝试将函数连接到S3时,我收到一个错误,说明调用PutBucketNotification操作时发生错误(InvalidArgument):无法验证以下目标配置。根据,我应该能够添加允许S3调用Lambda函数的权限,如下所示: aws lambda add-permission \ --func

我一直在互联网上寻找解决方案。我一直在尝试设置一个AWS Lambda函数,以便在每次将文件上传到特定的S3存储桶时向SNS发送消息。此时,我已经完成了函数设置,并且可以成功地调用它。但是,当我尝试将函数连接到S3时,我收到一个错误,说明调用PutBucketNotification操作时发生错误(InvalidArgument):无法验证以下目标配置。根据,我应该能够添加允许S3调用Lambda函数的权限,如下所示:

aws lambda add-permission \
    --function-name my-file-upload \
    --principal s3.amazonaws.com \
    --statement-id AcceptFromImport \
    --action "lambda:InvokeFunction" \
    --source-arn arn:aws:s3:::file-import \
    --source-account my_account_id
我这样做了,并注意到与Lambda函数相关联的策略已更新,似乎是正确的。但是,错误仍然存在。我看过一个类似的问题,但这里没有一个解决方案有效

执行角色ARN:
ARN:aws:iam::我的账户\u id:Role/lambda上传流

执行角色(lambda上载流)信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
执行角色策略(我的文件上载):

Lambda函数ARN:
ARN:aws:Lambda:ap-northeast-1:my_账户\u id:function:my文件上传

Lambda函数角色文档

{
  "roleName": "lambda-upload-stream",
  "policies": [
    {
      "name": "my-file-upload",
      "id": "AWS_ACCESS_KEY_ID",
      "type": "managed",
      "arn": "arn:aws:iam::my_account_id:policy/my-file-upload",
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Sid": "AccessObject",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::file-import/*"
          },
          {
            "Sid": "SendUpdate",
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:ap-northeast-1:my_account_id:comm-in"
          }
        ]
      }
    }
  ],
  "resources": {
    "s3": {
      "service": {
        "name": "Amazon S3",
        "icon": "data:image/svg+xml;base64,very_long_base64_string1"
      },
      "statements": [
        {
          "resource": "arn:aws:s3:::file-import/*",
          "service": "s3",
          "effect": "Allow",
          "action": "s3:GetObject",
          "source": {
            "index": "AccessObject",
            "policyName": "my-file-upload",
            "policyType": "managed"
          }
        }
      ]
    },
    "sns": {
      "service": {
        "name": "Amazon SNS",
        "icon": "data:image/svg+xml;base64,very_long_base64_string2"
      },
      "statements": [
        {
          "resource": "arn:aws:sns:ap-northeast-1:my_account_id:comm-in",
          "service": "sns",
          "effect": "Allow",
          "action": "sns:Publish",
          "source": {
            "index": "SendUpdate",
            "policyName": "my-file-upload",
            "policyType": "managed"
          }
        }
      ]
    }
  },
  "trustedEntities": [
    "lambda.amazonaws.com"
  ]
}
Lambda函数资源策略:

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:ap-northeast-1:my_account_id:function:my-file-upload",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "my_account_id"
        },
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:s3:::file-import"
        }
      }
    }
  ]
}

我的问题是:我在这里做错了什么?我如何修复它?

您需要创建的东西被称为“基于资源的策略”,是由aws lambda add permission创建的

基于资源的策略授予S3调用lambda的权限。这是lambda本身的属性,不属于lambda的IAM角色(lambda的IAM角色控制lambda可以做什么,基于资源的策略控制谁可以对lambda做什么。您可以在aws控制台的UI中查看此资源,方法是转到lambda,单击“权限”并向下滚动到“基于资源的策略”。您要注意的关键字是
lambda:InvokeFunction
,它允许其他事物调用您的lambda,包括其他AWS帐户和您帐户上的其他AWS服务(如s3)

也就是说,您运行的命令应该已经创建了此策略。您是否确保在运行该命令时用您的实际帐户id替换
my\u account\u id


此外,请确保将
--source arn arn:aws:s3:::file import
替换为bucket的实际arn(我假设您必须使用不同的名称创建一个bucket,因为s3 bucket必须具有全局唯一的名称,
file import
几乎肯定已经使用了)

我发现了问题所在。我最初的命令是:

aws s3api put-bucket-notification --bucket azure-erp-import \
    --notification-configuration "CloudFunctionConfiguration={Id=file-uploaded,Events=[],Event=s3:ObjectCreated:*,CloudFunction=arn:aws:lambda:ap-northeast-1:my_account_id:function:my-file-upload,InvocationRole=arn:aws:iam::my_account_id:role/lambda-upload-stream}"

此操作失败,因为
arn:aws:iam::my_account\u id:role/lambda upload stream
角色无权调用lambda函数上的
lambda:invokeffunction
。删除此值修复了错误。

为什么有三个角色?这三个角色用于三个不同的函数?什么是“角色文档”"?它来自何处?它的IAM角色或策略无效。@在AWS控制台上查找Lambda函数时,我得到的是角色文档中的Marcin,转到权限并单击
角色文档
啊,对不起,我忘了将其包含在问题中。它确实存在。至于您的其他部分,是的,我使用我的帐户ID a运行了添加权限S3 bucket的实际ARN。嗯,这很奇怪,我觉得文档看起来很好。我认为当您从自己的帐户使用S3 bucket时,“account equals”条件可能是不必要的。我想下一步将是再次检查您是否无意中在我的某个地方为您的bucket/function/account id留下了占位符字符串n因为我在资源策略中省略了lambda ARN中可能的版本或别名,所以您会对这些命令产生反感吗?
aws s3api put-bucket-notification --bucket azure-erp-import \
    --notification-configuration "CloudFunctionConfiguration={Id=file-uploaded,Events=[],Event=s3:ObjectCreated:*,CloudFunction=arn:aws:lambda:ap-northeast-1:my_account_id:function:my-file-upload,InvocationRole=arn:aws:iam::my_account_id:role/lambda-upload-stream}"