Лучший способ создать тревогу PagerDuty на основе правила Cloudwatch
PagerDuty (PD) имеет интеграцию с Cloudwatch (CW), и я использую его для перехода на страницу всякий раз, когда срабатывает сигнал CW: https://support.pagerduty.com/docs/aws-cloudwatch-integration-guide
Я бы хотел, чтобы меня вызывали, если запущено правило CW. Похоже, я могу использовать PD Global Event Routing и затем настроить вход CW для отправки ответа, который ожидает конечная точка PD Global Event. Но мне нравится, как сигналы CW публикуются в теме SNS, и все, что мне нужно сделать, это переслать сообщение темы SNS в PD, так что было бы хорошо, если бы было что-то подобное для правил CW.
1 ответ
Оказывается, я могу создать сигнал CW из правила, используя TriggeredRules
Метрика. Тогда я могу использовать существующую интеграцию PagerDuty CW. Вот код terraform, который я написал:
data "template_file" "ecs_task_stopped" {
template = <<EOF
{
"source": ["aws.ecs"],
"detail-type": ["ECS Task State Change"],
"detail": {
"clusterArn": ["arn:aws:ecs:$${aws_region}:$${account_id}:cluster/$${cluster}"],
"desiredStatus": ["Running"],
"lastStatus": ["STOPPED"]
}
}
EOF
vars {
account_id = "${data.aws_caller_identity.current.account_id}"
cluster = "${var.ecs_cluster_name}"
aws_region = "${data.aws_region.current.name}"
}
}
resource "aws_cloudwatch_event_rule" "ecs_task_stopped" {
count = "${var.should_create == "true" ? 1 : 0}"
name = "${var.env}_${var.ecs_cluster_name}_task_stopped"
description = "${var.env}_${var.ecs_cluster_name} Essential container in task exited"
event_pattern = "${data.template_file.ecs_task_stopped.rendered}"
}
resource "aws_cloudwatch_metric_alarm" "alarm_task_stopped_rule_triggered" {
count = "${var.should_create == "true" ? 1 : 0}"
alarm_name = "${var.ecs_cluster_name}-task-stopped"
comparison_operator = "GreaterThanOrEqualToThreshold"
evaluation_periods = "1"
datapoints_to_alarm = "1"
metric_name = "TriggeredRules"
namespace = "AWS/Events"
period = "60"
statistic = "Maximum"
threshold = "1"
alarm_description = "Essential container in ${var.ecs_cluster_name} task exited"
alarm_actions = ["${var.cw_sns_topic_id}"]
ok_actions = ["${var.cw_sns_topic_id}"]
dimensions {
RuleName = "${aws_cloudwatch_event_rule.ecs_task_stopped.name}"
}
}