如何使用 API、CLI 或 Terraform 为 RabbitMQ 代理获取 AmazonMQ 节点

Posted

技术标签:

【中文标题】如何使用 API、CLI 或 Terraform 为 RabbitMQ 代理获取 AmazonMQ 节点【英文标题】:How to fetch AmazonMQ nodes for RabbitMQ brokers using API, CLI or Terraform 【发布时间】:2021-09-22 23:40:39 【问题描述】:

我正在尝试为每个 RabbitMQ 代理的 systemCpuUtilizaiton 创建 AWS Cloudwatch 警报 通过 Terraform 的节点。要创建AWS Cloudwatch alarm,我需要提供AWS docs 中提到的维度(节点名称和代理)。

因此,我希望从 AWS(通过 CLI、API 或 Terraform)获取 rabbitMQ 代理节点名称

请注意:我可以在 AWS Cloudwatch 控制台中查看每个代理节点的矩阵,但不能从 API、SDK 或 CLI 中查看。

我浏览了以下链接,但没有得到任何方便https://awscli.amazonaws.com/v2/documentation/api/latest/reference/mq/index.html#cli-aws-mq https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/mq_broker

如果我遗漏了什么,请告诉我。

【问题讨论】:

这是您要找的吗? registry.terraform.io/providers/hashicorp/aws/latest/docs/… 不,我正在使用“aws_cloudwatch_metric_alarm”资源来创建警报,但要创建它,我需要提供“维度”(这将是 AWS 为 RabbitMQ 代理创建的节点的名称) 可以参考TF内的其他资源。例如dimensions = Broker = aws_mq_broker.example.broker_name 。我可能仍然对您遇到问题的地方感到困惑。 如果您参考 AWS 文档 docs.aws.amazon.com/amazon-mq/latest/developer-guide/… 的“RabbitMQ 节点指标”部分,则需要两个参数(作为维度):节点和代理。我得到了代理,但没有节点名称(代理在其上运行) 我现在明白这个问题了。这是一个艰难的过程,因为 AWS 似乎根本没有通过 API 公开它。您可以访问aws_mq_broker.example.instances,其中包括ip_address。您也许可以使用它来构造节点主机名。 【参考方案1】:

我已将上述问题提交给 AWS 支持,以下是解决方案:

首先来自 AWS 团队的回应,AmazonMQ-RabbitMQ 代理节点由 AWS 内部管理,目前它没有通过 API 或 SDK 公开。

因此,无法通过 API 或 SDK 获取 Rabbit MQ 代理节点名称因此无法在 Rabbit MQ 代理节点的systemCpuUtilizaiton、as node name are required dimensions for creating the alert 上直接创建 cloudwatch 警报。

有两种替代解决方案

    查询 RabbitMQ API 以获取节点名称 使用prometheus/cloudwatch-exporter,从节点名称可用的云监控中获取矩阵详细信息。

我使用了第二种方法,下面的值文件来获取我们感兴趣的矩阵

prometheus-cloudwatch-exporter:
    namespace: monitoring
    enabled: true
    override:
      metrics:
        alb: false
        rds: false
        # ... based on requirement
      alerts:
        ec2: false # based on requirement
      additionalMetrics: |-
        # below configuration will fetch the martics,
        # containing Rabbit MQ broker node names
        - aws_namespace: AWS/AmazonMQ
          aws_metric_name: SystemCpuUtilization
          aws_dimensions: [Broker, Node]
          aws_statistics: [Average]

如果一切配置正确,你应该可以在 prometheus 中 aws_amazonmq_system_cpu_utilization_averagemartic 如下图所示。现在使用 Prometheus 警报管理器在此矩阵之上创建警报。

【讨论】:

【参考方案2】:

用于 cloudwatch 维度的 AWS MQ 节点名称似乎不会通过 AWS API 公开,但知道 IP 地址后节点名称是可预测的。我相信这可以用来为警报构建有效的节点名称。

data "aws_region" "current" 

resource "aws_mq_broker" "example" 
  ...


resource "aws_cloudwatch_metric_alarm" "bat" 
  for_each = toset([
    for instance in aws_mq_broker.example.instances : instance.ip_address
  ])

  alarm_name          = "terraform-test-foobar5"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = "2"
  metric_name         = "SystemCpuUtilization"
  namespace           = "AWS/AmazonMQ"
  period              = "120"
  statistic           = "Average"
  threshold           = "80"

  dimensions = 
    Broker = aws_mq_broker.example.name
    Node   = "rabbitmq@ip-$replace(each.value, ".", "-").$data.aws_region.current.name.compute.internal"
  

【讨论】:

我没有设置来测试这个,所以如果它按原样工作我会感到惊讶,但我相信这至少非常接近一个有效的解决方案 这正是我正在尝试的,但没有返回 IP 地址,aws_mq_broker.example 的输出值看起来像这样“......BrokerInstances = [ ConsoleURL = "b-2dce7324-02ga-414f-b6y0-99d986e78880.mq.us-east-1.amazonaws.c…" Endpoints = [ "amqps://b-2dce7324-02ga-414f-b6y0-99d986e78880.mq.us-east-1.amazonaws.com:5671", ] , ]..." 不确定它的超级可读性,我的观点是否没有返回ip_address

以上是关于如何使用 API、CLI 或 Terraform 为 RabbitMQ 代理获取 AmazonMQ 节点的主要内容,如果未能解决你的问题,请参考以下文章

AWS IAM-如何禁止用户通过控制台进行更改,但允许通过CLI更改API

Terraform 学习总结—— 如何解决存量云资源的管理难题

Terraform 学习总结—— 如何解决存量云资源的管理难题

Terraform 学习总结—— 如何解决存量云资源的管理难题

如何使用Terraform将虚拟网络添加到api管理中?

如何使用 Terraform 在 API 网关上启用 HEAD 方法