Subchapter 103.9
references/setting-up-a-route53-health-check.mdMarkdown11 KBView on GitHub
Domain expertise for creating a Route 53 health check that monitors whether an endpoint is up, choosing the right check type, handling private targets that public health checkers cannot reach, and wiring the check to a CloudWatch alarm and an Amazon Simple Notification Service (SNS) topic so someone is told when the endpoint goes unhealthy.
Does not cover the failover routing policy itself (that is the failover skill) or record creation. A health check changes routing and raises alarms; it does not create records.
Execute commands using the AWS MCP server when connected (sandboxed execution, audit logging, observability). Fall back to the AWS CLI otherwise.
To create a health check and wire notifications, follow the procedure exactly. See the Procedure section below.
The procedure covers:
| Type | Use when |
|---|---|
| Endpoint monitoring | A public HTTP, HTTPS, or TCP target |
| Calculated | The aggregate health of several child checks |
| CloudWatch alarm-based | A private resource, or any signal expressed as a CloudWatch metric |
Constraints:
| Choice | Use when |
|---|---|
| Evaluate Target Health | The record is an alias to an AWS resource that reports its own health (ELB and other internal AWS targets). Free, nothing extra to maintain |
| Custom health check | The customer needs to monitor something ETH does not cover: a specific path, a non-ELB target, or a calculated combination |
Constraints:
Constraints:
Constraints:
--attributes KmsMasterKeyId={kms_key_id}, or confirm an existing sns_topic_arn has SSE
enabled), because the notification content can reveal endpoint and infrastructure topologyThis procedure creates a Route 53 health check that monitors whether an endpoint is up. It chooses the check type, handles targets behind an Elastic Load Balancer (ELB) with Evaluate Target Health (ETH), handles private resources public checkers cannot reach, wires a CloudWatch alarm and SNS topic for notifications, and surfaces the console link to verify.
endpoint, calculated, or cloudwatch-alarm.HTTP, HTTPS, or TCP./health).Constraints for parameter acquisition:
Constraints:
aws sts get-caller-identityaws sts assume-role) rather than long-lived IAM user access keys.Constraints:
Constraints:
For a public endpoint:
aws route53 create-health-check --caller-reference {ref} --health-check-config '{
"Type": "{protocol}", "FullyQualifiedDomainName": "{fqdn}", "Port": {port},
"ResourcePath": "{resource_path}", "RequestInterval": 30, "FailureThreshold": 3
}'For a calculated check (aggregate health of several child checks):
aws route53 create-health-check --caller-reference {ref} --health-check-config '{
"Type": "CALCULATED",
"ChildHealthChecks": ["{child_health_check_id_1}", "{child_health_check_id_2}"],
"HealthThreshold": 1
}'HealthThreshold is the minimum number of child checks that must be healthy for the calculated
check to report Healthy.
For a CloudWatch alarm-based check:
aws route53 create-health-check --caller-reference {ref} --health-check-config '{
"Type": "CLOUDWATCH_METRIC", "AlarmIdentifier": {"Region": "{region}", "Name": "{alarm_name}"},
"InsufficientDataHealthStatus": "Unhealthy"
}'Use "Unhealthy" as the default: a data gap forces the check unhealthy and acts on it rather
than masking it. Override to "LastKnownStatus" only for standalone monitoring where spurious
flaps from transient metric gaps are costlier than delayed detection.
Constraints:
If notify is true, you MUST create a CloudWatch alarm on the health check status metric and
point it at an SNS topic. You MUST enable KMS SSE on that topic — create a new topic with
aws sns create-topic --name {topic} --attributes KmsMasterKeyId={kms_key_id}, or confirm a
provided sns_topic_arn already has SSE enabled — because notification content can reveal
infrastructure topology:
aws cloudwatch put-metric-alarm \
--alarm-name {alarm_name} --namespace AWS/Route53 \
--metric-name HealthCheckStatus --dimensions Name=HealthCheckId,Value={health_check_id} \
--statistic Minimum --period 60 --threshold 1 \
--comparison-operator LessThanThreshold --evaluation-periods 1 \
--alarm-actions {sns_topic_arn} --region us-east-1You MUST confirm the SNS topic’s subscription list is limited to authorized personnel before wiring the alarm, because health-check notifications reveal endpoint topology and availability status
Constraints:
You MUST verify the check reports Healthy for a known-good target
You MUST present the health check details console view, filling {healthCheckId}:
https://console.aws.amazon.com/route53/v2/healthchecks/home#/details/{healthCheckId}{
"target": "app.example.com",
"check_type": "endpoint",
"protocol": "HTTPS",
"resource_path": "/health",
"notify": true
}Created HTTPS health check for app.example.com/health, wired to a CloudWatch alarm and SNS topic.
Verify in the console:
https://console.aws.amazon.com/route53/v2/healthchecks/home#/details/abcd1234-...The VPC security group may not allow inbound traffic from Route 53 health checkers. Add the
AWS-managed prefix list com.amazonaws.<region>.route53-healthchecks to the security group. If
the target is fully private, use ETH on the alias record or a CloudWatch alarm-based check
(Step 2). See Configuring router and firewall rules for Route 53 health checks (opens in a new tab).
Those fields are immutable. Delete and recreate the check (Step 2).
A custom check duplicates the ELB’s monitoring. Use ETH on the alias-to-ELB record (Step 2).
The check is not wired to an alarm and topic. Add a CloudWatch alarm and SNS topic (Step 4).
aws sts assume-role) rather than
long-lived IAM user access keys, and prefer read-only credentials for inspection steps.