我的理解是,在使用Terraform配置S3 bucket notification时,我们只能为每个S3存储桶配置单个通知:
NOTE: S3 Buckets only support a single notification configuration. Declaring multiple
ws_s3_bucket_notification resources to the same S3 Bucket will cause a perpetual difference in
configuration. See the example "Trigger multiple Lambda functions" for an option.
应用程序使用单个S3存储桶作为数据存储库,即,当JSON文件到达那里时,它们会触发一个lambda,该lambda提交相应的批处理作业,以从文件中提取到数据库中。
[这在我们只有一个开发人员部署基础结构的情况下效果很好,但是当我们每个人运行terraform apply
时都有多个开发人员,那么它将更新存储桶的唯一/单个通知,从而覆盖资源的先前设置。
使用S3存储桶进行通知的最佳做法是什么?是否为每个Terraform工作区配置/创建了最好的存储区,和/或如何管理存储区以允许同时开发人员使用通用的S3存储区通过terraform apply
来站/放下基础架构资源?根据文档的建议,您是否必须为此用例在每个工作区中使用一个存储桶?
我拥有S3通知的当前Terraform(允许使用最新配置覆盖的代码):
data "aws_s3_bucket" "default" {
bucket = var.bucket
}
resource "aws_lambda_permission" "allow_bucket_execution" {
statement_id = "AllowExecutionFromS3Bucket"
action = "lambda:InvokeFunction"
function_name = var.lambda_function_name
principal = "s3.amazonaws.com"
source_arn = data.aws_s3_bucket.default.arn
}
resource "aws_s3_bucket_notification" "bucket_notification" {
bucket = data.aws_s3_bucket.default.bucket
lambda_function {
lambda_function_arn = var.lambda_function_arn
events = ["s3:ObjectCreated:*"]
filter_prefix = var.namespace
filter_suffix = ".json"
}
}
namespace
变量作为"${local.env}-${terraform.workspace}"
传入,local.env
作为“ dev”,“ uat”,“ prod”等。
我们如何修改上面的Terraform代码以允许每个S3存储桶有多个通知(每个Terraform工作区基本上是一个通知),还是不能做到?如果没有,那么如何最好地处理呢?我是否应该仅使用每个工作区使用一个存储桶,并使用上述名称空间变量作为S3存储桶名称,并在部署时将其相应地更新到生产存储桶?
我的理解是,在使用Terraform配置S3存储桶通知时,我们只能为每个S3存储桶配置一个通知:注意:S3存储桶仅支持单个通知...
您有几种选择,取决于您的需求: