当前位置: 首页 > 知识库问答 >
问题:

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

葛炜
2023-03-14

我在网上到处找解决办法。根据本教程,我一直在尝试设置一个AWS Lambda函数,以便在每次将文件上传到特定的S3 bucket时向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::my_account_id:Role/lambda-upload-stream

执行角色(lambda-upload-stream)信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

执行角色策略(my-file-upload):

{
    "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"
        }
    ]
}

Lambda函数arn:arn:aws:Lambda:ap-northeast-1:my_account_id:function:my-file-upload

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"
        }
      }
    }
  ]
}

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

共有2个答案

文自怡
2023-03-14

我弄明白问题出在哪里了。我最初的命令是:

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_id:role/lambda-upload-stream角色没有权限对lambda函数调用lambda:invokefunction。删除此值修复了错误。

卢鸿彩
2023-03-14

您需要创建的东西称为“基于资源的策略”,它应该由AWS lambda add-permission创建。

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

话虽如此,您运行的命令应该已经创建了此策略。运行该命令时,是否确保将my_account_id替换为实际帐户id?

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

 类似资料:
  • 我正在使用AWS Lambda函数(用python编写)在对象上传到预设S3 bucket时发送电子邮件。该对象通过AWS PHP SDK上传到S3 bucket中,并使用多部分上传。每当我测试我的代码(在Lambda代码编辑器页面中)时,它似乎工作得很好,我只收到一封电子邮件。 但是当对象通过PHPSDK上传时,Lambda函数运行两次并发送两封电子邮件,两者都具有不同的消息ID。我尝试了不同的

  • 我可以从AWS SDK创建lambda函数: 但是我如何指定这个函数应该在S3上传时触发呢?

  • 问题内容: 我在AWS中有一个Node 4.3 Lambda函数。我希望能够将文本文件写入S3,并阅读了许多有关如何与S3集成的教程。但是,所有这些都涉及在写入S3之后如何调用Lambda函数。 如何使用节点从Lambda在S3中创建文本文件?这可能吗?亚马逊的文件似乎没有涵盖它。 问题答案: 是的,绝对有可能! 通过选择或更新执行lambda的IAM角色,确保为Lambda函数提供对目标s3存储

  • 我正在尝试使用AWS Lambda/S3构建一个服务,该服务将用户电子邮件作为输入,并输出带有PDF附件的响应电子邮件。我发送给用户的最终PDF是通过将我之前根据输入电子邮件生成的两种PDF合并在一起生成的。架构的完整图见下图。 建筑示意图 我遇到的问题与合并PDF Lambda函数有关,该函数接收类型1和类型2 PDF并生成类型3 PDF。一旦一组完整的类型1和2 PDF准备就绪并在S3中等待,

  • 我实现了AWS Eventbridge规则和Lambda函数的基本组合作为其目标。假设该规则基于所有AWS自动缩放事件创建一个事件,并调用Lambda。当触发现有ASG的缩放操作时,此操作效果良好,但当创建具有相同前缀的新ASG时,规则不会做出反应。旧ASG名称:test-ASG-lc-123新ASG名称:test-ASG-lc-124 甚至可以使用通配符吗?