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



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

我一直在为其他现有的S3 bucket做这件事,没有任何问题。然而,现在有了这个S3 bucket,无论我试图创建一个lambda(根据我阅读的一些AWS文档,在lambda控制台上这样做都会自动附加S3调用函数的策略。但我也只是尝试手动添加S3调用lambda的权限(或SNS(我编辑了SNS策略,允许S3 bucket发送消息和接收消息(,我得到了这个错误:

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参与其中。

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

更新:此外,我刚刚测试了在另一个bucket上做同样的事情——使用相同的IAM角色,并且它有效。所以我认为这个问题与水桶有关。

你能与我们分享你的政策吗?或者之前用来获得现在成绩的任何Infra as Code吗?任何人都很难弄清楚这可能是什么原因。我当然也建议通过AWS CloudFormation在AWS中设置资源,也许这是一个很好的入门指南:https://www.youtube.com/watch?v=t97jZch4lMY

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

所需权限包括:

  • 从源S3 bucket中获取对象
  • 将调整大小的对象放入目标S3存储桶中
  • 与CloudWatch日志相关的权限
{
"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-角色

上述创建的策略具有功能管理AmazonS3中的对象和将日志写入CloudWatch日志所需的权限。

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

要使用此策略,您必须更新亚马逊SNS主题ARN、bucket名称和bucket所有者的AWS帐户ID。

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

最新更新