1

В настоящее время я настраиваю AWS CloudWatch Alarm, обнаруживая состояние работоспособности моего сервера с помощью Terraform. Состояние здоровья проверяется с помощью проверки работоспособности AWS Route 53 Health Check. Мой .tf файл:Как связать аварийный сигнал AWW CloudWatch с AWS Route53 Проверка работоспособности с помощью Terraform?

resource "aws_cloudwatch_metric_alarm" "val1-alarm" { 
    alarm_name = "val-alarm" 
    comparison_operator = "LessThanOrEqualToThreshold" 
    evaluation_periods = "2" 
    metric_name = "HealthCheckStatus" 
    namespace = "AWS/Route53" 
    period = "60" 
    statistic = "Minimum" 
    threshold = "0" 
    dimensions { 
    HealthCheckId = "${aws_route53_health_check.val1-hc.id}" 
    } 
    alarm_description = "This metric monitor whether the server is down or not." 
    insufficient_data_actions = [] 
} 

resource "aws_route53_health_check" "val1-hc" { 
    fqdn = "${aws_route53_record.val1-record.name}" 
    port = 27017 
    type = "TCP" 
    failure_threshold = "3" 
    request_interval = "30" 
    measure_latency = 1 
    cloudwatch_alarm_name = "${aws_cloudwatch_metric_alarm.val1-alarm.alarm_name}" 
    cloudwatch_alarm_region = "eu-central-1" 
} 

У меня есть эта ошибка при применении:

Cycle: aws_route53_health_check.val1-hc, aws_cloudwatch_metric_alarm.val1-alarm 

цикла означает, что каждый ресурс называет другую. Когда я пытаюсь удалить cloudwatch_alarm_name и cloudwatch_alarm_region из проверки работоспособности, ошибка terraform подсказывает, что мне нужны эти два аргумента (хотя doc указывает, что эти два являются необязательными). Как это исправить?

Любая помощь или предложения приветствуются!

+0

Это в настоящее время является открытым вопросом в проекте терраформировать-провайдеров -> https://github.com/terraform-providers/terraform-provider -aws/issues/712 – aimless

ответ

1

Вы не можете указать A от B и B от A.

Удалите ссылку из aws_cloudwatch_metric_alarm.val1-alarm например:

resource "aws_cloudwatch_metric_alarm" "val1-alarm" { 
    alarm_name = "val-alarm" 
    comparison_operator = "LessThanOrEqualToThreshold" 
    evaluation_periods = "2" 
    metric_name = "HealthCheckStatus" 
    namespace = "AWS/Route53" 
    period = "60" 
    statistic = "Minimum" 
    threshold = "0" 
    alarm_description = "This metric monitor whether the server is down or not." 
    insufficient_data_actions = [] 
} 

resource "aws_route53_health_check" "val1-hc" { 
    fqdn = "${aws_route53_record.val1-record.name}" 
    port = 27017 
    type = "TCP" 
    failure_threshold = "3" 
    request_interval = "30" 
    measure_latency = 1 
    cloudwatch_alarm_name = "${aws_cloudwatch_metric_alarm.val1-alarm.alarm_name}" 
    cloudwatch_alarm_region = "eu-central-1" 
} 

See CloudWatch Alarm Example from here

+0

У меня была та же проблема, что и у OP, но приведенное выше предложение не сработало для меня, панель мониторинга Route53 Health по-прежнему говорит «Нет настроенных аварийных сигналов». Есть идеи? – DuffJ

1

На терраформировать 0.9.3, я должен был сделать наоборот и удалить cloudwatch_alarm_name и cloudwatch_alarm_region из aws_route53_health_check ресурса, чтобы получить сигнал тревоги для подключения к проверке работоспособности. Он чувствовал себя в обратном направлении. Измерения HealthCheckId были достаточными для их объединения.

resource "aws_cloudwatch_metric_alarm" "val1-alarm" { 
    alarm_name = "val-alarm" 
    comparison_operator = "LessThanOrEqualToThreshold" 
    evaluation_periods = "2" 
    metric_name = "HealthCheckStatus" 
    namespace = "AWS/Route53" 
    period = "60" 
    statistic = "Minimum" 
    threshold = "0" 
    dimensions { 
    HealthCheckId = "${aws_route53_health_check.val1-hc.id}" 
    } 
    alarm_description = "This metric monitor whether the server is down or not." 
    insufficient_data_actions = [] 
} 

resource "aws_route53_health_check" "val1-hc" { 
    fqdn = "${aws_route53_record.val1-record.name}" 
    port = 27017 
    type = "TCP" 
    failure_threshold = "3" 
    request_interval = "30" 
    measure_latency = 1 
} 
+0

У вас все еще есть «cloudwatch_alarm_name» и «cloudwatch_alarm_region» в ресурсе 'aws_route53_health_check.val1-hc'. – vikas027

+0

Спасибо, @ vikas027! Я так сконцентрировался на форматировании кода, я забыл отредактировать код! :) –

+0

Все в порядке, но действительно ли этот код работает для вас? Я имею в виду, есть и другие ресурсы. Это не работает от меня. См. [This] (https://github.com/hashicorp/terraform/issues/13895) – vikas027

1

Не то, что вам нужно иметь свои ресурсы в США Востоке (N. Virginia) с:

Amazon Route 53 метрик не доступны, если вы выберете какой-либо другой регион как ток область.

Источник: Monitoring Health Check Status and Getting Notifications.

мне удалось заставить его работать с eu-west-1 с этим модулем:

variable "environment" {} 
variable "domain_name" {} 
variable "resource_path" {} 

provider "aws" { 
    alias = "use1" 
    region = "us-east-1" 
} 

resource "aws_route53_health_check" "health_check" { 
    fqdn    = "${var.domain_name}" 
    port    = 443 
    type    = "HTTPS" 
    resource_path  = "${var.resource_path}" 
    measure_latency = true 
    request_interval = 30 
    failure_threshold = 3 

    tags = { 
    Name  = "${var.environment}" 
    Origin  = "terraform" 
    Environment = "${var.environment}" 
    } 
} 

resource "aws_sns_topic" "topic" { 
    name  = "${var.environment}-healthcheck" 
    provider = "aws.use1" 
} 

resource "aws_cloudwatch_metric_alarm" "metric_alarm" { 
    provider     = "aws.use1" 
    alarm_name    = "${var.environment}-alarm-health-check" 
    comparison_operator  = "LessThanThreshold" 
    evaluation_periods  = "1" 
    metric_name    = "HealthCheckStatus" 
    namespace     = "AWS/Route53" 
    period     = "60" 
    statistic     = "Minimum" 
    threshold     = "1" 
    insufficient_data_actions = [] 
    alarm_actions    = ["${aws_sns_topic.topic.arn}"] 
    alarm_description   = "Send an alarm if ${var.environment} is down" 

    dimensions { 
    HealthCheckId = "${aws_route53_health_check.health_check.id}" 
    } 
}