amazon-web-services - 适用于 AWS 的 Terraform:如何在对象路径上过滤每个 S3 存储桶的多个事件?
问题描述
我的理解是,在使用 Terraform 配置S3 存储桶通知时,我们只能为每个 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 存储桶名称为每个工作区使用一个存储桶,并在部署时根据生产存储桶对其进行更新?
解决方案
根据您的需要,您有多种选择:
每个环境和工作区创建一个存储桶。那么上面提到的 terraforms 的限制
aws_s3_bucket_notification
应该不再是一个问题。我可以想象,您用来写入存储桶的过程仍然只会写入您指定的一个存储桶。要解决此问题,您可以考虑将上传到一个“主”存储桶的任何对象转发到所有其他存储桶(使用 lambda,它本身由 aaws_s3_bucket_notification
或可能由存储桶复制触发)。每个环境创建一个存储桶并部署
aws_s3_bucket_notification
没有工作空间。那么你就不再拥有工作空间的优势了。但这可能是存储桶数量和可用性之间的合理折衷只保留这个存储桶,保留环境和工作区,但
aws_s3_bucket_notification
只部署一次资源(可能与存储桶一起)。然后,这一aws_s3_bucket_notification
资源将需要包含所有环境和工作空间的规则。
这真的取决于你的情况,什么最适合。如果这些aws_s3_bucket_notification
很少更改,并且大多数更改是在 lambda 函数中完成的,那么最后一个选项可能是最好的。如果您经常想更改aws_s3_bucket_notification
要监听的事件,其他选项之一可能更合适。
推荐阅读
- assembly - 将目标文件与标准库链接的问题
- angular - Angular Resolver 似乎没有更新对象
- groovy - 如何在 groovy 中使用地图创建 JSON
- javascript - 如何在 React 中使用 ChartJS?
- shell - 将 groovy 变量分配给 shell 命令中的进程 ID
- algorithm - 以每秒 10k+ 次的速度根据多个条件查找对象
- javascript - 更改从地图函数 onClick 返回的特定组件的样式
- go - 如何从 GOlang 中的键值映射中替换 json 值
- python - 创建动态嵌套 for 循环
- python - TypeError:“str”对象不可调用(请求)