在 Terraform 中创建 S3 存储桶通知时出错

Posted

技术标签:

【中文标题】在 Terraform 中创建 S3 存储桶通知时出错【英文标题】:Error when creating S3 bucket notification in Terraform 【发布时间】:2021-04-24 13:19:27 【问题描述】:

我在创建存储桶通知以触发 Lambda 函数时遇到问题。错误:

Error putting S3 notification configuration: InvalidArgument: Unable to validate the following destination configurations
    status code: 400

我了解到类似的问题可能是由创建资源的顺序或缺少 Lambda 权限引起的。但是,我尝试在我的代码中包含depends_on,并多次应用模板并在其间等待。我正在使用限制最少的 Lambda 策略。我还尝试使用来自Terraform documentation 的确切示例代码,但这给了我一个完全不同的错误。

如果在控制台中创建完全相同的设置,则可以正常工作。

这是我的代码有问题的部分:

resource "aws_lambda_function" "writeUsersToDB" 
  filename      = "writeUsersToDB.zip"
  function_name = "writeUsersToDB"
  role          = "arn:aws:iam::0000000:role/AWSLambdaFullAccess"
  handler       = "main.lambda_handler"
  memory_size = 256
  timeout = 900
  source_code_hash = filebase64sha256("writeUsersToDB.zip")
  runtime = "python3.8"
  environment variables = local.parameters
  layers = [ "arn:aws:lambda:eu-west-2:0000000:layer:pandas-pandas-schema-numpy:1" ]




resource "aws_s3_bucket_notification" "event" 
  bucket = aws_s3_bucket.user_data.id

  lambda_function 
    lambda_function_arn = aws_lambda_function.writeUsersToDB.arn
    events              = ["s3:ObjectCreated:*"]
    filter_suffix       = ".csv"
  
  depends_on = [aws_lambda_function.writeUsersToDB]



resource "aws_s3_bucket" "user_data" 
  bucket = "nameofthebucket"

【问题讨论】:

【参考方案1】:

你不见了aws_lambda_permission:

resource "aws_lambda_permission" "example" 
  statement_id  = "AllowExecutionFromS3Bucket"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.writeUsersToDB.function_name
  principal     = "s3.amazonaws.com"
  source_arn    = aws_s3_bucket.user_data.arn



【讨论】:

非常感谢,成功了!我已经坐了3天了。但是我现在很困惑,为什么 Lambda 角色还不够? @madej lambda 函数有两种权限:执行角色和基于资源的权限。你写的是第一种类型。但是这里我们需要指定第二种类型,即什么可以调用该函数。在这种情况下,我们允许 S3 调用它。

以上是关于在 Terraform 中创建 S3 存储桶通知时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知

为啥此脚本无法在 s3 中创建存储桶?

无法在特定区域中创建s3存储桶

Apache Hive 在 S3 存储桶错误中创建表

Terraform:尝试销毁 EKS 集群时出现“错误:删除 S3 存储桶时出错”

无法在 cloudformation 中创建带有事件的 s3 存储桶,以连接到它