Merge pull request #8319 from hashicorp/aws-route53-cloudwatch-metric
provider/aws: Implement support for CloudWatch Metric in `aws_route53_health_check`
This commit is contained in:
commit
e2445497ab
|
@ -69,6 +69,7 @@ func resourceAwsRoute53HealthCheck() *schema.Resource {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
"measure_latency": &schema.Schema{
|
"measure_latency": &schema.Schema{
|
||||||
Type: schema.TypeBool,
|
Type: schema.TypeBool,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
@ -95,6 +96,21 @@ func resourceAwsRoute53HealthCheck() *schema.Resource {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"cloudwatch_alarm_name": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"cloudwatch_alarm_region": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"insufficient_data_health_status": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
"tags": tagsSchema(),
|
"tags": tagsSchema(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -135,6 +151,19 @@ func resourceAwsRoute53HealthCheckUpdate(d *schema.ResourceData, meta interface{
|
||||||
updateHealthCheck.HealthThreshold = aws.Int64(int64(d.Get("child_health_threshold").(int)))
|
updateHealthCheck.HealthThreshold = aws.Int64(int64(d.Get("child_health_threshold").(int)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if d.HasChange("cloudwatch_alarm_name") || d.HasChange("cloudwatch_alarm_region") {
|
||||||
|
cloudwatchAlarm := &route53.AlarmIdentifier{
|
||||||
|
Name: aws.String(d.Get("cloudwatch_alarm_name").(string)),
|
||||||
|
Region: aws.String(d.Get("cloudwatch_alarm_region").(string)),
|
||||||
|
}
|
||||||
|
|
||||||
|
updateHealthCheck.AlarmIdentifier = cloudwatchAlarm
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.HasChange("insufficient_data_health_status") {
|
||||||
|
updateHealthCheck.InsufficientDataHealthStatus = aws.String(d.Get("insufficient_data_health_status").(string))
|
||||||
|
}
|
||||||
|
|
||||||
_, err := conn.UpdateHealthCheck(updateHealthCheck)
|
_, err := conn.UpdateHealthCheck(updateHealthCheck)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -182,7 +211,7 @@ func resourceAwsRoute53HealthCheckCreate(d *schema.ResourceData, meta interface{
|
||||||
healthConfig.ResourcePath = aws.String(v.(string))
|
healthConfig.ResourcePath = aws.String(v.(string))
|
||||||
}
|
}
|
||||||
|
|
||||||
if *healthConfig.Type != route53.HealthCheckTypeCalculated {
|
if *healthConfig.Type != route53.HealthCheckTypeCalculated && *healthConfig.Type != route53.HealthCheckTypeCloudwatchMetric {
|
||||||
if v, ok := d.GetOk("measure_latency"); ok {
|
if v, ok := d.GetOk("measure_latency"); ok {
|
||||||
healthConfig.MeasureLatency = aws.Bool(v.(bool))
|
healthConfig.MeasureLatency = aws.Bool(v.(bool))
|
||||||
}
|
}
|
||||||
|
@ -202,6 +231,24 @@ func resourceAwsRoute53HealthCheckCreate(d *schema.ResourceData, meta interface{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *healthConfig.Type == route53.HealthCheckTypeCloudwatchMetric {
|
||||||
|
cloudwatchAlarmIdentifier := &route53.AlarmIdentifier{}
|
||||||
|
|
||||||
|
if v, ok := d.GetOk("cloudwatch_alarm_name"); ok {
|
||||||
|
cloudwatchAlarmIdentifier.Name = aws.String(v.(string))
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, ok := d.GetOk("cloudwatch_alarm_region"); ok {
|
||||||
|
cloudwatchAlarmIdentifier.Region = aws.String(v.(string))
|
||||||
|
}
|
||||||
|
|
||||||
|
healthConfig.AlarmIdentifier = cloudwatchAlarmIdentifier
|
||||||
|
|
||||||
|
if v, ok := d.GetOk("insufficient_data_health_status"); ok {
|
||||||
|
healthConfig.InsufficientDataHealthStatus = aws.String(v.(string))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
input := &route53.CreateHealthCheckInput{
|
input := &route53.CreateHealthCheckInput{
|
||||||
CallerReference: aws.String(time.Now().Format(time.RFC3339Nano)),
|
CallerReference: aws.String(time.Now().Format(time.RFC3339Nano)),
|
||||||
HealthCheckConfig: healthConfig,
|
HealthCheckConfig: healthConfig,
|
||||||
|
@ -252,6 +299,12 @@ func resourceAwsRoute53HealthCheckRead(d *schema.ResourceData, meta interface{})
|
||||||
d.Set("invert_healthcheck", updated.Inverted)
|
d.Set("invert_healthcheck", updated.Inverted)
|
||||||
d.Set("child_healthchecks", updated.ChildHealthChecks)
|
d.Set("child_healthchecks", updated.ChildHealthChecks)
|
||||||
d.Set("child_health_threshold", updated.HealthThreshold)
|
d.Set("child_health_threshold", updated.HealthThreshold)
|
||||||
|
d.Set("insufficient_data_health_status", updated.InsufficientDataHealthStatus)
|
||||||
|
|
||||||
|
if updated.AlarmIdentifier != nil {
|
||||||
|
d.Set("cloudwatch_alarm_name", updated.AlarmIdentifier.Name)
|
||||||
|
d.Set("cloudwatch_alarm_region", updated.AlarmIdentifier.Region)
|
||||||
|
}
|
||||||
|
|
||||||
// read the tags
|
// read the tags
|
||||||
req := &route53.ListTagsForResourceInput{
|
req := &route53.ListTagsForResourceInput{
|
||||||
|
|
|
@ -73,6 +73,24 @@ func TestAccAWSRoute53HealthCheck_IpConfig(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAccAWSRoute53HealthCheck_CloudWatchAlarmCheck(t *testing.T) {
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckRoute53HealthCheckDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccRoute53HealthCheckCloudWatchAlarm,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckRoute53HealthCheckExists("aws_route53_health_check.foo"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_route53_health_check.foo", "cloudwatch_alarm_name", "cloudwatch-healthcheck-alarm"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func testAccCheckRoute53HealthCheckDestroy(s *terraform.State) error {
|
func testAccCheckRoute53HealthCheckDestroy(s *terraform.State) error {
|
||||||
conn := testAccProvider.Meta().(*AWSClient).r53conn
|
conn := testAccProvider.Meta().(*AWSClient).r53conn
|
||||||
|
|
||||||
|
@ -208,3 +226,24 @@ resource "aws_route53_health_check" "foo" {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const testAccRoute53HealthCheckCloudWatchAlarm = `
|
||||||
|
resource "aws_cloudwatch_metric_alarm" "foobar" {
|
||||||
|
alarm_name = "cloudwatch-healthcheck-alarm"
|
||||||
|
comparison_operator = "GreaterThanOrEqualToThreshold"
|
||||||
|
evaluation_periods = "2"
|
||||||
|
metric_name = "CPUUtilization"
|
||||||
|
namespace = "AWS/EC2"
|
||||||
|
period = "120"
|
||||||
|
statistic = "Average"
|
||||||
|
threshold = "80"
|
||||||
|
alarm_description = "This metric monitor ec2 cpu utilization"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_health_check" "foo" {
|
||||||
|
type = "CLOUDWATCH_METRIC"
|
||||||
|
cloudwatch_alarm_name = "${aws_cloudwatch_metric_alarm.foobar.alarm_name}"
|
||||||
|
cloudwatch_alarm_region = "us-west-2"
|
||||||
|
insufficient_data_health_status = "Healthy"
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
|
@ -36,6 +36,29 @@ resource "aws_route53_health_check" "foo" {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## CloudWatch Alarm Example
|
||||||
|
|
||||||
|
```
|
||||||
|
resource "aws_cloudwatch_metric_alarm" "foobar" {
|
||||||
|
alarm_name = "terraform-test-foobar5"
|
||||||
|
comparison_operator = "GreaterThanOrEqualToThreshold"
|
||||||
|
evaluation_periods = "2"
|
||||||
|
metric_name = "CPUUtilization"
|
||||||
|
namespace = "AWS/EC2"
|
||||||
|
period = "120"
|
||||||
|
statistic = "Average"
|
||||||
|
threshold = "80"
|
||||||
|
alarm_description = "This metric monitor ec2 cpu utilization"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_health_check" "foo" {
|
||||||
|
type = "CLOUDWATCH_METRIC"
|
||||||
|
cloudwatch_alarm_name = "${aws_cloudwatch_metric_alarm.foobar.alarm_name}"
|
||||||
|
cloudwatch_alarm_region = "us-west-2"
|
||||||
|
insufficient_data_health_status = "Healthy"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Argument Reference
|
## Argument Reference
|
||||||
|
|
||||||
The following arguments are supported:
|
The following arguments are supported:
|
||||||
|
@ -43,7 +66,7 @@ The following arguments are supported:
|
||||||
* `fqdn` - (Optional) The fully qualified domain name of the endpoint to be checked.
|
* `fqdn` - (Optional) The fully qualified domain name of the endpoint to be checked.
|
||||||
* `ip_address` - (Optional) The IP address of the endpoint to be checked.
|
* `ip_address` - (Optional) The IP address of the endpoint to be checked.
|
||||||
* `port` - (Optional) The port of the endpoint to be checked.
|
* `port` - (Optional) The port of the endpoint to be checked.
|
||||||
* `type` - (Required) The protocol to use when performing health checks. Valid values are `HTTP`, `HTTPS`, `HTTP_STR_MATCH`, `HTTPS_STR_MATCH`, `TCP` and `CALCULATED`.
|
* `type` - (Required) The protocol to use when performing health checks. Valid values are `HTTP`, `HTTPS`, `HTTP_STR_MATCH`, `HTTPS_STR_MATCH`, `TCP`, `CALCULATED` and `CLOUDWATCH_METRIC`.
|
||||||
* `failure_threshold` - (Required) The number of consecutive health checks that an endpoint must pass or fail.
|
* `failure_threshold` - (Required) The number of consecutive health checks that an endpoint must pass or fail.
|
||||||
* `request_interval` - (Required) The number of seconds between the time that Amazon Route 53 gets a response from your endpoint and the time that it sends the next health-check request.
|
* `request_interval` - (Required) The number of seconds between the time that Amazon Route 53 gets a response from your endpoint and the time that it sends the next health-check request.
|
||||||
* `resource_path` - (Optional) The path that you want Amazon Route 53 to request when performing health checks.
|
* `resource_path` - (Optional) The path that you want Amazon Route 53 to request when performing health checks.
|
||||||
|
@ -52,6 +75,10 @@ The following arguments are supported:
|
||||||
* `invert_healthcheck` - (Optional) A boolean value that indicates whether the status of health check should be inverted. For example, if a health check is healthy but Inverted is True , then Route 53 considers the health check to be unhealthy.
|
* `invert_healthcheck` - (Optional) A boolean value that indicates whether the status of health check should be inverted. For example, if a health check is healthy but Inverted is True , then Route 53 considers the health check to be unhealthy.
|
||||||
* `child_healthchecks` - (Optional) For a specified parent health check, a list of HealthCheckId values for the associated child health checks.
|
* `child_healthchecks` - (Optional) For a specified parent health check, a list of HealthCheckId values for the associated child health checks.
|
||||||
* `child_health_threshold` - (Optional) The minimum number of child health checks that must be healthy for Route 53 to consider the parent health check to be healthy. Valid values are integers between 0 and 256, inclusive
|
* `child_health_threshold` - (Optional) The minimum number of child health checks that must be healthy for Route 53 to consider the parent health check to be healthy. Valid values are integers between 0 and 256, inclusive
|
||||||
|
* `cloudwatch_alarm_name` - (Optional) The name of the CloudWatch alarm.
|
||||||
|
* `cloudwatch_alarm_region` - (Optional) The CloudWatchRegion that the CloudWatch alarm was created in.
|
||||||
|
* `insufficient_data_health_status` - (Optional) The status of the health check when CloudWatch has insufficient data about the state of associated alarm. Valid values are `Healthy` , `Unhealthy` and `LastKnownStatus`.
|
||||||
|
|
||||||
* `tags` - (Optional) A mapping of tags to assign to the health check.
|
* `tags` - (Optional) A mapping of tags to assign to the health check.
|
||||||
|
|
||||||
At least one of either `fqdn` or `ip_address` must be specified.
|
At least one of either `fqdn` or `ip_address` must be specified.
|
||||||
|
|
Loading…
Reference in New Issue