用于查找和填充 AWS cloudwatch 警报本身的 Terraform

Posted

技术标签:

【中文标题】用于查找和填充 AWS cloudwatch 警报本身的 Terraform【英文标题】:Terraform to lookup and fill AWS cloudwatch alarm itself 【发布时间】:2021-09-27 12:25:26 【问题描述】:

所以我有一个主 RDS 模块,它引用另一个名为“cloudwatch_alarms”的模块。

现在,在那个 ONE RDS 模块下......我有大约 6 个 cloudwatch 警报,它们都引用了那个“cloudwatch_alarms”模块。

我面临的问题是:现在每个警报都有自己的配置。 例如,alarmA 的阈值为 15000,alarmB 的阈值为 25000。 我希望我的代码能够获取每个警报本身的“阈值”值 - 因为每个警报的每个值都不同 - 我不能在 variable.tf 中硬编码它。

我希望 terraform 自己放置值。

我在 4 个不同的环境中使用同一个模块,每个环境中的每个警报都有不同的“阈值”值..所以我不能为它保留一个值。 所以我希望我的代码能够以变量 - terraform 自动获取每个警报的值(来自 AWS)的方式进行更改。

有没有办法做到这一点?

我的模块如下:

main.tf 模块 RDS 的一部分:

...
...

module "alarmA" 
  source = "git@github.com:cloudwatch_alarms"

  alarm_description        = "xxx"
  alarm_name               = "$var.name-alarmA"
  comparison_operator      = "LessThanOrEqualToThreshold"
  evaluation_periods       = 4
  namespace                = "AWS/RDS"
  notification_topic       = [var.notification_topic]
  period                   = 6
  threshold                = 15000


module "alarmB" 
  source = "git@github.com:cloudwatch_alarms"

  alarm_description        = "xxxx"
  alarm_name               = "$var.name-alarmB"
  comparison_operator      = "GreaterThanOrEqualToThreshold"
  evaluation_periods       = 5
  namespace                = "AWS/RDS"
  notification_topic       = [var.notification_topic]
  period                   = 7
  threshold                = 25000

模块 cloudwatch_alarms 的 main.tf 的一部分:

resource "aws_cloudwatch_metric_alarm" "alarm" 
  count = var.alarm_count

  alarm_description   = var.alarm_description
  alarm_name          = var.alarm_count > 1 ? format("%v-%03d", local.alarm_name, count.index + 1) : local.alarm_name
  alarm_actions       = []
  comparison_operator = var.comparison_operator
  datapoints_to_alarm = var.datapoints_to_alarm
  dimensions          = var.dimensions[count.index]
  evaluation_periods  = var.evaluation_periods
  metric_name         = var.metric_name
  namespace           = var.namespace
  period              = var.period
  statistic           = var.statistic
  threshold           = var.threshold
  unit                = var.unit

cloudwatch_alwarms 的变量.tf:

variable "threshold" 
  description = "The value against which the specified statistic is compared."
  type        = string

【问题讨论】:

抱歉,不清楚您想做什么。您当前的代码有什么问题?有什么错误吗? @Marcin 我的代码没有错。问题是我不能为变量“阈值”保留一个相同的值,因为我的每个警报都有不同的值。所以我希望我的代码能够以变量或 terraform 自动获取每个警报的值(AWS 中的内容)的方式进行更改。 遗憾的是,如果没有自定义外部资源,您将无法执行此操作,因为 terraform 不提供 cloudwatch 警报的数据源。 @Marcin 哦!我不能使用“查找”或其他方式吗?我不确定 【参考方案1】:

假设我对您的问题的理解是正确的,您不能在 terraform 中引用现有的 AWS 警报,因为它不提供 data sources 警报。 TF 提供的唯一来源是aws_cloudwatch_log_groupaws_cloudwatch_event_source。为了克服这个问题,您必须使用例如开发自己的External Data Source bash 中的 AWS CLI,如链接的 TF 文档中所示。

但是,如果这些警报是您的子模块outputs,您可以在父模块中引用它们。为此,您必须将子模块修改为output 每个警报的阈值。然后,在父模块中,您可以简单地获取这些输出值并将它们用于其他目的,例如通过将它们传递给其他子模块。

【讨论】:

以上是关于用于查找和填充 AWS cloudwatch 警报本身的 Terraform的主要内容,如果未能解决你的问题,请参考以下文章

使用 cloudwatch 警报进行 AWS route53 故障转移

Terraform AWS Cloudwatch 警报

将现有 AWS CloudWatch 警报导出到 CloudFormation 模板

是否可以确定在 cloudwatch aws 上发送警报的时间?

来自账户 A 的 AWS Cloudwatch 警报无法发布到账户 B 中的 SNS 主题

javascript CloudWatch到AWS Lambda到Slack Channel Alerts和Charts。通过SNS主题通过Lambda函数将CloudWatch警报发布到Slack通