微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用现有 S3 存储桶配置 lambda 和 SNS

如何解决无法使用现有 S3 存储桶配置 lambda 和 SNS

我有一个现有的 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 角色,并且它有效。所以我认为这个问题与存储桶有关。

解决方法

您能否与我们分享您的政策或之前用于获得您现在的位置的任何基础设施即代码,任何人都很难弄清楚这可能是什么原因。我当然也建议通过 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/*"
        },"Action": [
                "s3:PutObject"
            ],"Resource": "arn:aws:s3:::mybucket-resized/*"
        }
    ]

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

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

创建执行角色

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

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

,

问题在于 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。