【问题标题】:Can't configure lambda and SNS with an existing S3 bucket无法使用现有 S3 存储桶配置 lambda 和 SNS
【发布时间】:2021-06-16 04:56:28
【问题描述】:

我有一个现有的 S3 存储桶(其中有一些 lambda 事件和我以前的同事已经创建的 SNS 配置)。我想添加一个新的 lambda 事件,该事件将由 PutObject 在另一个前缀中触发。

我一直在为其他现有的 S3 存储桶执行此操作,没有任何问题。但是,现在使用这个 S3 存储桶,无论我尝试创建一个 lambda(根据我正在阅读的一些 AWS 文档,在 lambda 控制台上执行此操作都会自动附加 S3 调用该函数的策略。但我也只是尝试手动添加 S3 调用 lambda 的权限)或 SNS(我编辑了 SNS 策略以允许 S3 存储桶发送消息和接收消息),我收到此错误:

An error occurred when creating the trigger: Unable to validate the following destination configurations (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; Request ID: KKBWYJGTVK8X8AYZ; S3 Extended Request ID: ZF3NOIqw8VcRYX6bohbYp7d0a+opDuXOcFRrn1KBn3vBVBIPuAQ/s7V+3vptIue1uWu6muIWBhY=; Proxy: null)

我已经关注了我能找到的所有 AWS 链接,我什至尝试关注 S3 上现有 lambda 事件触发器的所有设置(前缀除外)。但是,我仍然没有任何解决方案。我能想到的唯一区别可能是背后有一个 CloudFormation 来链接所有现有的应用程序。但是,我认为 s3 Bucket 不涉及。

你能给我一些建议吗?非常感谢!

更新:我刚刚测试了在另一个存储桶上做同样的事情 - 具有相同的 IAM 角色,并且它有效。所以我认为这个问题与存储桶有关。

【问题讨论】:

    标签: amazon-s3 aws-lambda amazon-cloudformation amazon-sns


    【解决方案1】:

    您能否与我们分享您的政策或之前使用的任何基础设施即代码来获得您现在的位置,任何人都很难弄清楚这可能是什么原因。我当然也建议通过 AWS CloudFormation 在 AWS 中设置资源,也许这是一个很好的入门指南:https://www.youtube.com/watch?v=t97jZch4lMY

    请比较以下定义 Lambda 函数权限的 IAM 政策。

    所需权限包括:

    • 从源 S3 存储桶中获取对象。
    • 将调整大小的对象放入目标 S3 存储桶中。
    • 与 CloudWatch Logs 相关的权限。
        {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "logs:PutLogEvents",
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream"
                ],
                "Resource": "arn:aws:logs:*:*:*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject"
                ],
                "Resource": "arn:aws:s3:::mybucket/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject"
                ],
                "Resource": "arn:aws:s3:::mybucket-resized/*"
            }
        ]
    

    您还需要为您的 Lambda 配置执行角色。

    创建执行角色,授予您的函数访问 AWS 资源的权限。

    创建执行角色

    • 在 IAM 控制台中打开角色页面。
    • 选择创建角色。
    • 使用以下属性创建角色。
    • 可信实体 – AWS Lambda。
    • 权限 – AWSLambdaS3Policy。
    • 角色名称 – lambda-s3-role。

    上述创建的策略具有该函数管理 Amazon S3 中的对象并将日志写入 CloudWatch Logs 所需的权限。

    【讨论】:

    • 嗨@Bruno,感谢您的回复。我所在的 IAM 角色附加了很多策略,因此在这里复制可能并不容易。我确实检查了它是否具有资源 * 的 cloudwatch 日志的权限。此外,此 IAM 角色在所有 S3 存储桶上都具有 S3FullAccess,它与 lambda.amazonaws.com 具有信任关系。我在帖子中提到的每项服务都在同一个帐户下。
    • 此外,之前完全相同的角色能够使用 lambda 在同一个 S3 存储桶上创建 S3 事件触发器。从那时起,我没有对 IAM 角色策略或信任实体进行任何更改。还有一个问题,如果我想使用 CloudFormation,我可以在现有的 S3 存储桶上这样做吗?
    • 关于 CloudFormation,我已经有一个 CloudFormation,我可以在模板中添加一些东西吗?
    【解决方案2】:

    问题在于 SNS 的访问策略。 添加此政策将解决此问题:

    {
     "Version": "2012-10-17",
     "Id": "example-ID",
     "Statement": [
      {
       "Sid": "example-statement-ID",
       "Effect": "Allow",
       "Principal": {
         "Service": "s3.amazonaws.com"  
       },
       "Action": [
        "SNS:Publish"
       ],
       "Resource": "arn:aws:sns:Region:account-id:topic-name",
       "Condition": {
          "ArnLike": { "aws:SourceArn": "arn:aws:s3:::awsexamplebucket1" },
          "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" }
       }
      }
     ]
    }
    

    要使用此策略,您必须更新 Amazon SNS 主题 ARN、存储桶名称和存储桶所有者的 AWS 账户 ID。

    来源:https://docs.aws.amazon.com/AmazonS3/latest/userguide/grant-destinations-permissions-to-s3.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-23
      • 2022-10-14
      • 1970-01-01
      • 2022-01-27
      • 2012-03-21
      • 1970-01-01
      • 2017-09-21
      • 2021-11-04
      相关资源
      最近更新 更多