如何使用 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_average
martic 如下图所示。现在使用 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 学习总结—— 如何解决存量云资源的管理难题