func resource_aws_db_instance_create( s *terraform.ResourceState, d *terraform.ResourceDiff, meta interface{}) (*terraform.ResourceState, error) { p := meta.(*ResourceProvider) conn := p.rdsconn // Merge the diff into the state so that we have all the attributes // properly. rs := s.MergeDiff(d) var err error var attr string opts := rds.CreateDBInstance{} if attr = rs.Attributes["allocated_storage"]; attr != "" { opts.AllocatedStorage, err = strconv.Atoi(attr) opts.SetAllocatedStorage = true } if attr = rs.Attributes["backup_retention_period"]; attr != "" { opts.BackupRetentionPeriod, err = strconv.Atoi(attr) opts.SetBackupRetentionPeriod = true } if attr = rs.Attributes["iops"]; attr != "" { opts.Iops, err = strconv.Atoi(attr) opts.SetIops = true } if attr = rs.Attributes["port"]; attr != "" { opts.Port, err = strconv.Atoi(attr) opts.SetPort = true } if attr = rs.Attributes["availability_zone"]; attr != "" { opts.AvailabilityZone = attr } if attr = rs.Attributes["instance_class"]; attr != "" { opts.DBInstanceClass = attr } if attr = rs.Attributes["maintenance_window"]; attr != "" { opts.PreferredMaintenanceWindow = attr } if attr = rs.Attributes["backup_window"]; attr != "" { opts.PreferredBackupWindow = attr } if attr = rs.Attributes["multi_az"]; attr == "true" { opts.MultiAZ = true } if attr = rs.Attributes["publicly_accessible"]; attr == "true" { opts.PubliclyAccessible = true } if attr = rs.Attributes["subnet_group_name"]; attr != "" { opts.DBSubnetGroupName = attr } if err != nil { return nil, fmt.Errorf("Error parsing configuration: %s", err) } if _, ok := rs.Attributes["vpc_security_group_ids.#"]; ok { opts.VpcSecurityGroupIds = expandStringList(flatmap.Expand( rs.Attributes, "vpc_security_group_ids").([]interface{})) } if _, ok := rs.Attributes["security_group_names.#"]; ok { opts.DBSecurityGroupNames = expandStringList(flatmap.Expand( rs.Attributes, "security_group_names").([]interface{})) } opts.DBInstanceIdentifier = rs.Attributes["identifier"] opts.DBName = rs.Attributes["name"] opts.MasterUsername = rs.Attributes["username"] opts.MasterUserPassword = rs.Attributes["password"] opts.EngineVersion = rs.Attributes["engine_version"] opts.Engine = rs.Attributes["engine"] // Don't keep the password around in the state delete(rs.Attributes, "password") log.Printf("[DEBUG] DB Instance create configuration: %#v", opts) _, err = conn.CreateDBInstance(&opts) if err != nil { return nil, fmt.Errorf("Error creating DB Instance: %s", err) } rs.ID = rs.Attributes["identifier"] log.Printf("[INFO] DB Instance ID: %s", rs.ID) log.Println( "[INFO] Waiting for DB Instance to be available") stateConf := &resource.StateChangeConf{ Pending: []string{"creating", "backing-up", "modifying"}, Target: "available", Refresh: DBInstanceStateRefreshFunc(rs.ID, conn), Timeout: 10 * time.Minute, MinTimeout: 10 * time.Second, Delay: 30 * time.Second, // Wait 30 secs before starting } // Wait, catching any errors _, err = stateConf.WaitForState() if err != nil { return rs, err } v, err := resource_aws_db_instance_retrieve(rs.ID, conn) if err != nil { return rs, err } return resource_aws_db_instance_update_state(rs, v) }