github.com/pbthorste/terraform@v0.8.6-0.20170127005045-deb56bd93da2/builtin/providers/aws/resource_aws_db_instance_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "regexp" 7 "strings" 8 9 "math/rand" 10 "testing" 11 "time" 12 13 "github.com/hashicorp/terraform/helper/acctest" 14 "github.com/hashicorp/terraform/helper/resource" 15 "github.com/hashicorp/terraform/terraform" 16 17 "github.com/aws/aws-sdk-go/aws" 18 "github.com/aws/aws-sdk-go/aws/awserr" 19 "github.com/aws/aws-sdk-go/service/rds" 20 ) 21 22 func TestAccAWSDBInstance_basic(t *testing.T) { 23 var v rds.DBInstance 24 25 resource.Test(t, resource.TestCase{ 26 PreCheck: func() { testAccPreCheck(t) }, 27 Providers: testAccProviders, 28 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 29 Steps: []resource.TestStep{ 30 { 31 Config: testAccAWSDBInstanceConfig, 32 Check: resource.ComposeTestCheckFunc( 33 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 34 testAccCheckAWSDBInstanceAttributes(&v), 35 resource.TestCheckResourceAttr( 36 "aws_db_instance.bar", "allocated_storage", "10"), 37 resource.TestCheckResourceAttr( 38 "aws_db_instance.bar", "engine", "mysql"), 39 resource.TestCheckResourceAttr( 40 "aws_db_instance.bar", "license_model", "general-public-license"), 41 resource.TestCheckResourceAttr( 42 "aws_db_instance.bar", "instance_class", "db.t1.micro"), 43 resource.TestCheckResourceAttr( 44 "aws_db_instance.bar", "name", "baz"), 45 resource.TestCheckResourceAttr( 46 "aws_db_instance.bar", "username", "foo"), 47 resource.TestCheckResourceAttr( 48 "aws_db_instance.bar", "parameter_group_name", "default.mysql5.6"), 49 resource.TestCheckResourceAttrSet("aws_db_instance.bar", "hosted_zone_id"), 50 ), 51 }, 52 }, 53 }) 54 } 55 56 func TestAccAWSDBInstance_kmsKey(t *testing.T) { 57 var v rds.DBInstance 58 keyRegex := regexp.MustCompile("^arn:aws:kms:") 59 60 ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int() 61 config := fmt.Sprintf(testAccAWSDBInstanceConfigKmsKeyId, ri) 62 63 resource.Test(t, resource.TestCase{ 64 PreCheck: func() { testAccPreCheck(t) }, 65 Providers: testAccProviders, 66 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 67 Steps: []resource.TestStep{ 68 { 69 Config: config, 70 Check: resource.ComposeTestCheckFunc( 71 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 72 testAccCheckAWSDBInstanceAttributes(&v), 73 resource.TestMatchResourceAttr( 74 "aws_db_instance.bar", "kms_key_id", keyRegex), 75 ), 76 }, 77 }, 78 }) 79 } 80 81 func TestAccAWSDBInstance_subnetGroup(t *testing.T) { 82 var v rds.DBInstance 83 rName := acctest.RandString(10) 84 85 resource.Test(t, resource.TestCase{ 86 PreCheck: func() { testAccPreCheck(t) }, 87 Providers: testAccProviders, 88 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 89 Steps: []resource.TestStep{ 90 { 91 Config: testAccAWSDBInstanceConfigWithSubnetGroup(rName), 92 Check: resource.ComposeTestCheckFunc( 93 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 94 resource.TestCheckResourceAttr( 95 "aws_db_instance.bar", "db_subnet_group_name", "foo"), 96 ), 97 }, 98 { 99 Config: testAccAWSDBInstanceConfigWithSubnetGroupUpdated(rName), 100 Check: resource.ComposeTestCheckFunc( 101 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 102 resource.TestCheckResourceAttr( 103 "aws_db_instance.bar", "db_subnet_group_name", "bar"), 104 ), 105 }, 106 }, 107 }) 108 } 109 110 func TestAccAWSDBInstance_optionGroup(t *testing.T) { 111 var v rds.DBInstance 112 113 resource.Test(t, resource.TestCase{ 114 PreCheck: func() { testAccPreCheck(t) }, 115 Providers: testAccProviders, 116 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 117 Steps: []resource.TestStep{ 118 { 119 Config: testAccAWSDBInstanceConfigWithOptionGroup, 120 Check: resource.ComposeTestCheckFunc( 121 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 122 testAccCheckAWSDBInstanceAttributes(&v), 123 resource.TestCheckResourceAttr( 124 "aws_db_instance.bar", "option_group_name", "option-group-test-terraform"), 125 ), 126 }, 127 }, 128 }) 129 } 130 131 func TestAccAWSDBInstanceReplica(t *testing.T) { 132 var s, r rds.DBInstance 133 134 resource.Test(t, resource.TestCase{ 135 PreCheck: func() { testAccPreCheck(t) }, 136 Providers: testAccProviders, 137 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 138 Steps: []resource.TestStep{ 139 { 140 Config: testAccReplicaInstanceConfig(rand.New(rand.NewSource(time.Now().UnixNano())).Int()), 141 Check: resource.ComposeTestCheckFunc( 142 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &s), 143 testAccCheckAWSDBInstanceExists("aws_db_instance.replica", &r), 144 testAccCheckAWSDBInstanceReplicaAttributes(&s, &r), 145 ), 146 }, 147 }, 148 }) 149 } 150 151 func TestAccAWSDBInstanceSnapshot(t *testing.T) { 152 var snap rds.DBInstance 153 154 resource.Test(t, resource.TestCase{ 155 PreCheck: func() { testAccPreCheck(t) }, 156 Providers: testAccProviders, 157 // testAccCheckAWSDBInstanceSnapshot verifies a database snapshot is 158 // created, and subequently deletes it 159 CheckDestroy: testAccCheckAWSDBInstanceSnapshot, 160 Steps: []resource.TestStep{ 161 { 162 Config: testAccSnapshotInstanceConfig(), 163 Check: resource.ComposeTestCheckFunc( 164 testAccCheckAWSDBInstanceExists("aws_db_instance.snapshot", &snap), 165 ), 166 }, 167 }, 168 }) 169 } 170 171 func TestAccAWSDBInstanceNoSnapshot(t *testing.T) { 172 var nosnap rds.DBInstance 173 174 resource.Test(t, resource.TestCase{ 175 PreCheck: func() { testAccPreCheck(t) }, 176 Providers: testAccProviders, 177 CheckDestroy: testAccCheckAWSDBInstanceNoSnapshot, 178 Steps: []resource.TestStep{ 179 { 180 Config: testAccNoSnapshotInstanceConfig(), 181 Check: resource.ComposeTestCheckFunc( 182 testAccCheckAWSDBInstanceExists("aws_db_instance.no_snapshot", &nosnap), 183 ), 184 }, 185 }, 186 }) 187 } 188 189 func TestAccAWSDBInstance_enhancedMonitoring(t *testing.T) { 190 var dbInstance rds.DBInstance 191 rName := acctest.RandString(5) 192 193 resource.Test(t, resource.TestCase{ 194 PreCheck: func() { testAccPreCheck(t) }, 195 Providers: testAccProviders, 196 CheckDestroy: testAccCheckAWSDBInstanceNoSnapshot, 197 Steps: []resource.TestStep{ 198 { 199 Config: testAccSnapshotInstanceConfig_enhancedMonitoring(rName), 200 Check: resource.ComposeTestCheckFunc( 201 testAccCheckAWSDBInstanceExists("aws_db_instance.enhanced_monitoring", &dbInstance), 202 resource.TestCheckResourceAttr( 203 "aws_db_instance.enhanced_monitoring", "monitoring_interval", "5"), 204 ), 205 }, 206 }, 207 }) 208 } 209 210 // Regression test for https://github.com/hashicorp/terraform/issues/3760 . 211 // We apply a plan, then change just the iops. If the apply succeeds, we 212 // consider this a pass, as before in 3760 the request would fail 213 func TestAccAWS_separate_DBInstance_iops_update(t *testing.T) { 214 var v rds.DBInstance 215 216 rName := acctest.RandString(5) 217 218 resource.Test(t, resource.TestCase{ 219 PreCheck: func() { testAccPreCheck(t) }, 220 Providers: testAccProviders, 221 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 222 Steps: []resource.TestStep{ 223 { 224 Config: testAccSnapshotInstanceConfig_iopsUpdate(rName, 1000), 225 Check: resource.ComposeTestCheckFunc( 226 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 227 testAccCheckAWSDBInstanceAttributes(&v), 228 ), 229 }, 230 231 { 232 Config: testAccSnapshotInstanceConfig_iopsUpdate(rName, 2000), 233 Check: resource.ComposeTestCheckFunc( 234 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 235 testAccCheckAWSDBInstanceAttributes(&v), 236 ), 237 }, 238 }, 239 }) 240 } 241 242 func TestAccAWSDBInstance_portUpdate(t *testing.T) { 243 var v rds.DBInstance 244 245 rName := acctest.RandString(5) 246 247 resource.Test(t, resource.TestCase{ 248 PreCheck: func() { testAccPreCheck(t) }, 249 Providers: testAccProviders, 250 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 251 Steps: []resource.TestStep{ 252 { 253 Config: testAccSnapshotInstanceConfig_mysqlPort(rName), 254 Check: resource.ComposeTestCheckFunc( 255 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 256 resource.TestCheckResourceAttr( 257 "aws_db_instance.bar", "port", "3306"), 258 ), 259 }, 260 261 { 262 Config: testAccSnapshotInstanceConfig_updateMysqlPort(rName), 263 Check: resource.ComposeTestCheckFunc( 264 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 265 resource.TestCheckResourceAttr( 266 "aws_db_instance.bar", "port", "3305"), 267 ), 268 }, 269 }, 270 }) 271 } 272 273 func TestAccAWSDBInstance_MSSQL_TZ(t *testing.T) { 274 var v rds.DBInstance 275 276 resource.Test(t, resource.TestCase{ 277 PreCheck: func() { testAccPreCheck(t) }, 278 Providers: testAccProviders, 279 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 280 Steps: []resource.TestStep{ 281 { 282 Config: testAccAWSDBMSSQL_timezone, 283 Check: resource.ComposeTestCheckFunc( 284 testAccCheckAWSDBInstanceExists("aws_db_instance.mssql", &v), 285 testAccCheckAWSDBInstanceAttributes_MSSQL(&v, ""), 286 resource.TestCheckResourceAttr( 287 "aws_db_instance.mssql", "allocated_storage", "20"), 288 resource.TestCheckResourceAttr( 289 "aws_db_instance.mssql", "engine", "sqlserver-ex"), 290 ), 291 }, 292 293 { 294 Config: testAccAWSDBMSSQL_timezone_AKST, 295 Check: resource.ComposeTestCheckFunc( 296 testAccCheckAWSDBInstanceExists("aws_db_instance.mssql", &v), 297 testAccCheckAWSDBInstanceAttributes_MSSQL(&v, "Alaskan Standard Time"), 298 resource.TestCheckResourceAttr( 299 "aws_db_instance.mssql", "allocated_storage", "20"), 300 resource.TestCheckResourceAttr( 301 "aws_db_instance.mssql", "engine", "sqlserver-ex"), 302 ), 303 }, 304 }, 305 }) 306 } 307 308 func TestAccAWSDBInstance_MinorVersion(t *testing.T) { 309 var v rds.DBInstance 310 311 resource.Test(t, resource.TestCase{ 312 PreCheck: func() { testAccPreCheck(t) }, 313 Providers: testAccProviders, 314 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 315 Steps: []resource.TestStep{ 316 { 317 Config: testAccAWSDBInstanceConfigAutoMinorVersion, 318 Check: resource.ComposeTestCheckFunc( 319 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 320 ), 321 }, 322 }, 323 }) 324 } 325 326 func testAccCheckAWSDBInstanceDestroy(s *terraform.State) error { 327 conn := testAccProvider.Meta().(*AWSClient).rdsconn 328 329 for _, rs := range s.RootModule().Resources { 330 if rs.Type != "aws_db_instance" { 331 continue 332 } 333 334 // Try to find the Group 335 var err error 336 resp, err := conn.DescribeDBInstances( 337 &rds.DescribeDBInstancesInput{ 338 DBInstanceIdentifier: aws.String(rs.Primary.ID), 339 }) 340 341 if ae, ok := err.(awserr.Error); ok && ae.Code() == "DBInstanceNotFound" { 342 continue 343 } 344 345 if err == nil { 346 if len(resp.DBInstances) != 0 && 347 *resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID { 348 return fmt.Errorf("DB Instance still exists") 349 } 350 } 351 352 // Verify the error 353 newerr, ok := err.(awserr.Error) 354 if !ok { 355 return err 356 } 357 if newerr.Code() != "DBInstanceNotFound" { 358 return err 359 } 360 } 361 362 return nil 363 } 364 365 func testAccCheckAWSDBInstanceAttributes(v *rds.DBInstance) resource.TestCheckFunc { 366 return func(s *terraform.State) error { 367 368 if *v.Engine != "mysql" { 369 return fmt.Errorf("bad engine: %#v", *v.Engine) 370 } 371 372 if *v.EngineVersion == "" { 373 return fmt.Errorf("bad engine_version: %#v", *v.EngineVersion) 374 } 375 376 if *v.BackupRetentionPeriod != 0 { 377 return fmt.Errorf("bad backup_retention_period: %#v", *v.BackupRetentionPeriod) 378 } 379 380 return nil 381 } 382 } 383 384 func testAccCheckAWSDBInstanceAttributes_MSSQL(v *rds.DBInstance, tz string) resource.TestCheckFunc { 385 return func(s *terraform.State) error { 386 387 if *v.Engine != "sqlserver-ex" { 388 return fmt.Errorf("bad engine: %#v", *v.Engine) 389 } 390 391 rtz := "" 392 if v.Timezone != nil { 393 rtz = *v.Timezone 394 } 395 396 if tz != rtz { 397 return fmt.Errorf("Expected (%s) Timezone for MSSQL test, got (%s)", tz, rtz) 398 } 399 400 return nil 401 } 402 } 403 404 func testAccCheckAWSDBInstanceReplicaAttributes(source, replica *rds.DBInstance) resource.TestCheckFunc { 405 return func(s *terraform.State) error { 406 407 if replica.ReadReplicaSourceDBInstanceIdentifier != nil && *replica.ReadReplicaSourceDBInstanceIdentifier != *source.DBInstanceIdentifier { 408 return fmt.Errorf("bad source identifier for replica, expected: '%s', got: '%s'", *source.DBInstanceIdentifier, *replica.ReadReplicaSourceDBInstanceIdentifier) 409 } 410 411 return nil 412 } 413 } 414 415 func testAccCheckAWSDBInstanceSnapshot(s *terraform.State) error { 416 conn := testAccProvider.Meta().(*AWSClient).rdsconn 417 418 for _, rs := range s.RootModule().Resources { 419 if rs.Type != "aws_db_instance" { 420 continue 421 } 422 423 var err error 424 resp, err := conn.DescribeDBInstances( 425 &rds.DescribeDBInstancesInput{ 426 DBInstanceIdentifier: aws.String(rs.Primary.ID), 427 }) 428 429 if err != nil { 430 newerr, _ := err.(awserr.Error) 431 if newerr.Code() != "DBInstanceNotFound" { 432 return err 433 } 434 435 } else { 436 if len(resp.DBInstances) != 0 && 437 *resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID { 438 return fmt.Errorf("DB Instance still exists") 439 } 440 } 441 442 log.Printf("[INFO] Trying to locate the DBInstance Final Snapshot") 443 snapshot_identifier := "foobarbaz-test-terraform-final-snapshot-1" 444 _, snapErr := conn.DescribeDBSnapshots( 445 &rds.DescribeDBSnapshotsInput{ 446 DBSnapshotIdentifier: aws.String(snapshot_identifier), 447 }) 448 449 if snapErr != nil { 450 newerr, _ := snapErr.(awserr.Error) 451 if newerr.Code() == "DBSnapshotNotFound" { 452 return fmt.Errorf("Snapshot %s not found", snapshot_identifier) 453 } 454 } else { // snapshot was found, 455 // verify we have the tags copied to the snapshot 456 instanceARN, err := buildRDSARN(snapshot_identifier, testAccProvider.Meta().(*AWSClient).partition, testAccProvider.Meta().(*AWSClient).accountid, testAccProvider.Meta().(*AWSClient).region) 457 // tags have a different ARN, just swapping :db: for :snapshot: 458 tagsARN := strings.Replace(instanceARN, ":db:", ":snapshot:", 1) 459 if err != nil { 460 return fmt.Errorf("Error building ARN for tags check with ARN (%s): %s", tagsARN, err) 461 } 462 resp, err := conn.ListTagsForResource(&rds.ListTagsForResourceInput{ 463 ResourceName: aws.String(tagsARN), 464 }) 465 if err != nil { 466 return fmt.Errorf("Error retrieving tags for ARN (%s): %s", tagsARN, err) 467 } 468 469 if resp.TagList == nil || len(resp.TagList) == 0 { 470 return fmt.Errorf("Tag list is nil or zero: %s", resp.TagList) 471 } 472 473 var found bool 474 for _, t := range resp.TagList { 475 if *t.Key == "Name" && *t.Value == "tf-tags-db" { 476 found = true 477 } 478 } 479 if !found { 480 return fmt.Errorf("Expected to find tag Name (%s), but wasn't found. Tags: %s", "tf-tags-db", resp.TagList) 481 } 482 // end tag search 483 484 log.Printf("[INFO] Deleting the Snapshot %s", snapshot_identifier) 485 _, snapDeleteErr := conn.DeleteDBSnapshot( 486 &rds.DeleteDBSnapshotInput{ 487 DBSnapshotIdentifier: aws.String(snapshot_identifier), 488 }) 489 if snapDeleteErr != nil { 490 return err 491 } 492 } // end snapshot was found 493 } 494 495 return nil 496 } 497 498 func testAccCheckAWSDBInstanceNoSnapshot(s *terraform.State) error { 499 conn := testAccProvider.Meta().(*AWSClient).rdsconn 500 501 for _, rs := range s.RootModule().Resources { 502 if rs.Type != "aws_db_instance" { 503 continue 504 } 505 506 var err error 507 resp, err := conn.DescribeDBInstances( 508 &rds.DescribeDBInstancesInput{ 509 DBInstanceIdentifier: aws.String(rs.Primary.ID), 510 }) 511 512 if err != nil { 513 newerr, _ := err.(awserr.Error) 514 if newerr.Code() != "DBInstanceNotFound" { 515 return err 516 } 517 518 } else { 519 if len(resp.DBInstances) != 0 && 520 *resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID { 521 return fmt.Errorf("DB Instance still exists") 522 } 523 } 524 525 snapshot_identifier := "foobarbaz-test-terraform-final-snapshot-2" 526 _, snapErr := conn.DescribeDBSnapshots( 527 &rds.DescribeDBSnapshotsInput{ 528 DBSnapshotIdentifier: aws.String(snapshot_identifier), 529 }) 530 531 if snapErr != nil { 532 newerr, _ := snapErr.(awserr.Error) 533 if newerr.Code() != "DBSnapshotNotFound" { 534 return fmt.Errorf("Snapshot %s found and it shouldn't have been", snapshot_identifier) 535 } 536 } 537 } 538 539 return nil 540 } 541 542 func testAccCheckAWSDBInstanceExists(n string, v *rds.DBInstance) resource.TestCheckFunc { 543 return func(s *terraform.State) error { 544 rs, ok := s.RootModule().Resources[n] 545 if !ok { 546 return fmt.Errorf("Not found: %s", n) 547 } 548 549 if rs.Primary.ID == "" { 550 return fmt.Errorf("No DB Instance ID is set") 551 } 552 553 conn := testAccProvider.Meta().(*AWSClient).rdsconn 554 555 opts := rds.DescribeDBInstancesInput{ 556 DBInstanceIdentifier: aws.String(rs.Primary.ID), 557 } 558 559 resp, err := conn.DescribeDBInstances(&opts) 560 561 if err != nil { 562 return err 563 } 564 565 if len(resp.DBInstances) != 1 || 566 *resp.DBInstances[0].DBInstanceIdentifier != rs.Primary.ID { 567 return fmt.Errorf("DB Instance not found") 568 } 569 570 *v = *resp.DBInstances[0] 571 572 return nil 573 } 574 } 575 576 // Database names cannot collide, and deletion takes so long, that making the 577 // name a bit random helps so able we can kill a test that's just waiting for a 578 // delete and not be blocked on kicking off another one. 579 var testAccAWSDBInstanceConfig = ` 580 resource "aws_db_instance" "bar" { 581 allocated_storage = 10 582 engine = "MySQL" 583 engine_version = "5.6.21" 584 instance_class = "db.t1.micro" 585 name = "baz" 586 password = "barbarbarbar" 587 username = "foo" 588 589 590 # Maintenance Window is stored in lower case in the API, though not strictly 591 # documented. Terraform will downcase this to match (as opposed to throw a 592 # validation error). 593 maintenance_window = "Fri:09:00-Fri:09:30" 594 595 backup_retention_period = 0 596 597 parameter_group_name = "default.mysql5.6" 598 }` 599 600 var testAccAWSDBInstanceConfigKmsKeyId = ` 601 resource "aws_kms_key" "foo" { 602 description = "Terraform acc test %s" 603 policy = <<POLICY 604 { 605 "Version": "2012-10-17", 606 "Id": "kms-tf-1", 607 "Statement": [ 608 { 609 "Sid": "Enable IAM User Permissions", 610 "Effect": "Allow", 611 "Principal": { 612 "AWS": "*" 613 }, 614 "Action": "kms:*", 615 "Resource": "*" 616 } 617 ] 618 } 619 POLICY 620 } 621 622 resource "aws_db_instance" "bar" { 623 allocated_storage = 10 624 engine = "MySQL" 625 engine_version = "5.6.21" 626 instance_class = "db.m3.medium" 627 name = "baz" 628 password = "barbarbarbar" 629 username = "foo" 630 631 632 # Maintenance Window is stored in lower case in the API, though not strictly 633 # documented. Terraform will downcase this to match (as opposed to throw a 634 # validation error). 635 maintenance_window = "Fri:09:00-Fri:09:30" 636 637 backup_retention_period = 0 638 storage_encrypted = true 639 kms_key_id = "${aws_kms_key.foo.arn}" 640 641 parameter_group_name = "default.mysql5.6" 642 } 643 ` 644 645 var testAccAWSDBInstanceConfigWithOptionGroup = fmt.Sprintf(` 646 647 resource "aws_db_option_group" "bar" { 648 name = "option-group-test-terraform" 649 option_group_description = "Test option group for terraform" 650 engine_name = "mysql" 651 major_engine_version = "5.6" 652 } 653 654 resource "aws_db_instance" "bar" { 655 identifier = "foobarbaz-test-terraform-%d" 656 657 allocated_storage = 10 658 engine = "MySQL" 659 instance_class = "db.m1.small" 660 name = "baz" 661 password = "barbarbarbar" 662 username = "foo" 663 664 backup_retention_period = 0 665 666 parameter_group_name = "default.mysql5.6" 667 option_group_name = "${aws_db_option_group.bar.name}" 668 }`, acctest.RandInt()) 669 670 func testAccReplicaInstanceConfig(val int) string { 671 return fmt.Sprintf(` 672 resource "aws_db_instance" "bar" { 673 identifier = "foobarbaz-test-terraform-%d" 674 675 allocated_storage = 5 676 engine = "mysql" 677 engine_version = "5.6.21" 678 instance_class = "db.t1.micro" 679 name = "baz" 680 password = "barbarbarbar" 681 username = "foo" 682 683 backup_retention_period = 1 684 685 parameter_group_name = "default.mysql5.6" 686 } 687 688 resource "aws_db_instance" "replica" { 689 identifier = "tf-replica-db-%d" 690 backup_retention_period = 0 691 replicate_source_db = "${aws_db_instance.bar.identifier}" 692 allocated_storage = "${aws_db_instance.bar.allocated_storage}" 693 engine = "${aws_db_instance.bar.engine}" 694 engine_version = "${aws_db_instance.bar.engine_version}" 695 instance_class = "${aws_db_instance.bar.instance_class}" 696 password = "${aws_db_instance.bar.password}" 697 username = "${aws_db_instance.bar.username}" 698 tags { 699 Name = "tf-replica-db" 700 } 701 } 702 `, val, val) 703 } 704 705 func testAccSnapshotInstanceConfig() string { 706 return fmt.Sprintf(` 707 provider "aws" { 708 region = "us-east-1" 709 } 710 resource "aws_db_instance" "snapshot" { 711 identifier = "tf-snapshot-%d" 712 713 allocated_storage = 5 714 engine = "mysql" 715 engine_version = "5.6.21" 716 instance_class = "db.t1.micro" 717 name = "baz" 718 password = "barbarbarbar" 719 username = "foo" 720 security_group_names = ["default"] 721 backup_retention_period = 1 722 723 publicly_accessible = true 724 725 parameter_group_name = "default.mysql5.6" 726 727 skip_final_snapshot = false 728 copy_tags_to_snapshot = true 729 final_snapshot_identifier = "foobarbaz-test-terraform-final-snapshot-1" 730 tags { 731 Name = "tf-tags-db" 732 } 733 }`, acctest.RandInt()) 734 } 735 736 func testAccNoSnapshotInstanceConfig() string { 737 return fmt.Sprintf(` 738 provider "aws" { 739 region = "us-east-1" 740 } 741 resource "aws_db_instance" "no_snapshot" { 742 identifier = "tf-test-%s" 743 744 allocated_storage = 5 745 engine = "mysql" 746 engine_version = "5.6.21" 747 instance_class = "db.t1.micro" 748 name = "baz" 749 password = "barbarbarbar" 750 publicly_accessible = true 751 username = "foo" 752 security_group_names = ["default"] 753 backup_retention_period = 1 754 755 parameter_group_name = "default.mysql5.6" 756 757 skip_final_snapshot = true 758 final_snapshot_identifier = "foobarbaz-test-terraform-final-snapshot-2" 759 } 760 `, acctest.RandString(5)) 761 } 762 763 func testAccSnapshotInstanceConfig_enhancedMonitoring(rName string) string { 764 return fmt.Sprintf(` 765 resource "aws_iam_role" "enhanced_policy_role" { 766 name = "enhanced-monitoring-role-%s" 767 assume_role_policy = <<EOF 768 { 769 "Version": "2012-10-17", 770 "Statement": [ 771 { 772 "Sid": "", 773 "Effect": "Allow", 774 "Principal": { 775 "Service": "monitoring.rds.amazonaws.com" 776 }, 777 "Action": "sts:AssumeRole" 778 } 779 ] 780 } 781 EOF 782 783 } 784 785 resource "aws_iam_policy_attachment" "test-attach" { 786 name = "enhanced-monitoring-attachment" 787 roles = [ 788 "${aws_iam_role.enhanced_policy_role.name}", 789 ] 790 791 policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole" 792 } 793 794 resource "aws_db_instance" "enhanced_monitoring" { 795 identifier = "foobarbaz-enhanced-monitoring-%s" 796 depends_on = ["aws_iam_policy_attachment.test-attach"] 797 798 allocated_storage = 5 799 engine = "mysql" 800 engine_version = "5.6.21" 801 instance_class = "db.m3.medium" 802 name = "baz" 803 password = "barbarbarbar" 804 username = "foo" 805 backup_retention_period = 1 806 807 parameter_group_name = "default.mysql5.6" 808 809 monitoring_role_arn = "${aws_iam_role.enhanced_policy_role.arn}" 810 monitoring_interval = "5" 811 812 skip_final_snapshot = true 813 }`, rName, rName) 814 } 815 816 func testAccSnapshotInstanceConfig_iopsUpdate(rName string, iops int) string { 817 return fmt.Sprintf(` 818 resource "aws_db_instance" "bar" { 819 identifier = "mydb-rds-%s" 820 engine = "mysql" 821 engine_version = "5.6.23" 822 instance_class = "db.t2.micro" 823 name = "mydb" 824 username = "foo" 825 password = "barbarbar" 826 parameter_group_name = "default.mysql5.6" 827 828 apply_immediately = true 829 830 storage_type = "io1" 831 allocated_storage = 200 832 iops = %d 833 }`, rName, iops) 834 } 835 836 func testAccSnapshotInstanceConfig_mysqlPort(rName string) string { 837 return fmt.Sprintf(` 838 resource "aws_db_instance" "bar" { 839 identifier = "mydb-rds-%s" 840 engine = "mysql" 841 engine_version = "5.6.23" 842 instance_class = "db.t2.micro" 843 name = "mydb" 844 username = "foo" 845 password = "barbarbar" 846 parameter_group_name = "default.mysql5.6" 847 port = 3306 848 allocated_storage = 10 849 850 apply_immediately = true 851 }`, rName) 852 } 853 854 func testAccSnapshotInstanceConfig_updateMysqlPort(rName string) string { 855 return fmt.Sprintf(` 856 resource "aws_db_instance" "bar" { 857 identifier = "mydb-rds-%s" 858 engine = "mysql" 859 engine_version = "5.6.23" 860 instance_class = "db.t2.micro" 861 name = "mydb" 862 username = "foo" 863 password = "barbarbar" 864 parameter_group_name = "default.mysql5.6" 865 port = 3305 866 allocated_storage = 10 867 868 apply_immediately = true 869 }`, rName) 870 } 871 872 func testAccAWSDBInstanceConfigWithSubnetGroup(rName string) string { 873 return fmt.Sprintf(` 874 resource "aws_vpc" "foo" { 875 cidr_block = "10.1.0.0/16" 876 } 877 878 resource "aws_subnet" "foo" { 879 cidr_block = "10.1.1.0/24" 880 availability_zone = "us-west-2a" 881 vpc_id = "${aws_vpc.foo.id}" 882 tags { 883 Name = "tf-dbsubnet-test-1" 884 } 885 } 886 887 resource "aws_subnet" "bar" { 888 cidr_block = "10.1.2.0/24" 889 availability_zone = "us-west-2b" 890 vpc_id = "${aws_vpc.foo.id}" 891 tags { 892 Name = "tf-dbsubnet-test-2" 893 } 894 } 895 896 resource "aws_db_subnet_group" "foo" { 897 name = "foo" 898 subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}"] 899 tags { 900 Name = "tf-dbsubnet-group-test" 901 } 902 } 903 904 resource "aws_db_instance" "bar" { 905 identifier = "mydb-rds-%s" 906 engine = "mysql" 907 engine_version = "5.6.23" 908 instance_class = "db.t2.micro" 909 name = "mydb" 910 username = "foo" 911 password = "barbarbar" 912 parameter_group_name = "default.mysql5.6" 913 db_subnet_group_name = "${aws_db_subnet_group.foo.name}" 914 port = 3305 915 allocated_storage = 10 916 917 apply_immediately = true 918 }`, rName) 919 } 920 921 func testAccAWSDBInstanceConfigWithSubnetGroupUpdated(rName string) string { 922 return fmt.Sprintf(` 923 resource "aws_vpc" "foo" { 924 cidr_block = "10.1.0.0/16" 925 } 926 927 resource "aws_vpc" "bar" { 928 cidr_block = "10.10.0.0/16" 929 } 930 931 resource "aws_subnet" "foo" { 932 cidr_block = "10.1.1.0/24" 933 availability_zone = "us-west-2a" 934 vpc_id = "${aws_vpc.foo.id}" 935 tags { 936 Name = "tf-dbsubnet-test-1" 937 } 938 } 939 940 resource "aws_subnet" "bar" { 941 cidr_block = "10.1.2.0/24" 942 availability_zone = "us-west-2b" 943 vpc_id = "${aws_vpc.foo.id}" 944 tags { 945 Name = "tf-dbsubnet-test-2" 946 } 947 } 948 949 resource "aws_subnet" "test" { 950 cidr_block = "10.10.3.0/24" 951 availability_zone = "us-west-2c" 952 vpc_id = "${aws_vpc.bar.id}" 953 tags { 954 Name = "tf-dbsubnet-test-3" 955 } 956 } 957 958 resource "aws_subnet" "another_test" { 959 cidr_block = "10.10.4.0/24" 960 availability_zone = "us-west-2a" 961 vpc_id = "${aws_vpc.bar.id}" 962 tags { 963 Name = "tf-dbsubnet-test-4" 964 } 965 } 966 967 resource "aws_db_subnet_group" "foo" { 968 name = "foo" 969 subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}"] 970 tags { 971 Name = "tf-dbsubnet-group-test" 972 } 973 } 974 975 resource "aws_db_subnet_group" "bar" { 976 name = "bar" 977 subnet_ids = ["${aws_subnet.test.id}", "${aws_subnet.another_test.id}"] 978 tags { 979 Name = "tf-dbsubnet-group-test-updated" 980 } 981 } 982 983 resource "aws_db_instance" "bar" { 984 identifier = "mydb-rds-%s" 985 engine = "mysql" 986 engine_version = "5.6.23" 987 instance_class = "db.t2.micro" 988 name = "mydb" 989 username = "foo" 990 password = "barbarbar" 991 parameter_group_name = "default.mysql5.6" 992 db_subnet_group_name = "${aws_db_subnet_group.bar.name}" 993 port = 3305 994 allocated_storage = 10 995 996 apply_immediately = true 997 }`, rName) 998 } 999 1000 const testAccAWSDBMSSQL_timezone = ` 1001 provider "aws" { 1002 region = "us-west-2" 1003 } 1004 1005 resource "aws_vpc" "foo" { 1006 cidr_block = "10.1.0.0/16" 1007 enable_dns_hostnames = true 1008 tags { 1009 Name = "tf-rds-mssql-timezone-test" 1010 } 1011 } 1012 1013 resource "aws_db_subnet_group" "rds_one" { 1014 name = "rds_one_db" 1015 description = "db subnets for rds_one" 1016 1017 subnet_ids = ["${aws_subnet.main.id}", "${aws_subnet.other.id}"] 1018 } 1019 1020 resource "aws_subnet" "main" { 1021 vpc_id = "${aws_vpc.foo.id}" 1022 availability_zone = "us-west-2a" 1023 cidr_block = "10.1.1.0/24" 1024 } 1025 1026 resource "aws_subnet" "other" { 1027 vpc_id = "${aws_vpc.foo.id}" 1028 availability_zone = "us-west-2b" 1029 cidr_block = "10.1.2.0/24" 1030 } 1031 1032 resource "aws_db_instance" "mssql" { 1033 #identifier = "tf-test-mssql" 1034 1035 db_subnet_group_name = "${aws_db_subnet_group.rds_one.name}" 1036 1037 instance_class = "db.t2.micro" 1038 allocated_storage = 20 1039 username = "somecrazyusername" 1040 password = "somecrazypassword" 1041 engine = "sqlserver-ex" 1042 backup_retention_period = 0 1043 1044 #publicly_accessible = true 1045 1046 vpc_security_group_ids = ["${aws_security_group.rds-mssql.id}"] 1047 } 1048 1049 resource "aws_security_group" "rds-mssql" { 1050 name = "tf-rds-mssql-test" 1051 1052 description = "TF Testing" 1053 vpc_id = "${aws_vpc.foo.id}" 1054 } 1055 1056 resource "aws_security_group_rule" "rds-mssql-1" { 1057 type = "egress" 1058 from_port = 0 1059 to_port = 0 1060 protocol = "-1" 1061 cidr_blocks = ["0.0.0.0/0"] 1062 1063 security_group_id = "${aws_security_group.rds-mssql.id}" 1064 } 1065 ` 1066 1067 const testAccAWSDBMSSQL_timezone_AKST = ` 1068 provider "aws" { 1069 region = "us-west-2" 1070 } 1071 1072 resource "aws_vpc" "foo" { 1073 cidr_block = "10.1.0.0/16" 1074 enable_dns_hostnames = true 1075 tags { 1076 Name = "tf-rds-mssql-timezone-test" 1077 } 1078 } 1079 1080 resource "aws_db_subnet_group" "rds_one" { 1081 name = "rds_one_db" 1082 description = "db subnets for rds_one" 1083 1084 subnet_ids = ["${aws_subnet.main.id}", "${aws_subnet.other.id}"] 1085 } 1086 1087 resource "aws_subnet" "main" { 1088 vpc_id = "${aws_vpc.foo.id}" 1089 availability_zone = "us-west-2a" 1090 cidr_block = "10.1.1.0/24" 1091 } 1092 1093 resource "aws_subnet" "other" { 1094 vpc_id = "${aws_vpc.foo.id}" 1095 availability_zone = "us-west-2b" 1096 cidr_block = "10.1.2.0/24" 1097 } 1098 1099 resource "aws_db_instance" "mssql" { 1100 #identifier = "tf-test-mssql" 1101 1102 db_subnet_group_name = "${aws_db_subnet_group.rds_one.name}" 1103 1104 instance_class = "db.t2.micro" 1105 allocated_storage = 20 1106 username = "somecrazyusername" 1107 password = "somecrazypassword" 1108 engine = "sqlserver-ex" 1109 backup_retention_period = 0 1110 1111 #publicly_accessible = true 1112 1113 vpc_security_group_ids = ["${aws_security_group.rds-mssql.id}"] 1114 timezone = "Alaskan Standard Time" 1115 } 1116 1117 resource "aws_security_group" "rds-mssql" { 1118 name = "tf-rds-mssql-test" 1119 1120 description = "TF Testing" 1121 vpc_id = "${aws_vpc.foo.id}" 1122 } 1123 1124 resource "aws_security_group_rule" "rds-mssql-1" { 1125 type = "egress" 1126 from_port = 0 1127 to_port = 0 1128 protocol = "-1" 1129 cidr_blocks = ["0.0.0.0/0"] 1130 1131 security_group_id = "${aws_security_group.rds-mssql.id}" 1132 } 1133 ` 1134 1135 var testAccAWSDBInstanceConfigAutoMinorVersion = fmt.Sprintf(` 1136 resource "aws_db_instance" "bar" { 1137 identifier = "foobarbaz-test-terraform-%d" 1138 allocated_storage = 10 1139 engine = "MySQL" 1140 engine_version = "5.6" 1141 instance_class = "db.t1.micro" 1142 name = "baz" 1143 password = "barbarbarbar" 1144 username = "foo" 1145 } 1146 `, acctest.RandInt())