Я пытаюсь создать новую проверку работоспособности Route 53 с сигналом тревоги, который должен срабатывать в случае сбоя проверки работоспособности. Я использую следующую команду и конфигурацию проверки работоспособности:
aws route53 create-health-check --caller-reference cw-20240607 \
--health-check-config file://health_check_config.json
{
"Type": "HTTPS_STR_MATCH",
"FullyQualifiedDomainName": "https://api.dev.somedomain.dev",
"Port": 443,
"ResourcePath": "/health",
"SearchString": "\"status\":\"ok\"",
"EnableSNI": true,
"AlarmIdentifier": {
"Name": "regen-api-health-check",
"Region": "us-east-1"
}
}
Я получаю следующую ошибку:
An error occurred (InvalidInput) when calling the CreateHealthCheck operation:
Invalid parameter : Basic health checks must not have an metric region specified.
Я попробовал удалить регион из AlarmIdentifier
, но, конечно, это обязательный параметр, поэтому новая ошибка:
Parameter validation failed:
Missing required parameter in HealthCheckConfig.AlarmIdentifier: "Region"
Я нашел эту проблему шестилетней давности в репозитории aws-sdk-php, которая указывает на то, что вы не можете указать AlarmIdentifier
с «базовой» проверкой работоспособности. Однако я не могу найти в документации никаких упоминаний о том, что представляет собой «базовая» проверка работоспособности или какая конфигурация позволила бы мне указать идентификатор сигнала тревоги.
Итак, мои вопросы:
Кстати, сначала я попытался сделать это с помощью CloudFormation, но ошибка, которую он продолжал выдавать, была крайне бесполезной и неспецифичной:
Resource handler returned message: "Invalid request provided: AWS::Route53::HealthCheck"
В конце концов я понял, что AlarmIdentifier
не предназначен для указания тревоги, которую должна вызвать проверка работоспособности. Правильный способ связать сигнал тревоги CloudWatch с проверкой работоспособности — указать HealthCheckId
в параметре размеров при создании сигнала тревоги. Используя CLI, это выглядит так:
aws route53 create-health-check --caller-reference cw-20240607 \
--health-check-config file://health_check_config.json
aws cloudwatch put-metric-alarm --alarm-name my-api-health-check \
--namespace AWS/Route53 --metric-name HealthCheckStatus \
--dimensions "Name=HealthCheckId,Value=<health check ID>" \
--comparison-operator LessThanThreshold --statistic Average --period 60 \
--threshold 1 --evaluation-periods 3 --datapoints-to-alarm 3 \
--alarm-actions "arn:aws:sns:us-east-1:<account ID>:my-alerts"
health_check_config.json
содержание:
{
"Type": "HTTPS_STR_MATCH",
"FullyQualifiedDomainName": "api.dev.somedomain.dev",
"Port": 443,
"ResourcePath": "/health",
"SearchString": "\"status\":\"ok\"",
"EnableSNI": true,
"Regions": ["us-east-1", "us-west-1", "us-west-2"]
}
Как только исправление стало очевидным, я смог развернуть проверку работоспособности и оповещение через CloudFormation:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Testing Health Check and Alarm config",
"Resources": {
"Route53HealthCheck": {
"Type": "AWS::Route53::HealthCheck",
"Properties": {
"HealthCheckConfig": {
"Type": "HTTPS_STR_MATCH",
"FullyQualifiedDomainName": "api.dev.somedomain.dev",
"Port": 443,
"ResourcePath": "/health",
"SearchString": "\"status\":\"ok\"",
"EnableSNI": true,
"Regions": ["us-east-1", "us-west-1", "us-west-2"]
}
}
},
"HealthCheckAlarm": {
"Type": "AWS::CloudWatch::Alarm",
"Properties": {
"AlarmName": "my-api-health-check",
"Namespace": "AWS/Route53",
"MetricName": "HealthCheckStatus",
"ComparisonOperator": "LessThanThreshold",
"Statistic": "Average",
"Period": 60,
"Threshold": 1,
"DatapointsToAlarm": 3,
"EvaluationPeriods": 3,
"AlarmActions": [
{
"Fn::Join": [
":",
["arn:aws:sns", { "Ref": "AWS::Region" }, { "Ref": "AWS::AccountId" }, "my-alerts"]
]
}
],
"OKActions": [
{
"Fn::Join": [
":",
["arn:aws:sns", { "Ref": "AWS::Region" }, { "Ref": "AWS::AccountId" }, "my-alerts"]
]
}
],
"Dimensions": [
{
"Name": "HealthCheckId",
"Value": { "Fn::GetAtt": ["Route53HealthCheck", "HealthCheckId"] }
}
]
}
}
}
}
Кажется, я неправильно понял, для чего нужен
AlarmIdentifier
. Похоже, он используется для проверки работоспособности с помощью типаCLOUDWATCH_METRIC
, а не для мониторинга конечных точек.