github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_autoscaling_group_test.go (about) 1 package aws 2 3 import ( 4 "errors" 5 "fmt" 6 "reflect" 7 "regexp" 8 "sort" 9 "strings" 10 "testing" 11 12 "github.com/aws/aws-sdk-go/aws" 13 "github.com/aws/aws-sdk-go/aws/awserr" 14 "github.com/aws/aws-sdk-go/service/autoscaling" 15 "github.com/aws/aws-sdk-go/service/elbv2" 16 "github.com/hashicorp/terraform/helper/acctest" 17 "github.com/hashicorp/terraform/helper/resource" 18 "github.com/hashicorp/terraform/terraform" 19 ) 20 21 func TestAccAWSAutoScalingGroup_basic(t *testing.T) { 22 var group autoscaling.Group 23 var lc autoscaling.LaunchConfiguration 24 25 randName := fmt.Sprintf("terraform-test-%s", acctest.RandString(10)) 26 27 resource.Test(t, resource.TestCase{ 28 PreCheck: func() { testAccPreCheck(t) }, 29 IDRefreshName: "aws_autoscaling_group.bar", 30 IDRefreshIgnore: []string{"force_delete", "metrics_granularity", "wait_for_capacity_timeout"}, 31 Providers: testAccProviders, 32 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 33 Steps: []resource.TestStep{ 34 resource.TestStep{ 35 Config: testAccAWSAutoScalingGroupConfig(randName), 36 Check: resource.ComposeTestCheckFunc( 37 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 38 testAccCheckAWSAutoScalingGroupHealthyCapacity(&group, 2), 39 testAccCheckAWSAutoScalingGroupAttributes(&group, randName), 40 resource.TestCheckResourceAttr( 41 "aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"), 42 resource.TestCheckResourceAttr( 43 "aws_autoscaling_group.bar", "name", randName), 44 resource.TestCheckResourceAttr( 45 "aws_autoscaling_group.bar", "max_size", "5"), 46 resource.TestCheckResourceAttr( 47 "aws_autoscaling_group.bar", "min_size", "2"), 48 resource.TestCheckResourceAttr( 49 "aws_autoscaling_group.bar", "health_check_grace_period", "300"), 50 resource.TestCheckResourceAttr( 51 "aws_autoscaling_group.bar", "health_check_type", "ELB"), 52 resource.TestCheckResourceAttr( 53 "aws_autoscaling_group.bar", "desired_capacity", "4"), 54 resource.TestCheckResourceAttr( 55 "aws_autoscaling_group.bar", "force_delete", "true"), 56 resource.TestCheckResourceAttr( 57 "aws_autoscaling_group.bar", "termination_policies.0", "OldestInstance"), 58 resource.TestCheckResourceAttr( 59 "aws_autoscaling_group.bar", "termination_policies.1", "ClosestToNextInstanceHour"), 60 resource.TestCheckResourceAttr( 61 "aws_autoscaling_group.bar", "protect_from_scale_in", "false"), 62 ), 63 }, 64 65 resource.TestStep{ 66 Config: testAccAWSAutoScalingGroupConfigUpdate(randName), 67 Check: resource.ComposeTestCheckFunc( 68 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 69 testAccCheckAWSLaunchConfigurationExists("aws_launch_configuration.new", &lc), 70 resource.TestCheckResourceAttr( 71 "aws_autoscaling_group.bar", "desired_capacity", "5"), 72 resource.TestCheckResourceAttr( 73 "aws_autoscaling_group.bar", "termination_policies.0", "ClosestToNextInstanceHour"), 74 resource.TestCheckResourceAttr( 75 "aws_autoscaling_group.bar", "protect_from_scale_in", "true"), 76 testLaunchConfigurationName("aws_autoscaling_group.bar", &lc), 77 testAccCheckAutoscalingTags(&group.Tags, "Bar", map[string]interface{}{ 78 "value": "bar-foo", 79 "propagate_at_launch": true, 80 }), 81 ), 82 }, 83 }, 84 }) 85 } 86 87 func TestAccAWSAutoScalingGroup_autoGeneratedName(t *testing.T) { 88 asgNameRegexp := regexp.MustCompile("^tf-asg-") 89 90 resource.Test(t, resource.TestCase{ 91 PreCheck: func() { testAccPreCheck(t) }, 92 Providers: testAccProviders, 93 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 94 Steps: []resource.TestStep{ 95 resource.TestStep{ 96 Config: testAccAWSAutoScalingGroupConfig_autoGeneratedName, 97 Check: resource.ComposeTestCheckFunc( 98 resource.TestMatchResourceAttr( 99 "aws_autoscaling_group.bar", "name", asgNameRegexp), 100 resource.TestCheckResourceAttrSet( 101 "aws_autoscaling_group.bar", "arn"), 102 ), 103 }, 104 }, 105 }) 106 } 107 108 func TestAccAWSAutoScalingGroup_terminationPolicies(t *testing.T) { 109 resource.Test(t, resource.TestCase{ 110 PreCheck: func() { testAccPreCheck(t) }, 111 Providers: testAccProviders, 112 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 113 Steps: []resource.TestStep{ 114 resource.TestStep{ 115 Config: testAccAWSAutoScalingGroupConfig_terminationPoliciesEmpty, 116 Check: resource.ComposeTestCheckFunc( 117 resource.TestCheckResourceAttr( 118 "aws_autoscaling_group.bar", "termination_policies.#", "0"), 119 ), 120 }, 121 122 resource.TestStep{ 123 Config: testAccAWSAutoScalingGroupConfig_terminationPoliciesUpdate, 124 Check: resource.ComposeTestCheckFunc( 125 resource.TestCheckResourceAttr( 126 "aws_autoscaling_group.bar", "termination_policies.#", "1"), 127 resource.TestCheckResourceAttr( 128 "aws_autoscaling_group.bar", "termination_policies.0", "OldestInstance"), 129 ), 130 }, 131 132 resource.TestStep{ 133 Config: testAccAWSAutoScalingGroupConfig_terminationPoliciesExplicitDefault, 134 Check: resource.ComposeTestCheckFunc( 135 resource.TestCheckResourceAttr( 136 "aws_autoscaling_group.bar", "termination_policies.#", "1"), 137 resource.TestCheckResourceAttr( 138 "aws_autoscaling_group.bar", "termination_policies.0", "Default"), 139 ), 140 }, 141 142 resource.TestStep{ 143 Config: testAccAWSAutoScalingGroupConfig_terminationPoliciesEmpty, 144 Check: resource.ComposeTestCheckFunc( 145 resource.TestCheckResourceAttr( 146 "aws_autoscaling_group.bar", "termination_policies.#", "0"), 147 ), 148 }, 149 }, 150 }) 151 } 152 153 func TestAccAWSAutoScalingGroup_tags(t *testing.T) { 154 var group autoscaling.Group 155 156 randName := fmt.Sprintf("tfautotags-%s", acctest.RandString(5)) 157 158 resource.Test(t, resource.TestCase{ 159 PreCheck: func() { testAccPreCheck(t) }, 160 Providers: testAccProviders, 161 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 162 Steps: []resource.TestStep{ 163 resource.TestStep{ 164 Config: testAccAWSAutoScalingGroupConfig(randName), 165 Check: resource.ComposeTestCheckFunc( 166 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 167 testAccCheckAutoscalingTags(&group.Tags, "Foo", map[string]interface{}{ 168 "value": "foo-bar", 169 "propagate_at_launch": true, 170 }), 171 ), 172 }, 173 174 resource.TestStep{ 175 Config: testAccAWSAutoScalingGroupConfigUpdate(randName), 176 Check: resource.ComposeTestCheckFunc( 177 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 178 testAccCheckAutoscalingTagNotExists(&group.Tags, "Foo"), 179 testAccCheckAutoscalingTags(&group.Tags, "Bar", map[string]interface{}{ 180 "value": "bar-foo", 181 "propagate_at_launch": true, 182 }), 183 ), 184 }, 185 }, 186 }) 187 } 188 189 func TestAccAWSAutoScalingGroup_VpcUpdates(t *testing.T) { 190 var group autoscaling.Group 191 192 resource.Test(t, resource.TestCase{ 193 PreCheck: func() { testAccPreCheck(t) }, 194 Providers: testAccProviders, 195 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 196 Steps: []resource.TestStep{ 197 resource.TestStep{ 198 Config: testAccAWSAutoScalingGroupConfigWithAZ, 199 Check: resource.ComposeTestCheckFunc( 200 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 201 resource.TestCheckResourceAttr( 202 "aws_autoscaling_group.bar", "availability_zones.#", "1"), 203 resource.TestCheckResourceAttr( 204 "aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"), 205 resource.TestCheckResourceAttr( 206 "aws_autoscaling_group.bar", "vpc_zone_identifier.#", "1"), 207 ), 208 }, 209 210 resource.TestStep{ 211 Config: testAccAWSAutoScalingGroupConfigWithVPCIdent, 212 Check: resource.ComposeTestCheckFunc( 213 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 214 testAccCheckAWSAutoScalingGroupAttributesVPCZoneIdentifer(&group), 215 resource.TestCheckResourceAttr( 216 "aws_autoscaling_group.bar", "availability_zones.#", "1"), 217 resource.TestCheckResourceAttr( 218 "aws_autoscaling_group.bar", "availability_zones.2487133097", "us-west-2a"), 219 resource.TestCheckResourceAttr( 220 "aws_autoscaling_group.bar", "vpc_zone_identifier.#", "1"), 221 ), 222 }, 223 }, 224 }) 225 } 226 227 func TestAccAWSAutoScalingGroup_WithLoadBalancer(t *testing.T) { 228 var group autoscaling.Group 229 230 resource.Test(t, resource.TestCase{ 231 PreCheck: func() { testAccPreCheck(t) }, 232 Providers: testAccProviders, 233 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 234 Steps: []resource.TestStep{ 235 resource.TestStep{ 236 Config: testAccAWSAutoScalingGroupConfigWithLoadBalancer, 237 Check: resource.ComposeTestCheckFunc( 238 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 239 testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(&group), 240 ), 241 }, 242 }, 243 }) 244 } 245 246 func TestAccAWSAutoScalingGroup_withPlacementGroup(t *testing.T) { 247 var group autoscaling.Group 248 249 randName := fmt.Sprintf("tf_placement_test-%s", acctest.RandString(5)) 250 resource.Test(t, resource.TestCase{ 251 PreCheck: func() { testAccPreCheck(t) }, 252 Providers: testAccProviders, 253 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 254 Steps: []resource.TestStep{ 255 resource.TestStep{ 256 Config: testAccAWSAutoScalingGroupConfig_withPlacementGroup(randName), 257 Check: resource.ComposeTestCheckFunc( 258 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 259 resource.TestCheckResourceAttr( 260 "aws_autoscaling_group.bar", "placement_group", randName), 261 ), 262 }, 263 }, 264 }) 265 } 266 267 func TestAccAWSAutoScalingGroup_enablingMetrics(t *testing.T) { 268 var group autoscaling.Group 269 randName := fmt.Sprintf("terraform-test-%s", acctest.RandString(10)) 270 271 resource.Test(t, resource.TestCase{ 272 PreCheck: func() { testAccPreCheck(t) }, 273 Providers: testAccProviders, 274 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 275 Steps: []resource.TestStep{ 276 resource.TestStep{ 277 Config: testAccAWSAutoScalingGroupConfig(randName), 278 Check: resource.ComposeTestCheckFunc( 279 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 280 resource.TestCheckNoResourceAttr( 281 "aws_autoscaling_group.bar", "enabled_metrics"), 282 ), 283 }, 284 285 resource.TestStep{ 286 Config: testAccAWSAutoscalingMetricsCollectionConfig_updatingMetricsCollected, 287 Check: resource.ComposeTestCheckFunc( 288 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 289 resource.TestCheckResourceAttr( 290 "aws_autoscaling_group.bar", "enabled_metrics.#", "5"), 291 ), 292 }, 293 }, 294 }) 295 } 296 297 func TestAccAWSAutoScalingGroup_suspendingProcesses(t *testing.T) { 298 var group autoscaling.Group 299 randName := fmt.Sprintf("terraform-test-%s", acctest.RandString(10)) 300 301 resource.Test(t, resource.TestCase{ 302 PreCheck: func() { testAccPreCheck(t) }, 303 Providers: testAccProviders, 304 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 305 Steps: []resource.TestStep{ 306 { 307 Config: testAccAWSAutoScalingGroupConfig(randName), 308 Check: resource.ComposeTestCheckFunc( 309 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 310 resource.TestCheckResourceAttr( 311 "aws_autoscaling_group.bar", "suspended_processes.#", "0"), 312 ), 313 }, 314 { 315 Config: testAccAWSAutoScalingGroupConfigWithSuspendedProcesses(randName), 316 Check: resource.ComposeTestCheckFunc( 317 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 318 resource.TestCheckResourceAttr( 319 "aws_autoscaling_group.bar", "suspended_processes.#", "2"), 320 ), 321 }, 322 { 323 Config: testAccAWSAutoScalingGroupConfigWithSuspendedProcessesUpdated(randName), 324 Check: resource.ComposeTestCheckFunc( 325 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 326 resource.TestCheckResourceAttr( 327 "aws_autoscaling_group.bar", "suspended_processes.#", "2"), 328 ), 329 }, 330 }, 331 }) 332 } 333 334 func TestAccAWSAutoScalingGroup_withMetrics(t *testing.T) { 335 var group autoscaling.Group 336 337 resource.Test(t, resource.TestCase{ 338 PreCheck: func() { testAccPreCheck(t) }, 339 Providers: testAccProviders, 340 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 341 Steps: []resource.TestStep{ 342 resource.TestStep{ 343 Config: testAccAWSAutoscalingMetricsCollectionConfig_allMetricsCollected, 344 Check: resource.ComposeTestCheckFunc( 345 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 346 resource.TestCheckResourceAttr( 347 "aws_autoscaling_group.bar", "enabled_metrics.#", "7"), 348 ), 349 }, 350 351 resource.TestStep{ 352 Config: testAccAWSAutoscalingMetricsCollectionConfig_updatingMetricsCollected, 353 Check: resource.ComposeTestCheckFunc( 354 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 355 resource.TestCheckResourceAttr( 356 "aws_autoscaling_group.bar", "enabled_metrics.#", "5"), 357 ), 358 }, 359 }, 360 }) 361 } 362 363 func TestAccAWSAutoScalingGroup_ALB_TargetGroups(t *testing.T) { 364 var group autoscaling.Group 365 var tg elbv2.TargetGroup 366 var tg2 elbv2.TargetGroup 367 368 testCheck := func(targets []*elbv2.TargetGroup) resource.TestCheckFunc { 369 return func(*terraform.State) error { 370 var ts []string 371 var gs []string 372 for _, t := range targets { 373 ts = append(ts, *t.TargetGroupArn) 374 } 375 376 for _, s := range group.TargetGroupARNs { 377 gs = append(gs, *s) 378 } 379 380 sort.Strings(ts) 381 sort.Strings(gs) 382 383 if !reflect.DeepEqual(ts, gs) { 384 return fmt.Errorf("Error: target group match not found!\nASG Target groups: %#v\nTarget Group: %#v", ts, gs) 385 } 386 return nil 387 } 388 } 389 390 resource.Test(t, resource.TestCase{ 391 PreCheck: func() { testAccPreCheck(t) }, 392 Providers: testAccProviders, 393 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 394 Steps: []resource.TestStep{ 395 resource.TestStep{ 396 Config: testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_pre, 397 Check: resource.ComposeAggregateTestCheckFunc( 398 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 399 testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &tg), 400 resource.TestCheckResourceAttr( 401 "aws_autoscaling_group.bar", "target_group_arns.#", "0"), 402 ), 403 }, 404 405 resource.TestStep{ 406 Config: testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_post_duo, 407 Check: resource.ComposeAggregateTestCheckFunc( 408 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 409 testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &tg), 410 testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test_more", &tg2), 411 testCheck([]*elbv2.TargetGroup{&tg, &tg2}), 412 resource.TestCheckResourceAttr( 413 "aws_autoscaling_group.bar", "target_group_arns.#", "2"), 414 ), 415 }, 416 417 resource.TestStep{ 418 Config: testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_post, 419 Check: resource.ComposeAggregateTestCheckFunc( 420 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 421 testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &tg), 422 testCheck([]*elbv2.TargetGroup{&tg}), 423 resource.TestCheckResourceAttr( 424 "aws_autoscaling_group.bar", "target_group_arns.#", "1"), 425 ), 426 }, 427 428 resource.TestStep{ 429 Config: testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_pre, 430 Check: resource.ComposeAggregateTestCheckFunc( 431 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 432 resource.TestCheckResourceAttr( 433 "aws_autoscaling_group.bar", "target_group_arns.#", "0"), 434 ), 435 }, 436 }, 437 }) 438 } 439 440 func TestAccAWSAutoScalingGroup_initialLifecycleHook(t *testing.T) { 441 var group autoscaling.Group 442 443 randName := fmt.Sprintf("terraform-test-%s", acctest.RandString(10)) 444 445 resource.Test(t, resource.TestCase{ 446 PreCheck: func() { testAccPreCheck(t) }, 447 IDRefreshName: "aws_autoscaling_group.bar", 448 IDRefreshIgnore: []string{"force_delete", "metrics_granularity", "wait_for_capacity_timeout"}, 449 Providers: testAccProviders, 450 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 451 Steps: []resource.TestStep{ 452 resource.TestStep{ 453 Config: testAccAWSAutoScalingGroupWithHookConfig(randName), 454 Check: resource.ComposeTestCheckFunc( 455 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 456 testAccCheckAWSAutoScalingGroupHealthyCapacity(&group, 2), 457 resource.TestCheckResourceAttr( 458 "aws_autoscaling_group.bar", "initial_lifecycle_hook.#", "1"), 459 resource.TestCheckResourceAttr( 460 "aws_autoscaling_group.bar", "initial_lifecycle_hook.391359060.default_result", "CONTINUE"), 461 resource.TestCheckResourceAttr( 462 "aws_autoscaling_group.bar", "initial_lifecycle_hook.391359060.name", "launching"), 463 testAccCheckAWSAutoScalingGroupInitialLifecycleHookExists( 464 "aws_autoscaling_group.bar", "initial_lifecycle_hook.391359060.name"), 465 ), 466 }, 467 }, 468 }) 469 } 470 471 func TestAccAWSAutoScalingGroup_ALB_TargetGroups_ELBCapacity(t *testing.T) { 472 var group autoscaling.Group 473 var tg elbv2.TargetGroup 474 475 resource.Test(t, resource.TestCase{ 476 PreCheck: func() { testAccPreCheck(t) }, 477 Providers: testAccProviders, 478 CheckDestroy: testAccCheckAWSAutoScalingGroupDestroy, 479 Steps: []resource.TestStep{ 480 resource.TestStep{ 481 Config: testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_ELBCapacity, 482 Check: resource.ComposeAggregateTestCheckFunc( 483 testAccCheckAWSAutoScalingGroupExists("aws_autoscaling_group.bar", &group), 484 testAccCheckAWSALBTargetGroupExists("aws_alb_target_group.test", &tg), 485 testAccCheckAWSALBTargetGroupHealthy(&tg), 486 ), 487 }, 488 }, 489 }) 490 } 491 492 func testAccCheckAWSAutoScalingGroupDestroy(s *terraform.State) error { 493 conn := testAccProvider.Meta().(*AWSClient).autoscalingconn 494 495 for _, rs := range s.RootModule().Resources { 496 if rs.Type != "aws_autoscaling_group" { 497 continue 498 } 499 500 // Try to find the Group 501 describeGroups, err := conn.DescribeAutoScalingGroups( 502 &autoscaling.DescribeAutoScalingGroupsInput{ 503 AutoScalingGroupNames: []*string{aws.String(rs.Primary.ID)}, 504 }) 505 506 if err == nil { 507 if len(describeGroups.AutoScalingGroups) != 0 && 508 *describeGroups.AutoScalingGroups[0].AutoScalingGroupName == rs.Primary.ID { 509 return fmt.Errorf("AutoScaling Group still exists") 510 } 511 } 512 513 // Verify the error 514 ec2err, ok := err.(awserr.Error) 515 if !ok { 516 return err 517 } 518 if ec2err.Code() != "InvalidGroup.NotFound" { 519 return err 520 } 521 } 522 523 return nil 524 } 525 526 func testAccCheckAWSAutoScalingGroupAttributes(group *autoscaling.Group, name string) resource.TestCheckFunc { 527 return func(s *terraform.State) error { 528 if *group.AvailabilityZones[0] != "us-west-2a" { 529 return fmt.Errorf("Bad availability_zones: %#v", group.AvailabilityZones[0]) 530 } 531 532 if *group.AutoScalingGroupName != name { 533 return fmt.Errorf("Bad Autoscaling Group name, expected (%s), got (%s)", name, *group.AutoScalingGroupName) 534 } 535 536 if *group.MaxSize != 5 { 537 return fmt.Errorf("Bad max_size: %d", *group.MaxSize) 538 } 539 540 if *group.MinSize != 2 { 541 return fmt.Errorf("Bad max_size: %d", *group.MinSize) 542 } 543 544 if *group.HealthCheckType != "ELB" { 545 return fmt.Errorf("Bad health_check_type,\nexpected: %s\ngot: %s", "ELB", *group.HealthCheckType) 546 } 547 548 if *group.HealthCheckGracePeriod != 300 { 549 return fmt.Errorf("Bad health_check_grace_period: %d", *group.HealthCheckGracePeriod) 550 } 551 552 if *group.DesiredCapacity != 4 { 553 return fmt.Errorf("Bad desired_capacity: %d", *group.DesiredCapacity) 554 } 555 556 if *group.LaunchConfigurationName == "" { 557 return fmt.Errorf("Bad launch configuration name: %s", *group.LaunchConfigurationName) 558 } 559 560 t := &autoscaling.TagDescription{ 561 Key: aws.String("Foo"), 562 Value: aws.String("foo-bar"), 563 PropagateAtLaunch: aws.Bool(true), 564 ResourceType: aws.String("auto-scaling-group"), 565 ResourceId: group.AutoScalingGroupName, 566 } 567 568 if !reflect.DeepEqual(group.Tags[0], t) { 569 return fmt.Errorf( 570 "Got:\n\n%#v\n\nExpected:\n\n%#v\n", 571 group.Tags[0], 572 t) 573 } 574 575 return nil 576 } 577 } 578 579 func testAccCheckAWSAutoScalingGroupAttributesLoadBalancer(group *autoscaling.Group) resource.TestCheckFunc { 580 return func(s *terraform.State) error { 581 if len(group.LoadBalancerNames) != 1 { 582 return fmt.Errorf("Bad load_balancers: %v", group.LoadBalancerNames) 583 } 584 585 return nil 586 } 587 } 588 589 func testAccCheckAWSAutoScalingGroupExists(n string, group *autoscaling.Group) resource.TestCheckFunc { 590 return func(s *terraform.State) error { 591 rs, ok := s.RootModule().Resources[n] 592 if !ok { 593 return fmt.Errorf("Not found: %s", n) 594 } 595 596 if rs.Primary.ID == "" { 597 return fmt.Errorf("No AutoScaling Group ID is set") 598 } 599 600 conn := testAccProvider.Meta().(*AWSClient).autoscalingconn 601 602 describeGroups, err := conn.DescribeAutoScalingGroups( 603 &autoscaling.DescribeAutoScalingGroupsInput{ 604 AutoScalingGroupNames: []*string{aws.String(rs.Primary.ID)}, 605 }) 606 607 if err != nil { 608 return err 609 } 610 611 if len(describeGroups.AutoScalingGroups) != 1 || 612 *describeGroups.AutoScalingGroups[0].AutoScalingGroupName != rs.Primary.ID { 613 return fmt.Errorf("AutoScaling Group not found") 614 } 615 616 *group = *describeGroups.AutoScalingGroups[0] 617 618 return nil 619 } 620 } 621 622 func testAccCheckAWSAutoScalingGroupInitialLifecycleHookExists(asg, hookAttr string) resource.TestCheckFunc { 623 return func(s *terraform.State) error { 624 asgResource, ok := s.RootModule().Resources[asg] 625 if !ok { 626 return fmt.Errorf("Not found: %s", asg) 627 } 628 629 if asgResource.Primary.ID == "" { 630 return fmt.Errorf("No AutoScaling Group ID is set") 631 } 632 633 hookName := asgResource.Primary.Attributes[hookAttr] 634 if hookName == "" { 635 return fmt.Errorf("ASG %s has no hook name %s", asg, hookAttr) 636 } 637 638 return checkLifecycleHookExistsByName(asgResource.Primary.ID, hookName) 639 } 640 } 641 642 func testLaunchConfigurationName(n string, lc *autoscaling.LaunchConfiguration) resource.TestCheckFunc { 643 return func(s *terraform.State) error { 644 rs, ok := s.RootModule().Resources[n] 645 if !ok { 646 return fmt.Errorf("Not found: %s", n) 647 } 648 649 if *lc.LaunchConfigurationName != rs.Primary.Attributes["launch_configuration"] { 650 return fmt.Errorf("Launch configuration names do not match") 651 } 652 653 return nil 654 } 655 } 656 657 func testAccCheckAWSAutoScalingGroupHealthyCapacity( 658 g *autoscaling.Group, exp int) resource.TestCheckFunc { 659 return func(s *terraform.State) error { 660 healthy := 0 661 for _, i := range g.Instances { 662 if i.HealthStatus == nil { 663 continue 664 } 665 if strings.EqualFold(*i.HealthStatus, "Healthy") { 666 healthy++ 667 } 668 } 669 if healthy < exp { 670 return fmt.Errorf("Expected at least %d healthy, got %d.", exp, healthy) 671 } 672 return nil 673 } 674 } 675 676 func testAccCheckAWSAutoScalingGroupAttributesVPCZoneIdentifer(group *autoscaling.Group) resource.TestCheckFunc { 677 return func(s *terraform.State) error { 678 // Grab Subnet Ids 679 var subnets []string 680 for _, rs := range s.RootModule().Resources { 681 if rs.Type != "aws_subnet" { 682 continue 683 } 684 subnets = append(subnets, rs.Primary.Attributes["id"]) 685 } 686 687 if group.VPCZoneIdentifier == nil { 688 return fmt.Errorf("Bad VPC Zone Identifier\nexpected: %s\ngot nil", subnets) 689 } 690 691 zones := strings.Split(*group.VPCZoneIdentifier, ",") 692 693 remaining := len(zones) 694 for _, z := range zones { 695 for _, s := range subnets { 696 if z == s { 697 remaining-- 698 } 699 } 700 } 701 702 if remaining != 0 { 703 return fmt.Errorf("Bad VPC Zone Identifier match\nexpected: %s\ngot:%s", zones, subnets) 704 } 705 706 return nil 707 } 708 } 709 710 // testAccCheckAWSALBTargetGroupHealthy checks an *elbv2.TargetGroup to make 711 // sure that all instances in it are healthy. 712 func testAccCheckAWSALBTargetGroupHealthy(res *elbv2.TargetGroup) resource.TestCheckFunc { 713 return func(s *terraform.State) error { 714 conn := testAccProvider.Meta().(*AWSClient).elbv2conn 715 716 resp, err := conn.DescribeTargetHealth(&elbv2.DescribeTargetHealthInput{ 717 TargetGroupArn: res.TargetGroupArn, 718 }) 719 720 if err != nil { 721 return err 722 } 723 724 for _, target := range resp.TargetHealthDescriptions { 725 if target.TargetHealth == nil || target.TargetHealth.State == nil || *target.TargetHealth.State != "healthy" { 726 return errors.New("Not all instances in target group are healthy yet, but should be") 727 } 728 } 729 730 return nil 731 } 732 } 733 734 const testAccAWSAutoScalingGroupConfig_autoGeneratedName = ` 735 resource "aws_launch_configuration" "foobar" { 736 image_id = "ami-21f78e11" 737 instance_type = "t1.micro" 738 } 739 740 resource "aws_autoscaling_group" "bar" { 741 availability_zones = ["us-west-2a"] 742 desired_capacity = 0 743 max_size = 0 744 min_size = 0 745 launch_configuration = "${aws_launch_configuration.foobar.name}" 746 } 747 ` 748 749 const testAccAWSAutoScalingGroupConfig_terminationPoliciesEmpty = ` 750 resource "aws_launch_configuration" "foobar" { 751 image_id = "ami-21f78e11" 752 instance_type = "t1.micro" 753 } 754 755 resource "aws_autoscaling_group" "bar" { 756 availability_zones = ["us-west-2a"] 757 max_size = 0 758 min_size = 0 759 desired_capacity = 0 760 761 launch_configuration = "${aws_launch_configuration.foobar.name}" 762 } 763 ` 764 765 const testAccAWSAutoScalingGroupConfig_terminationPoliciesExplicitDefault = ` 766 resource "aws_launch_configuration" "foobar" { 767 image_id = "ami-21f78e11" 768 instance_type = "t1.micro" 769 } 770 771 resource "aws_autoscaling_group" "bar" { 772 availability_zones = ["us-west-2a"] 773 max_size = 0 774 min_size = 0 775 desired_capacity = 0 776 termination_policies = ["Default"] 777 778 launch_configuration = "${aws_launch_configuration.foobar.name}" 779 } 780 ` 781 782 const testAccAWSAutoScalingGroupConfig_terminationPoliciesUpdate = ` 783 resource "aws_launch_configuration" "foobar" { 784 image_id = "ami-21f78e11" 785 instance_type = "t1.micro" 786 } 787 788 resource "aws_autoscaling_group" "bar" { 789 availability_zones = ["us-west-2a"] 790 max_size = 0 791 min_size = 0 792 desired_capacity = 0 793 termination_policies = ["OldestInstance"] 794 795 launch_configuration = "${aws_launch_configuration.foobar.name}" 796 } 797 ` 798 799 func testAccAWSAutoScalingGroupConfig(name string) string { 800 return fmt.Sprintf(` 801 resource "aws_launch_configuration" "foobar" { 802 image_id = "ami-21f78e11" 803 instance_type = "t1.micro" 804 } 805 806 resource "aws_placement_group" "test" { 807 name = "asg_pg_%s" 808 strategy = "cluster" 809 } 810 811 resource "aws_autoscaling_group" "bar" { 812 availability_zones = ["us-west-2a"] 813 name = "%s" 814 max_size = 5 815 min_size = 2 816 health_check_type = "ELB" 817 desired_capacity = 4 818 force_delete = true 819 termination_policies = ["OldestInstance","ClosestToNextInstanceHour"] 820 821 launch_configuration = "${aws_launch_configuration.foobar.name}" 822 823 tag { 824 key = "Foo" 825 value = "foo-bar" 826 propagate_at_launch = true 827 } 828 } 829 `, name, name) 830 } 831 832 func testAccAWSAutoScalingGroupConfigUpdate(name string) string { 833 return fmt.Sprintf(` 834 resource "aws_launch_configuration" "foobar" { 835 image_id = "ami-21f78e11" 836 instance_type = "t1.micro" 837 } 838 839 resource "aws_launch_configuration" "new" { 840 image_id = "ami-21f78e11" 841 instance_type = "t1.micro" 842 } 843 844 resource "aws_autoscaling_group" "bar" { 845 availability_zones = ["us-west-2a"] 846 name = "%s" 847 max_size = 5 848 min_size = 2 849 health_check_grace_period = 300 850 health_check_type = "ELB" 851 desired_capacity = 5 852 force_delete = true 853 termination_policies = ["ClosestToNextInstanceHour"] 854 protect_from_scale_in = true 855 856 launch_configuration = "${aws_launch_configuration.new.name}" 857 858 tag { 859 key = "Bar" 860 value = "bar-foo" 861 propagate_at_launch = true 862 } 863 } 864 `, name) 865 } 866 867 const testAccAWSAutoScalingGroupConfigWithLoadBalancer = ` 868 resource "aws_vpc" "foo" { 869 cidr_block = "10.1.0.0/16" 870 tags { Name = "tf-asg-test" } 871 } 872 873 resource "aws_internet_gateway" "gw" { 874 vpc_id = "${aws_vpc.foo.id}" 875 } 876 877 resource "aws_subnet" "foo" { 878 cidr_block = "10.1.1.0/24" 879 vpc_id = "${aws_vpc.foo.id}" 880 } 881 882 resource "aws_security_group" "foo" { 883 vpc_id="${aws_vpc.foo.id}" 884 885 ingress { 886 protocol = "-1" 887 from_port = 0 888 to_port = 0 889 cidr_blocks = ["0.0.0.0/0"] 890 } 891 892 egress { 893 protocol = "-1" 894 from_port = 0 895 to_port = 0 896 cidr_blocks = ["0.0.0.0/0"] 897 } 898 } 899 900 resource "aws_elb" "bar" { 901 subnets = ["${aws_subnet.foo.id}"] 902 security_groups = ["${aws_security_group.foo.id}"] 903 904 listener { 905 instance_port = 80 906 instance_protocol = "http" 907 lb_port = 80 908 lb_protocol = "http" 909 } 910 911 health_check { 912 healthy_threshold = 2 913 unhealthy_threshold = 2 914 target = "HTTP:80/" 915 interval = 5 916 timeout = 2 917 } 918 919 depends_on = ["aws_internet_gateway.gw"] 920 } 921 922 resource "aws_launch_configuration" "foobar" { 923 // need an AMI that listens on :80 at boot, this is: 924 // bitnami-nginxstack-1.6.1-0-linux-ubuntu-14.04.1-x86_64-hvm-ebs-ami-99f5b1a9-3 925 image_id = "ami-b5b3fc85" 926 instance_type = "t2.micro" 927 security_groups = ["${aws_security_group.foo.id}"] 928 } 929 930 resource "aws_autoscaling_group" "bar" { 931 availability_zones = ["${aws_subnet.foo.availability_zone}"] 932 vpc_zone_identifier = ["${aws_subnet.foo.id}"] 933 max_size = 2 934 min_size = 2 935 health_check_grace_period = 300 936 health_check_type = "ELB" 937 wait_for_elb_capacity = 2 938 force_delete = true 939 940 launch_configuration = "${aws_launch_configuration.foobar.name}" 941 load_balancers = ["${aws_elb.bar.name}"] 942 } 943 ` 944 945 const testAccAWSAutoScalingGroupConfigWithAZ = ` 946 resource "aws_vpc" "default" { 947 cidr_block = "10.0.0.0/16" 948 tags { 949 Name = "terraform-test" 950 } 951 } 952 953 resource "aws_subnet" "main" { 954 vpc_id = "${aws_vpc.default.id}" 955 cidr_block = "10.0.1.0/24" 956 availability_zone = "us-west-2a" 957 tags { 958 Name = "terraform-test" 959 } 960 } 961 962 resource "aws_launch_configuration" "foobar" { 963 image_id = "ami-b5b3fc85" 964 instance_type = "t2.micro" 965 } 966 967 resource "aws_autoscaling_group" "bar" { 968 availability_zones = [ 969 "us-west-2a" 970 ] 971 desired_capacity = 0 972 max_size = 0 973 min_size = 0 974 launch_configuration = "${aws_launch_configuration.foobar.name}" 975 } 976 ` 977 978 const testAccAWSAutoScalingGroupConfigWithVPCIdent = ` 979 resource "aws_vpc" "default" { 980 cidr_block = "10.0.0.0/16" 981 tags { 982 Name = "terraform-test" 983 } 984 } 985 986 resource "aws_subnet" "main" { 987 vpc_id = "${aws_vpc.default.id}" 988 cidr_block = "10.0.1.0/24" 989 availability_zone = "us-west-2a" 990 tags { 991 Name = "terraform-test" 992 } 993 } 994 995 resource "aws_launch_configuration" "foobar" { 996 image_id = "ami-b5b3fc85" 997 instance_type = "t2.micro" 998 } 999 1000 resource "aws_autoscaling_group" "bar" { 1001 vpc_zone_identifier = [ 1002 "${aws_subnet.main.id}", 1003 ] 1004 desired_capacity = 0 1005 max_size = 0 1006 min_size = 0 1007 launch_configuration = "${aws_launch_configuration.foobar.name}" 1008 } 1009 ` 1010 1011 func testAccAWSAutoScalingGroupConfig_withPlacementGroup(name string) string { 1012 return fmt.Sprintf(` 1013 resource "aws_launch_configuration" "foobar" { 1014 image_id = "ami-21f78e11" 1015 instance_type = "c3.large" 1016 } 1017 1018 resource "aws_placement_group" "test" { 1019 name = "%s" 1020 strategy = "cluster" 1021 } 1022 1023 resource "aws_autoscaling_group" "bar" { 1024 availability_zones = ["us-west-2a"] 1025 name = "%s" 1026 max_size = 1 1027 min_size = 1 1028 health_check_grace_period = 300 1029 health_check_type = "ELB" 1030 desired_capacity = 1 1031 force_delete = true 1032 termination_policies = ["OldestInstance","ClosestToNextInstanceHour"] 1033 placement_group = "${aws_placement_group.test.name}" 1034 1035 launch_configuration = "${aws_launch_configuration.foobar.name}" 1036 1037 tag { 1038 key = "Foo" 1039 value = "foo-bar" 1040 propagate_at_launch = true 1041 } 1042 } 1043 `, name, name) 1044 } 1045 1046 const testAccAWSAutoscalingMetricsCollectionConfig_allMetricsCollected = ` 1047 resource "aws_launch_configuration" "foobar" { 1048 image_id = "ami-21f78e11" 1049 instance_type = "t1.micro" 1050 } 1051 1052 resource "aws_autoscaling_group" "bar" { 1053 availability_zones = ["us-west-2a"] 1054 max_size = 1 1055 min_size = 0 1056 health_check_grace_period = 300 1057 health_check_type = "EC2" 1058 desired_capacity = 0 1059 force_delete = true 1060 termination_policies = ["OldestInstance","ClosestToNextInstanceHour"] 1061 launch_configuration = "${aws_launch_configuration.foobar.name}" 1062 enabled_metrics = ["GroupTotalInstances", 1063 "GroupPendingInstances", 1064 "GroupTerminatingInstances", 1065 "GroupDesiredCapacity", 1066 "GroupInServiceInstances", 1067 "GroupMinSize", 1068 "GroupMaxSize" 1069 ] 1070 metrics_granularity = "1Minute" 1071 } 1072 ` 1073 1074 const testAccAWSAutoscalingMetricsCollectionConfig_updatingMetricsCollected = ` 1075 resource "aws_launch_configuration" "foobar" { 1076 image_id = "ami-21f78e11" 1077 instance_type = "t1.micro" 1078 } 1079 1080 resource "aws_autoscaling_group" "bar" { 1081 availability_zones = ["us-west-2a"] 1082 max_size = 1 1083 min_size = 0 1084 health_check_grace_period = 300 1085 health_check_type = "EC2" 1086 desired_capacity = 0 1087 force_delete = true 1088 termination_policies = ["OldestInstance","ClosestToNextInstanceHour"] 1089 launch_configuration = "${aws_launch_configuration.foobar.name}" 1090 enabled_metrics = ["GroupTotalInstances", 1091 "GroupPendingInstances", 1092 "GroupTerminatingInstances", 1093 "GroupDesiredCapacity", 1094 "GroupMaxSize" 1095 ] 1096 metrics_granularity = "1Minute" 1097 } 1098 ` 1099 1100 const testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_pre = ` 1101 provider "aws" { 1102 region = "us-west-2" 1103 } 1104 1105 resource "aws_vpc" "default" { 1106 cidr_block = "10.0.0.0/16" 1107 1108 tags { 1109 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1110 } 1111 } 1112 1113 resource "aws_alb_target_group" "test" { 1114 name = "tf-example-alb-tg" 1115 port = 80 1116 protocol = "HTTP" 1117 vpc_id = "${aws_vpc.default.id}" 1118 } 1119 1120 resource "aws_subnet" "main" { 1121 vpc_id = "${aws_vpc.default.id}" 1122 cidr_block = "10.0.1.0/24" 1123 availability_zone = "us-west-2a" 1124 1125 tags { 1126 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1127 } 1128 } 1129 1130 resource "aws_subnet" "alt" { 1131 vpc_id = "${aws_vpc.default.id}" 1132 cidr_block = "10.0.2.0/24" 1133 availability_zone = "us-west-2b" 1134 1135 tags { 1136 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1137 } 1138 } 1139 1140 resource "aws_launch_configuration" "foobar" { 1141 # Golang-base from cts-hashi aws account, shared with tf testing account 1142 image_id = "ami-1817d178" 1143 instance_type = "t2.micro" 1144 enable_monitoring = false 1145 } 1146 1147 resource "aws_autoscaling_group" "bar" { 1148 vpc_zone_identifier = [ 1149 "${aws_subnet.main.id}", 1150 "${aws_subnet.alt.id}", 1151 ] 1152 1153 max_size = 2 1154 min_size = 0 1155 health_check_grace_period = 300 1156 health_check_type = "ELB" 1157 desired_capacity = 0 1158 force_delete = true 1159 termination_policies = ["OldestInstance"] 1160 launch_configuration = "${aws_launch_configuration.foobar.name}" 1161 1162 } 1163 1164 resource "aws_security_group" "tf_test_self" { 1165 name = "tf_test_alb_asg" 1166 description = "tf_test_alb_asg" 1167 vpc_id = "${aws_vpc.default.id}" 1168 1169 ingress { 1170 from_port = 80 1171 to_port = 80 1172 protocol = "tcp" 1173 cidr_blocks = ["0.0.0.0/0"] 1174 } 1175 1176 tags { 1177 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1178 } 1179 } 1180 ` 1181 1182 const testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_post = ` 1183 provider "aws" { 1184 region = "us-west-2" 1185 } 1186 1187 resource "aws_vpc" "default" { 1188 cidr_block = "10.0.0.0/16" 1189 1190 tags { 1191 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1192 } 1193 } 1194 1195 resource "aws_alb_target_group" "test" { 1196 name = "tf-example-alb-tg" 1197 port = 80 1198 protocol = "HTTP" 1199 vpc_id = "${aws_vpc.default.id}" 1200 } 1201 1202 resource "aws_subnet" "main" { 1203 vpc_id = "${aws_vpc.default.id}" 1204 cidr_block = "10.0.1.0/24" 1205 availability_zone = "us-west-2a" 1206 1207 tags { 1208 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1209 } 1210 } 1211 1212 resource "aws_subnet" "alt" { 1213 vpc_id = "${aws_vpc.default.id}" 1214 cidr_block = "10.0.2.0/24" 1215 availability_zone = "us-west-2b" 1216 1217 tags { 1218 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1219 } 1220 } 1221 1222 resource "aws_launch_configuration" "foobar" { 1223 # Golang-base from cts-hashi aws account, shared with tf testing account 1224 image_id = "ami-1817d178" 1225 instance_type = "t2.micro" 1226 enable_monitoring = false 1227 } 1228 1229 resource "aws_autoscaling_group" "bar" { 1230 vpc_zone_identifier = [ 1231 "${aws_subnet.main.id}", 1232 "${aws_subnet.alt.id}", 1233 ] 1234 1235 target_group_arns = ["${aws_alb_target_group.test.arn}"] 1236 1237 max_size = 2 1238 min_size = 0 1239 health_check_grace_period = 300 1240 health_check_type = "ELB" 1241 desired_capacity = 0 1242 force_delete = true 1243 termination_policies = ["OldestInstance"] 1244 launch_configuration = "${aws_launch_configuration.foobar.name}" 1245 1246 } 1247 1248 resource "aws_security_group" "tf_test_self" { 1249 name = "tf_test_alb_asg" 1250 description = "tf_test_alb_asg" 1251 vpc_id = "${aws_vpc.default.id}" 1252 1253 ingress { 1254 from_port = 80 1255 to_port = 80 1256 protocol = "tcp" 1257 cidr_blocks = ["0.0.0.0/0"] 1258 } 1259 1260 tags { 1261 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1262 } 1263 } 1264 ` 1265 1266 const testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_post_duo = ` 1267 provider "aws" { 1268 region = "us-west-2" 1269 } 1270 1271 resource "aws_vpc" "default" { 1272 cidr_block = "10.0.0.0/16" 1273 1274 tags { 1275 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1276 } 1277 } 1278 1279 resource "aws_alb_target_group" "test" { 1280 name = "tf-example-alb-tg" 1281 port = 80 1282 protocol = "HTTP" 1283 vpc_id = "${aws_vpc.default.id}" 1284 } 1285 1286 resource "aws_alb_target_group" "test_more" { 1287 name = "tf-example-alb-tg-more" 1288 port = 80 1289 protocol = "HTTP" 1290 vpc_id = "${aws_vpc.default.id}" 1291 } 1292 1293 resource "aws_subnet" "main" { 1294 vpc_id = "${aws_vpc.default.id}" 1295 cidr_block = "10.0.1.0/24" 1296 availability_zone = "us-west-2a" 1297 1298 tags { 1299 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1300 } 1301 } 1302 1303 resource "aws_subnet" "alt" { 1304 vpc_id = "${aws_vpc.default.id}" 1305 cidr_block = "10.0.2.0/24" 1306 availability_zone = "us-west-2b" 1307 1308 tags { 1309 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1310 } 1311 } 1312 1313 resource "aws_launch_configuration" "foobar" { 1314 # Golang-base from cts-hashi aws account, shared with tf testing account 1315 image_id = "ami-1817d178" 1316 instance_type = "t2.micro" 1317 enable_monitoring = false 1318 } 1319 1320 resource "aws_autoscaling_group" "bar" { 1321 vpc_zone_identifier = [ 1322 "${aws_subnet.main.id}", 1323 "${aws_subnet.alt.id}", 1324 ] 1325 1326 target_group_arns = [ 1327 "${aws_alb_target_group.test.arn}", 1328 "${aws_alb_target_group.test_more.arn}", 1329 ] 1330 1331 max_size = 2 1332 min_size = 0 1333 health_check_grace_period = 300 1334 health_check_type = "ELB" 1335 desired_capacity = 0 1336 force_delete = true 1337 termination_policies = ["OldestInstance"] 1338 launch_configuration = "${aws_launch_configuration.foobar.name}" 1339 1340 } 1341 1342 resource "aws_security_group" "tf_test_self" { 1343 name = "tf_test_alb_asg" 1344 description = "tf_test_alb_asg" 1345 vpc_id = "${aws_vpc.default.id}" 1346 1347 ingress { 1348 from_port = 80 1349 to_port = 80 1350 protocol = "tcp" 1351 cidr_blocks = ["0.0.0.0/0"] 1352 } 1353 1354 tags { 1355 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup" 1356 } 1357 } 1358 ` 1359 1360 func testAccAWSAutoScalingGroupWithHookConfig(name string) string { 1361 return fmt.Sprintf(` 1362 resource "aws_launch_configuration" "foobar" { 1363 image_id = "ami-21f78e11" 1364 instance_type = "t1.micro" 1365 } 1366 1367 resource "aws_autoscaling_group" "bar" { 1368 availability_zones = ["us-west-2a"] 1369 name = "%s" 1370 max_size = 5 1371 min_size = 2 1372 health_check_type = "ELB" 1373 desired_capacity = 4 1374 force_delete = true 1375 termination_policies = ["OldestInstance","ClosestToNextInstanceHour"] 1376 1377 launch_configuration = "${aws_launch_configuration.foobar.name}" 1378 1379 initial_lifecycle_hook { 1380 name = "launching" 1381 default_result = "CONTINUE" 1382 heartbeat_timeout = 30 # minimum value 1383 lifecycle_transition = "autoscaling:EC2_INSTANCE_LAUNCHING" 1384 } 1385 } 1386 `, name) 1387 } 1388 1389 const testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_ELBCapacity = ` 1390 provider "aws" { 1391 region = "us-west-2" 1392 } 1393 1394 resource "aws_vpc" "default" { 1395 cidr_block = "10.0.0.0/16" 1396 enable_dns_hostnames = "true" 1397 enable_dns_support = "true" 1398 1399 tags { 1400 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_ELBCapacity" 1401 } 1402 } 1403 1404 resource "aws_alb" "test_lb" { 1405 subnets = ["${aws_subnet.main.id}", "${aws_subnet.alt.id}"] 1406 1407 tags { 1408 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_ELBCapacity" 1409 } 1410 } 1411 1412 resource "aws_alb_listener" "test_listener" { 1413 load_balancer_arn = "${aws_alb.test_lb.arn}" 1414 port = "80" 1415 1416 default_action { 1417 target_group_arn = "${aws_alb_target_group.test.arn}" 1418 type = "forward" 1419 } 1420 } 1421 1422 resource "aws_alb_target_group" "test" { 1423 name = "tf-example-alb-tg" 1424 port = 80 1425 protocol = "HTTP" 1426 vpc_id = "${aws_vpc.default.id}" 1427 1428 health_check { 1429 path = "/" 1430 healthy_threshold = "2" 1431 timeout = "2" 1432 interval = "5" 1433 } 1434 } 1435 1436 resource "aws_subnet" "main" { 1437 vpc_id = "${aws_vpc.default.id}" 1438 cidr_block = "10.0.1.0/24" 1439 availability_zone = "us-west-2a" 1440 1441 tags { 1442 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_ELBCapacity" 1443 } 1444 } 1445 1446 resource "aws_subnet" "alt" { 1447 vpc_id = "${aws_vpc.default.id}" 1448 cidr_block = "10.0.2.0/24" 1449 availability_zone = "us-west-2b" 1450 1451 tags { 1452 Name = "testAccAWSAutoScalingGroupConfig_ALB_TargetGroup_ELBCapacity" 1453 } 1454 } 1455 1456 resource "aws_internet_gateway" "internet_gateway" { 1457 vpc_id = "${aws_vpc.default.id}" 1458 } 1459 1460 resource "aws_route_table" "route_table" { 1461 vpc_id = "${aws_vpc.default.id}" 1462 } 1463 1464 resource "aws_route_table_association" "route_table_association_main" { 1465 subnet_id = "${aws_subnet.main.id}" 1466 route_table_id = "${aws_route_table.route_table.id}" 1467 } 1468 1469 resource "aws_route_table_association" "route_table_association_alt" { 1470 subnet_id = "${aws_subnet.alt.id}" 1471 route_table_id = "${aws_route_table.route_table.id}" 1472 } 1473 1474 resource "aws_route" "public_default_route" { 1475 route_table_id = "${aws_route_table.route_table.id}" 1476 destination_cidr_block = "0.0.0.0/0" 1477 gateway_id = "${aws_internet_gateway.internet_gateway.id}" 1478 } 1479 1480 data "aws_ami" "test_ami" { 1481 most_recent = true 1482 1483 filter { 1484 name = "owner-alias" 1485 values = ["amazon"] 1486 } 1487 1488 filter { 1489 name = "name" 1490 values = ["amzn-ami-hvm-*-x86_64-gp2"] 1491 } 1492 } 1493 1494 resource "aws_launch_configuration" "foobar" { 1495 image_id = "${data.aws_ami.test_ami.id}" 1496 instance_type = "t2.micro" 1497 associate_public_ip_address = "true" 1498 1499 user_data = <<EOS 1500 #!/bin/bash 1501 yum -y install httpd 1502 echo "hello world" > /var/www/html/index.html 1503 chkconfig httpd on 1504 service httpd start 1505 EOS 1506 } 1507 1508 resource "aws_autoscaling_group" "bar" { 1509 vpc_zone_identifier = [ 1510 "${aws_subnet.main.id}", 1511 "${aws_subnet.alt.id}", 1512 ] 1513 1514 target_group_arns = ["${aws_alb_target_group.test.arn}"] 1515 1516 max_size = 2 1517 min_size = 2 1518 health_check_grace_period = 300 1519 health_check_type = "ELB" 1520 desired_capacity = 2 1521 wait_for_elb_capacity = 2 1522 force_delete = true 1523 termination_policies = ["OldestInstance"] 1524 launch_configuration = "${aws_launch_configuration.foobar.name}" 1525 } 1526 ` 1527 1528 func testAccAWSAutoScalingGroupConfigWithSuspendedProcesses(name string) string { 1529 return fmt.Sprintf(` 1530 resource "aws_launch_configuration" "foobar" { 1531 image_id = "ami-21f78e11" 1532 instance_type = "t1.micro" 1533 } 1534 1535 resource "aws_placement_group" "test" { 1536 name = "asg_pg_%s" 1537 strategy = "cluster" 1538 } 1539 1540 resource "aws_autoscaling_group" "bar" { 1541 availability_zones = ["us-west-2a"] 1542 name = "%s" 1543 max_size = 5 1544 min_size = 2 1545 health_check_type = "ELB" 1546 desired_capacity = 4 1547 force_delete = true 1548 termination_policies = ["OldestInstance","ClosestToNextInstanceHour"] 1549 1550 launch_configuration = "${aws_launch_configuration.foobar.name}" 1551 1552 suspended_processes = ["AlarmNotification","ScheduledActions"] 1553 1554 tag { 1555 key = "Foo" 1556 value = "foo-bar" 1557 propagate_at_launch = true 1558 } 1559 } 1560 `, name, name) 1561 } 1562 1563 func testAccAWSAutoScalingGroupConfigWithSuspendedProcessesUpdated(name string) string { 1564 return fmt.Sprintf(` 1565 resource "aws_launch_configuration" "foobar" { 1566 image_id = "ami-21f78e11" 1567 instance_type = "t1.micro" 1568 } 1569 1570 resource "aws_placement_group" "test" { 1571 name = "asg_pg_%s" 1572 strategy = "cluster" 1573 } 1574 1575 resource "aws_autoscaling_group" "bar" { 1576 availability_zones = ["us-west-2a"] 1577 name = "%s" 1578 max_size = 5 1579 min_size = 2 1580 health_check_type = "ELB" 1581 desired_capacity = 4 1582 force_delete = true 1583 termination_policies = ["OldestInstance","ClosestToNextInstanceHour"] 1584 1585 launch_configuration = "${aws_launch_configuration.foobar.name}" 1586 1587 suspended_processes = ["AZRebalance","ScheduledActions"] 1588 1589 tag { 1590 key = "Foo" 1591 value = "foo-bar" 1592 propagate_at_launch = true 1593 } 1594 } 1595 `, name, name) 1596 }