Terraform for AWS:如何在对象路径上过滤每个 S3 存储桶的多个事件?
Terraform for AWS: How to have multiple events per S3 bucket filtered on object path?
我的理解是,在使用 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
然后它更新存储桶的 only/single 通知,覆盖资源的以前的设置。
将 S3 存储桶用于通知的最佳做法是什么?它们是否最好 configured/created 每个 Terraform 工作区,and/or 如何管理存储桶以允许同时开发人员通过 terraform apply
使用公共 S3 存储桶等支持 up/down 基础设施资源?对于此用例,您必须按照文档的建议在每个工作区使用一个存储桶吗?
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 存储桶名称,并在部署时将其相应地更新到生产存储桶?
根据您的需要,您有多种选择:
为每个环境和工作区创建一个存储桶。那么上面提到的 terraforms aws_s3_bucket_notification
的限制应该不再是一个问题。我可以想象,您用来写入存储桶的过程仍然只会写入您指定的一个存储桶。要解决此问题,您可以考虑将上传到一个 "master" 存储桶的任何对象转发到所有其他存储桶(使用 lambda,它本身由 aws_s3_bucket_notification
或可能由 bucket replication 触发)。
为每个环境创建一个存储桶并在没有工作区的情况下部署 aws_s3_bucket_notification
。那么您将不再拥有工作区的优势。但这可能是桶数和可用性之间的合理折衷
只保留这个桶,保留环境和工作区,但只部署一次 aws_s3_bucket_notification
资源(可能与桶一起)。那么这个 aws_s3_bucket_notification
资源将需要包含所有环境和工作区的规则。
这真的取决于你的情况,什么最适合。如果那些 aws_s3_bucket_notification
很少改变,并且大部分改变是在 lambda 函数中完成的,那么最后一个选项可能是最好的。如果您经常想要更改 aws_s3_bucket_notification
和要监听的事件,其他选项之一可能更合适。
我的理解是,在使用 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
然后它更新存储桶的 only/single 通知,覆盖资源的以前的设置。
将 S3 存储桶用于通知的最佳做法是什么?它们是否最好 configured/created 每个 Terraform 工作区,and/or 如何管理存储桶以允许同时开发人员通过 terraform apply
使用公共 S3 存储桶等支持 up/down 基础设施资源?对于此用例,您必须按照文档的建议在每个工作区使用一个存储桶吗?
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 存储桶名称,并在部署时将其相应地更新到生产存储桶?
根据您的需要,您有多种选择:
为每个环境和工作区创建一个存储桶。那么上面提到的 terraforms
aws_s3_bucket_notification
的限制应该不再是一个问题。我可以想象,您用来写入存储桶的过程仍然只会写入您指定的一个存储桶。要解决此问题,您可以考虑将上传到一个 "master" 存储桶的任何对象转发到所有其他存储桶(使用 lambda,它本身由aws_s3_bucket_notification
或可能由 bucket replication 触发)。为每个环境创建一个存储桶并在没有工作区的情况下部署
aws_s3_bucket_notification
。那么您将不再拥有工作区的优势。但这可能是桶数和可用性之间的合理折衷只保留这个桶,保留环境和工作区,但只部署一次
aws_s3_bucket_notification
资源(可能与桶一起)。那么这个aws_s3_bucket_notification
资源将需要包含所有环境和工作区的规则。
这真的取决于你的情况,什么最适合。如果那些 aws_s3_bucket_notification
很少改变,并且大部分改变是在 lambda 函数中完成的,那么最后一个选项可能是最好的。如果您经常想要更改 aws_s3_bucket_notification
和要监听的事件,其他选项之一可能更合适。