コード例 #1
0
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)
}