【问题标题】:Triggering a Lambda once a DMS Replication Task has completed in Terraform在 Terraform 中完成 DMS 复制任务后触发 Lambda
【发布时间】:2022-10-21 05:33:00
【问题描述】:

我想在 RDS 复制任务成功完成后触发 Lambda。我有以下 Terraform 代码,它成功创建了所有资产,但我的 Lambda 没有被触发。

resource "aws_dms_event_subscription" "my_event_subscription" {
  enabled          = true
  event_categories = ["state change"]
  name             = "my-event-subscription"
  sns_topic_arn    = aws_sns_topic.my_event_subscription_topic.arn
  source_ids       = ["my-replication-task"]
  source_type      = "replication-task"
}

resource "aws_sns_topic" "my_event_subscription_topic" {
  name = "my-event-subscription-topic"
}

resource "aws_sns_topic_subscription" "my_event_subscription_topic_subscription" {
  topic_arn = aws_sns_topic.my_event_subscription_topic.arn
  protocol  = "lambda"
  endpoint  = aws_lambda_function.my_lambda_function.arn
}

resource "aws_sns_topic_policy" "allow_publish" {
  arn    = aws_sns_topic.my_event_subscription_topic.arn
  policy = data.aws_iam_policy_document.allow_dms_and_events_document.json
}

resource "aws_lambda_permission" "allow_sns_invoke" {
  statement_id  = "AllowExecutionFromSNS"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.my_lambda_function.function_name
  principal     = "sns.amazonaws.com"
  source_arn    = aws_sns_topic.my_event_subscription_topic.arn
}

data "aws_iam_policy_document" "allow_dms_and_events_document" {
  statement {
    actions = ["SNS:Publish"]
    principals {
      identifiers = [
        "dms.amazonaws.com",
        "events.amazonaws.com"
      ]
      type = "Service"
    }
    resources = [aws_sns_topic.my_event_subscription_topic.arn]
  }
}

我错过了什么吗?

event_categories = ["state change"] 正确吗? (This 建议 state change 是正确的。 我现在不太担心每次状态更改都会触发 Lambda,而不仅仅是 DMS-EVENT-0079。)

是否可以添加一些内容以从事件订阅中获取 CloudWatch 日志,告诉我出了什么问题?

【问题讨论】:

  • 有没有这样的事件会导致 Lambda 被触发?
  • 是的,@MarkoE,可以确认复制任务每天都在运行
  • 您可以在 AWS 控制台中验证是否允许 SNS 主题触发 Lambda 函数?

标签: aws-lambda terraform terraform-provider-aws amazon-sns aws-dms


【解决方案1】:

您可以尝试给它一个 JSON,就像在 AWS 文档上共享的那样。

{ “版本”:“0”, "id":"11a11b11-222b-333a-44d4-01234a5b67890", "detail-type":"DMS 复制任务状态变化", “来源”:“aws.dms”, “帐户”:“0123456789012”, "时间":"1970-01-01T00:00:00Z", "地区":"us-east-1", “资源”:[ “arn:aws:dms:us-east-1:012345678901:task:AAAABBBB0CCCCDDDDEEEEE1FFFF2GGG3FFFFFF3” ], “细节”:{ "type":"ReplicationTask", “类别”:“状态变化”, "eventType":"REPLICATION_TASK_STARTED", "eventName":"DMS-EVENT-0069", "resourceLink":"https://console.aws.amazon.com/dms/v2/home?region=us-east-1#taskDetails/taskName", "detailMessage":"复制任务已启动,标志 = 新开始" } }

您可以检查如何在 Terraform here 中将其作为 JSON 提供

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2021-06-19
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多