基于多个 s3 存储桶事件通知触发多个 lambda

问题描述 投票:0回答:2

我是 terraform 世界的新手,一直在尝试从 s3 存储桶上配置的不同事件本质上触发多个 lambda。每次我尝试创建它时,它基本上都会覆盖前一个事件并根据 terraform 计划创建最后一个事件。不知道我在这里做错了什么。我看到了一个 git 问题,我可以找到明确的解决方案。

非常感谢任何帮助!

附件是我编写的示例代码,可在环境级别进行配置。

https://github.com/hashicorp/terraform/issues/6934

resource "aws_lambda_function" "lambda-function" {
  s3_bucket     = "${var.project}-${var.env}-${var.artifacts-postfix}"
  s3_key        = "lambda/${var.project}-${var.env}-${var.lambda-name}/function.zip"
  function_name = "${var.project}-${var.env}-${var.lambda-name}"
  role          = var.lambda-role
  handler       = "handler.lambda_handler"
  timeout       = "60"

  runtime = "python3.7"

  environment {
    variables = var.env-variables
  }

  tags = {
    Name    = "${var.project}-${var.env}-${var.lambda-name}"
    Project = var.project
    Env     = var.env
  }
}


resource "aws_lambda_permission" "s3-trigger" {
  count         = var.activate-trigger ? 1 : 0 
  statement_id  = "${var.project}-${var.env}-${var.lambda-name}-statement-id"
  action        = "lambda:InvokeFunction"
  function_name = "${var.project}-${var.env}-${var.lambda-name}"
  principal     = "s3.amazonaws.com"
  source_arn    = "arn:aws:s3:::${var.bucket-name}"
  depends_on    = [aws_lambda_function.lambda-function]
}


resource "aws_s3_bucket_notification" "bucket_notification" {
  count  = var.activate-trigger ? 1 : 0 
  bucket = var.bucket-name

  lambda_function {
    lambda_function_arn = aws_lambda_function.lambda-function.arn
    events              = ["s3:ObjectCreated:*"]
    filter_prefix       = var.s3-key-prefix
    filter_suffix       = var.s3-key-suffix
    id                  = "${var.project}-${var.env}-${var.lambda-name}-event-id"
  }

  depends_on = [aws_lambda_permission.s3-trigger]
}
amazon-s3 terraform terraform-provider-aws
2个回答
0
投票

一年后,我又碰上了同样的墙。 ID 不是一个会创建多个通知的唯一标识符,是一个可选值。 AWS 分配真正的唯一标识符。

在我的场景中,我收到通过 SES 发送的电子邮件并存储在 S3 中,因此当我使用 SES 操作获取存储在 s3 中的电子邮件时,我结束通过 SNS 发布。让 lambda 订阅了 SNS,并在收到消息后开始工作。

从 aws_s3_bucket_notification 切换到 aws_sns_topic_subscription


0
投票

答案:

它需要位于一个主题配置下,例如:

{
"TopicConfigurations": [
    {
      "Id": "TopicConfiga",
      "TopicArn": "${sns_topic_arn_a}",
      "Events": ["s3:ObjectCreated:*"],
      "Filter": {
        "Key": {
          "FilterRules": [
            {"Name": "prefix", "Value": "abc/xyz/"},
            {"Name": "suffix", "Value": ".csv"}
          ]
        }
      }
    },
    {
      "Id": "TopicConfigb",
      "TopicArn": "${sns_topic_arn_b}",
      "Events": ["s3:ObjectCreated:*"],
      "Filter": {
        "Key": {
          "FilterRules": [
            {"Name": "prefix", "Value": "abc/efg/"},
            {"Name": "suffix", "Value": ".csv"}
          ]
        }
      }
    }
]

}

© www.soinside.com 2019 - 2024. All rights reserved.