【问题标题】:Terraform create a Cloudwatch rule with multiple targetsTerraform 创建具有多个目标的 Cloudwatch 规则
【发布时间】:2019-10-15 11:01:00
【问题描述】:

来自 Terraform 文档 - https://www.terraform.io/docs/providers/aws/r/cloudwatch_event_target.html

我没有看到将多个目标映射到同一 Cloudwatch 规则的选项。它只需要一个接受一个资源的arn 字段。我正在尝试将 5 个 Lambda 映射到相同的 Cloudwatch 规则。 Terraform 支持吗?

编辑:我怎样才能只附加 5 个 lambda?如果我创建了 15 个 lambda,我想将 5 个附加到 3 个 cloudwatch 规则。

【问题讨论】:

  • 这就是我所做的。我忽略了“target_id”(非常重要),并使用循环创建多个 aws_cloudwatch_event_target

标签: amazon-web-services terraform amazon-cloudwatch terraform-provider-aws amazon-cloudwatchlogs


【解决方案1】:

搞定了!当我将目标分配给规则时,我必须将规则数除以 5。大致是这样的:

resource "aws_cloudwatch_event_rule" "arule" {
  count       = "${ceil(length(var.lambda_arns) / 5.0)}"  // Needs to be 5.0 to force float computation
  name        = "${var.rule_name}${format("-%d", count.index)}"
  is_enabled  = true
}

resource "aws_cloudwatch_event_target" "atarget" {
  depends_on = ["aws_cloudwatch_event_rule.arule"]
  count = "${length(var.lambda_arns)}"
  rule  = "${aws_cloudwatch_event_rule.arule.*.name[count.index / 5]}"
  arn   = "${var.lambda_arns[count.index]}"
}

我根据 lambda 的数量创建了事件规则(即,如果有 10 个 lambda,则创建 2 个规则)。

我根据 lambda 的数量创建了目标(即,如果有 10 个 lambda,则创建 10 个目标)。

我通过将count.index 除以 5(用于确定规则计数的相同逻辑)在规则中按比例分配目标。

【讨论】:

  • 您的解决方案基于我的回答,我什至没有竖起大拇指。不酷,伙计。
  • 不,我没有从您的解决方案中获取任何内容,我已经在使用 count 并且将目标与规则进行了一对一的映射。我的问题是将 5 个目标映射到一个规则。如果count > 5,我也不确定您的解决方案是否有效,因为 AWS 不支持超过 5 个目标的规则。
  • 创建多个具有多个目标的aws_cloudwatch_event_rule 怎么样?
【解决方案2】:

假设您使用带有 count 的相同 terraform 资源创建了所有 lambas,您也可以在此使用 count:

resource "aws_cloudwatch_event_target" "cw_target" {
    count = length(aws_lambda_function.my_lambdas)
    rule = "${aws_cloudwatch_event_rule.my_rule.name}"
    arn = "${aws_lambda_function.my_lambdas.*.arn[count.index]}"
}

【讨论】:

  • 我怎样才能只附加 5 个 lambda?如果我创建了 15 个 lambda,我想将 5 个附加到 3 个 cloudwatch 规则。
  • 因为我相信 cloudwatch 规则有 5 个目标的限制
【解决方案3】:

这就是我所做的。我忽略资源“aws_cloudwatch_event_target”的“target_id”(非常重要),并使用局部变量(定义您的本地变量,本示例:“targets”),并为本地变量循环,并创建多个 aws_cloudwatch_event_target 和多个评估模板.

locals {
  stack_name_prefix = "Inspector"

  rules_package_arn_cis = "arn:aws:inspector:ap-southeast-2:454640832652:rulespackage/0-Vkd2Vxjq"

  default_target = {
    rules : [local.rules_package_arn_cis],
    duration : 3600
  }

  targets = [
    merge(local.default_target, {
      name : "data_indexer",
      tags : {
        Function = "LR - DX"
      },
    }),
    merge(local.default_target, {
      name : "ai_engine",
      tags : {
        Function = "LR - AIE"
      },
    }),
    merge(local.default_target, {
      name : "data_processor",
      tags : {
        Function = "LR - Data Processor"
      },
    }),
    merge(local.default_target, {
      name : "platform_manager",
      tags : {
        Function = "LR - PM"
      },
    })
  ]
}
resource "aws_inspector_assessment_template" "assessment_template" {
  count              = length(local.targets)
  name               = "${local.stack_name_prefix}_${local.targets[count.index]["name"]}_assessment_template"
  target_arn         = aws_inspector_assessment_target.assessment[count.index].arn
  duration           = local.default_target.duration
  rules_package_arns = [local.rules_package_arn_cis]
}

resource "aws_cloudwatch_event_target" "event_target_for_inspector_assessment_template" {
  count = length(local.targets)
  rule  = aws_cloudwatch_event_rule.event_rule_for_inspector_assessment_template.name
  //  target_id = "amazon_inspector_assessment" ## Don't USE target_id, it will mess up the cloudwatch event target, and only generated one target instead of 4
  arn      = aws_inspector_assessment_template.assessment_template[count.index].arn
  role_arn = aws_iam_role.inspector_assessment_template.arn
}

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多