首页 > 解决方案 > 适用于 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 存储桶名称为每个工作区使用一个存储桶,并在部署时根据生产存储桶对其进行更新?

标签: amazon-web-servicesamazon-s3terraformterraform-provider-aws

解决方案


根据您的需要,您有多种选择:

  • 每个环境和工作区创建一个存储桶。那么上面提到的 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要监听的事件,其他选项之一可能更合适。


推荐阅读