在 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 通知