func resourceAwsS3BucketReplicationConfigurationUpdate(s3conn *s3.S3, d *schema.ResourceData) error { bucket := d.Get("bucket").(string) replicationConfiguration := d.Get("replication_configuration").([]interface{}) if len(replicationConfiguration) == 0 { i := &s3.DeleteBucketReplicationInput{ Bucket: aws.String(bucket), } err := resource.Retry(1*time.Minute, func() *resource.RetryError { if _, err := s3conn.DeleteBucketReplication(i); err != nil { return resource.NonRetryableError(err) } return nil }) if err != nil { return fmt.Errorf("Error removing S3 bucket replication: %s", err) } return nil } hasVersioning := false // Validate that bucket versioning is enabled if versioning, ok := d.GetOk("versioning"); ok { v := versioning.([]interface{}) if v[0].(map[string]interface{})["enabled"].(bool) { hasVersioning = true } } if !hasVersioning { return fmt.Errorf("versioning must be enabled to allow S3 bucket replication") } c := replicationConfiguration[0].(map[string]interface{}) rc := &s3.ReplicationConfiguration{} if val, ok := c["role"]; ok { rc.Role = aws.String(val.(string)) } rcRules := c["rules"].(*schema.Set).List() rules := []*s3.ReplicationRule{} for _, v := range rcRules { rr := v.(map[string]interface{}) rcRule := &s3.ReplicationRule{ Prefix: aws.String(rr["prefix"].(string)), Status: aws.String(rr["status"].(string)), } if rrid, ok := rr["id"]; ok { rcRule.ID = aws.String(rrid.(string)) } ruleDestination := &s3.Destination{} if destination, ok := rr["destination"]; ok { dest := destination.(*schema.Set).List() bd := dest[0].(map[string]interface{}) ruleDestination.Bucket = aws.String(bd["bucket"].(string)) if storageClass, ok := bd["storage_class"]; ok { ruleDestination.StorageClass = aws.String(storageClass.(string)) } } rcRule.Destination = ruleDestination rules = append(rules, rcRule) } rc.Rules = rules i := &s3.PutBucketReplicationInput{ Bucket: aws.String(bucket), ReplicationConfiguration: rc, } log.Printf("[DEBUG] S3 put bucket replication configuration: %#v", i) _, err := s3conn.PutBucketReplication(i) if err != nil { return fmt.Errorf("Error putting S3 replication configuration: %s", err) } return nil }