diff --git a/aws/resource_aws_db_instance.go b/aws/resource_aws_db_instance.go index d82e82ad7ea3..e7177a7fe898 100644 --- a/aws/resource_aws_db_instance.go +++ b/aws/resource_aws_db_instance.go @@ -672,13 +672,13 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error var requiresModifyDbInstance bool opts := rds.RestoreDBInstanceFromDBSnapshotInput{ + AutoMinorVersionUpgrade: aws.Bool(d.Get("auto_minor_version_upgrade").(bool)), + CopyTagsToSnapshot: aws.Bool(d.Get("copy_tags_to_snapshot").(bool)), DBInstanceClass: aws.String(d.Get("instance_class").(string)), DBInstanceIdentifier: aws.String(d.Get("identifier").(string)), DBSnapshotIdentifier: aws.String(d.Get("snapshot_identifier").(string)), - AutoMinorVersionUpgrade: aws.Bool(d.Get("auto_minor_version_upgrade").(bool)), PubliclyAccessible: aws.Bool(d.Get("publicly_accessible").(bool)), Tags: tags, - CopyTagsToSnapshot: aws.Bool(d.Get("copy_tags_to_snapshot").(bool)), } if attr, ok := d.GetOk("name"); ok { @@ -696,6 +696,14 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error opts.AvailabilityZone = aws.String(attr.(string)) } + if _, ok := d.GetOk("backup_retention_period"); ok { + requiresModifyDbInstance = true + } + + if _, ok := d.GetOk("backup_window"); ok { + requiresModifyDbInstance = true + } + if attr, ok := d.GetOk("db_subnet_group_name"); ok { opts.DBSubnetGroupName = aws.String(attr.(string)) } @@ -708,6 +716,10 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error opts.Engine = aws.String(attr.(string)) } + if _, ok := d.GetOk("iam_database_authentication_enabled"); ok { + requiresModifyDbInstance = true + } + if attr, ok := d.GetOk("iops"); ok { opts.Iops = aws.Int64(int64(attr.(int))) } @@ -716,6 +728,18 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error opts.LicenseModel = aws.String(attr.(string)) } + if _, ok := d.GetOk("maintenance_window"); ok { + requiresModifyDbInstance = true + } + + if _, ok := d.GetOk("monitoring_interval"); ok { + requiresModifyDbInstance = true + } + + if _, ok := d.GetOk("monitoring_role_arn"); ok { + requiresModifyDbInstance = true + } + if attr, ok := d.GetOk("multi_az"); ok { // When using SQL Server engine with MultiAZ enabled, its not // possible to immediately enable mirroring since @@ -732,7 +756,10 @@ func resourceAwsDbInstanceCreate(d *schema.ResourceData, meta interface{}) error if attr, ok := d.GetOk("option_group_name"); ok { opts.OptionGroupName = aws.String(attr.(string)) + } + if _, ok := d.GetOk("parameter_group_name"); ok { + requiresModifyDbInstance = true } if _, ok := d.GetOk("password"); ok { diff --git a/aws/resource_aws_db_instance_test.go b/aws/resource_aws_db_instance_test.go index 6ee847a7996b..c3710fe1b705 100644 --- a/aws/resource_aws_db_instance_test.go +++ b/aws/resource_aws_db_instance_test.go @@ -365,6 +365,141 @@ func TestAccAWSDBInstance_SnapshotIdentifier(t *testing.T) { }) } +func TestAccAWSDBInstance_SnapshotIdentifier_BackupRetentionPeriod(t *testing.T) { + var dbInstance, sourceDbInstance rds.DBInstance + var dbSnapshot rds.DBSnapshot + + rName := acctest.RandomWithPrefix("tf-acc-test") + sourceDbResourceName := "aws_db_instance.source" + snapshotResourceName := "aws_db_snapshot.test" + resourceName := "aws_db_instance.test" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSDBInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSDBInstanceConfig_SnapshotIdentifier_BackupRetentionPeriod(rName, 1), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSDBInstanceExists(sourceDbResourceName, &sourceDbInstance), + testAccCheckDbSnapshotExists(snapshotResourceName, &dbSnapshot), + testAccCheckAWSDBInstanceExists(resourceName, &dbInstance), + resource.TestCheckResourceAttr(resourceName, "backup_retention_period", "1"), + ), + }, + }, + }) +} + +func TestAccAWSDBInstance_SnapshotIdentifier_BackupWindow(t *testing.T) { + var dbInstance, sourceDbInstance rds.DBInstance + var dbSnapshot rds.DBSnapshot + + rName := acctest.RandomWithPrefix("tf-acc-test") + sourceDbResourceName := "aws_db_instance.source" + snapshotResourceName := "aws_db_snapshot.test" + resourceName := "aws_db_instance.test" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSDBInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSDBInstanceConfig_SnapshotIdentifier_BackupWindow(rName, "00:00-08:00"), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSDBInstanceExists(sourceDbResourceName, &sourceDbInstance), + testAccCheckDbSnapshotExists(snapshotResourceName, &dbSnapshot), + testAccCheckAWSDBInstanceExists(resourceName, &dbInstance), + resource.TestCheckResourceAttr(resourceName, "backup_window", "00:00-08:00"), + ), + }, + }, + }) +} + +func TestAccAWSDBInstance_SnapshotIdentifier_IamDatabaseAuthenticationEnabled(t *testing.T) { + var dbInstance, sourceDbInstance rds.DBInstance + var dbSnapshot rds.DBSnapshot + + rName := acctest.RandomWithPrefix("tf-acc-test") + sourceDbResourceName := "aws_db_instance.source" + snapshotResourceName := "aws_db_snapshot.test" + resourceName := "aws_db_instance.test" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSDBInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSDBInstanceConfig_SnapshotIdentifier_IamDatabaseAuthenticationEnabled(rName, true), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSDBInstanceExists(sourceDbResourceName, &sourceDbInstance), + testAccCheckDbSnapshotExists(snapshotResourceName, &dbSnapshot), + testAccCheckAWSDBInstanceExists(resourceName, &dbInstance), + resource.TestCheckResourceAttr(resourceName, "iam_database_authentication_enabled", "true"), + ), + }, + }, + }) +} + +func TestAccAWSDBInstance_SnapshotIdentifier_MaintenanceWindow(t *testing.T) { + var dbInstance, sourceDbInstance rds.DBInstance + var dbSnapshot rds.DBSnapshot + + rName := acctest.RandomWithPrefix("tf-acc-test") + sourceDbResourceName := "aws_db_instance.source" + snapshotResourceName := "aws_db_snapshot.test" + resourceName := "aws_db_instance.test" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSDBInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSDBInstanceConfig_SnapshotIdentifier_MaintenanceWindow(rName, "sun:01:00-sun:01:30"), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSDBInstanceExists(sourceDbResourceName, &sourceDbInstance), + testAccCheckDbSnapshotExists(snapshotResourceName, &dbSnapshot), + testAccCheckAWSDBInstanceExists(resourceName, &dbInstance), + resource.TestCheckResourceAttr(resourceName, "maintenance_window", "sun:01:00-sun:01:30"), + ), + }, + }, + }) +} + +func TestAccAWSDBInstance_SnapshotIdentifier_Monitoring(t *testing.T) { + var dbInstance, sourceDbInstance rds.DBInstance + var dbSnapshot rds.DBSnapshot + + rName := acctest.RandomWithPrefix("tf-acc-test") + sourceDbResourceName := "aws_db_instance.source" + snapshotResourceName := "aws_db_snapshot.test" + resourceName := "aws_db_instance.test" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSDBInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSDBInstanceConfig_SnapshotIdentifier_Monitoring(rName, 5), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSDBInstanceExists(sourceDbResourceName, &sourceDbInstance), + testAccCheckDbSnapshotExists(snapshotResourceName, &dbSnapshot), + testAccCheckAWSDBInstanceExists(resourceName, &dbInstance), + resource.TestCheckResourceAttr(resourceName, "monitoring_interval", "5"), + ), + }, + }, + }) +} + func TestAccAWSDBInstance_SnapshotIdentifier_MultiAZ(t *testing.T) { var dbInstance, sourceDbInstance rds.DBInstance var dbSnapshot rds.DBSnapshot @@ -419,6 +554,33 @@ func TestAccAWSDBInstance_SnapshotIdentifier_MultiAZ_SQLServer(t *testing.T) { }) } +func TestAccAWSDBInstance_SnapshotIdentifier_ParameterGroupName(t *testing.T) { + var dbInstance, sourceDbInstance rds.DBInstance + var dbSnapshot rds.DBSnapshot + + rName := acctest.RandomWithPrefix("tf-acc-test") + sourceDbResourceName := "aws_db_instance.source" + snapshotResourceName := "aws_db_snapshot.test" + resourceName := "aws_db_instance.test" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSDBInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSDBInstanceConfig_SnapshotIdentifier_ParameterGroupName(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSDBInstanceExists(sourceDbResourceName, &sourceDbInstance), + testAccCheckDbSnapshotExists(snapshotResourceName, &dbSnapshot), + testAccCheckAWSDBInstanceExists(resourceName, &dbInstance), + resource.TestCheckResourceAttr(resourceName, "parameter_group_name", rName), + ), + }, + }, + }) +} + func TestAccAWSDBInstance_SnapshotIdentifier_Tags(t *testing.T) { var dbInstance, sourceDbInstance rds.DBInstance var dbSnapshot rds.DBSnapshot @@ -2155,6 +2317,168 @@ resource "aws_db_instance" "test" { `, rName, rName, rName) } +func testAccAWSDBInstanceConfig_SnapshotIdentifier_BackupRetentionPeriod(rName string, backupRetentionPeriod int) string { + return fmt.Sprintf(` +resource "aws_db_instance" "source" { + allocated_storage = 5 + engine = "mariadb" + identifier = "%s-source" + instance_class = "db.t2.micro" + password = "avoid-plaintext-passwords" + username = "tfacctest" + skip_final_snapshot = true +} + +resource "aws_db_snapshot" "test" { + db_instance_identifier = "${aws_db_instance.source.id}" + db_snapshot_identifier = %q +} + +resource "aws_db_instance" "test" { + backup_retention_period = %d + identifier = %q + instance_class = "${aws_db_instance.source.instance_class}" + snapshot_identifier = "${aws_db_snapshot.test.id}" + skip_final_snapshot = true +} +`, rName, rName, backupRetentionPeriod, rName) +} + +func testAccAWSDBInstanceConfig_SnapshotIdentifier_BackupWindow(rName, backupWindow string) string { + return fmt.Sprintf(` +resource "aws_db_instance" "source" { + allocated_storage = 5 + engine = "mariadb" + identifier = "%s-source" + instance_class = "db.t2.micro" + password = "avoid-plaintext-passwords" + username = "tfacctest" + skip_final_snapshot = true +} + +resource "aws_db_snapshot" "test" { + db_instance_identifier = "${aws_db_instance.source.id}" + db_snapshot_identifier = %q +} + +resource "aws_db_instance" "test" { + backup_window = %q + identifier = %q + instance_class = "${aws_db_instance.source.instance_class}" + snapshot_identifier = "${aws_db_snapshot.test.id}" + skip_final_snapshot = true +} +`, rName, rName, backupWindow, rName) +} + +func testAccAWSDBInstanceConfig_SnapshotIdentifier_IamDatabaseAuthenticationEnabled(rName string, iamDatabaseAuthenticationEnabled bool) string { + return fmt.Sprintf(` +resource "aws_db_instance" "source" { + allocated_storage = 5 + engine = "mysql" + identifier = "%s-source" + instance_class = "db.t2.micro" + password = "avoid-plaintext-passwords" + username = "tfacctest" + skip_final_snapshot = true +} + +resource "aws_db_snapshot" "test" { + db_instance_identifier = "${aws_db_instance.source.id}" + db_snapshot_identifier = %q +} + +resource "aws_db_instance" "test" { + iam_database_authentication_enabled = %t + identifier = %q + instance_class = "${aws_db_instance.source.instance_class}" + snapshot_identifier = "${aws_db_snapshot.test.id}" + skip_final_snapshot = true +} +`, rName, rName, iamDatabaseAuthenticationEnabled, rName) +} + +func testAccAWSDBInstanceConfig_SnapshotIdentifier_MaintenanceWindow(rName, maintenanceWindow string) string { + return fmt.Sprintf(` +resource "aws_db_instance" "source" { + allocated_storage = 5 + engine = "mariadb" + identifier = "%s-source" + instance_class = "db.t2.micro" + password = "avoid-plaintext-passwords" + username = "tfacctest" + skip_final_snapshot = true +} + +resource "aws_db_snapshot" "test" { + db_instance_identifier = "${aws_db_instance.source.id}" + db_snapshot_identifier = %q +} + +resource "aws_db_instance" "test" { + identifier = %q + instance_class = "${aws_db_instance.source.instance_class}" + maintenance_window = %q + snapshot_identifier = "${aws_db_snapshot.test.id}" + skip_final_snapshot = true +} +`, rName, rName, rName, maintenanceWindow) +} + +func testAccAWSDBInstanceConfig_SnapshotIdentifier_Monitoring(rName string, monitoringInterval int) string { + return fmt.Sprintf(` +data "aws_partition" "current" {} + +resource "aws_iam_role" "test" { + name = %q + assume_role_policy = <