【问题标题】:run dynamodb trigger for specific event types为特定事件类型运行 dynamodb 触发器
【发布时间】:2021-12-29 05:28:38
【问题描述】:

每当发电机表发生变化时,它都会运行一个触发器,然后运行一个 lambda 函数。现在,只要我添加或删除文件,触发器就会运行。相反,我只想在事件类型为 INSERT 时运行触发器。我怎样才能做到这一点?

resource "aws_dynamodb_table" "filenames" {
  name           = local.dynamodb_table_filenames
  billing_mode   = "PROVISIONED"
  read_capacity  = 1000
  write_capacity = 1000
  hash_key       = "filename"
  stream_enabled = true
  stream_view_type = "NEW_IMAGE"

  #range_key      = ""

  attribute {
    name = "filename"
    type = "S"
  }

  tags = var.tags
}

resource "aws_lambda_event_source_mapping" "allow_dynamodb_table_to_trigger_lambda" {
  event_source_arn  = aws_dynamodb_table.filenames.stream_arn
  function_name     = aws_lambda_function.trigger_stepfunction_lambda.arn
  starting_position = "LATEST"
}

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-dynamodb terraform terraform-provider-aws


    【解决方案1】:

    我怎样才能做到这一点?

    您必须过滤 lambda 函数中的事件。一个常见的模式是有两个功能。第一个函数,连接到 dynamodb 流,接收所有 db 事件,过滤它们,然后分发给其他消费者。

    这些消费者可以是SNS、SQS等功能等等。

    替代方法是使用CloudTrial data-plane events for DYnamoDB

    【讨论】:

    • 所以只用 if-else 语句过滤?在 lambda
    • @Jbd 是的,可以。
    【解决方案2】:

    于 2021 年 11 月 26 日宣布,现在可以过滤 Amazon SQS、Amazon DynamoDB 和 Amazon Kinesis 的事件。

    所以在这种情况下,不需要实现对 lambda 代码的过滤逻辑,可以通过过滤条件(lambda 配置)来完成。

    例如,要指定 lambda 函数只应在 INSERT 事件上触发,您可以使用以下过滤条件:

    {
        "eventName": [ "INSERT" ]
    }
    

    在控制台中是这样出现的:


    同样,过滤 UPDATE 事件,过滤器是:

    {
        "eventName": [ "MODIFY" ]
    }
    

    公告: https://aws.amazon.com/about-aws/whats-new/2021/11/aws-lambda-event-filtering-amazon-sqs-dynamodb-kinesis-sources/?nc1=h_ls

    文档: https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html#filtering-syntax

    【讨论】:

    • 我正在使用 Terraform 的 aws_lambda_event_source_mapping 资源来创建触发器。是否可以使用 Terraform 过滤事件?还是目前只能使用控制台?
    • 我在 terraform 的 aws_dynamodb_table 的文档中也没有看到过滤器选项
    【解决方案3】:

    抱歉,由于我没有足够的声誉,无法添加评论。 我已经能够通过 AWS 控制台向 Dynamodb 流添加过滤器。 但是,这可以通过 Terraform 实现吗? 我已经尝试了下面建议的“带有事件过滤器的 SQS”的示例,但是出现了 terraform 错误:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_event_source_mapping

    resource "aws_lambda_event_source_mapping" "example" {
      event_source_arn = aws_sqs_queue.sqs_queue_test.arn
      function_name    = aws_lambda_function.example.arn
    
      filter_criteria {
        filter {
          pattern = jsonencode({
            body = {
              Temperature : [{ numeric : [">", 0, "<=", 100] }]
              Location : ["New York"]
            }
          })
        }
      }
    }
    

    错误: 错误:不支持的块类型 │ │ 在 main.tf 第 91 行,在资源“aws_lambda_event_source_mapping”“示例”中: │ 91: filter_criteria { │ │ 这里不需要“filter_criteria”类型的块。

    【讨论】:

    猜你喜欢
    • 2011-10-19
    • 2021-05-05
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2018-05-18
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多