S3 bucket force_destroy error: MalformedXML

AWS provider was not checking whether DeleteMarkers are left in S3
bucket causing s3.DeleteObjectsInput to send empty XML which resulted in
400 error and MalformedXML message.
This commit is contained in:
Piotr Komborski 2015-12-04 15:10:26 +00:00
parent dbd6a1fd72
commit 3d28b8dec2
1 changed files with 30 additions and 14 deletions

View File

@ -406,30 +406,46 @@ func resourceAwsS3BucketDelete(d *schema.ResourceData, meta interface{}) error {
log.Printf("[DEBUG] S3 Bucket attempting to forceDestroy %+v", err)
bucket := d.Get("bucket").(string)
resp, err := s3conn.ListObjects(
&s3.ListObjectsInput{
resp, err := s3conn.ListObjectVersions(
&s3.ListObjectVersionsInput{
Bucket: aws.String(bucket),
},
)
if err != nil {
return fmt.Errorf("Error S3 Bucket list Objects err: %s", err)
return fmt.Errorf("Error S3 Bucket list Object Versions err: %s", err)
}
objectsToDelete := make([]*s3.ObjectIdentifier, len(resp.Contents))
for i, v := range resp.Contents {
objectsToDelete[i] = &s3.ObjectIdentifier{
Key: v.Key,
objectsToDelete := make([]*s3.ObjectIdentifier, 0)
if len(resp.DeleteMarkers) != 0 {
for _, v := range resp.DeleteMarkers {
objectsToDelete = append(objectsToDelete, &s3.ObjectIdentifier{
Key: v.Key,
VersionId: v.VersionId,
})
}
}
_, err = s3conn.DeleteObjects(
&s3.DeleteObjectsInput{
Bucket: aws.String(bucket),
Delete: &s3.Delete{
Objects: objectsToDelete,
},
if len(resp.Versions) != 0 {
for _, v := range resp.Versions {
objectsToDelete = append(objectsToDelete, &s3.ObjectIdentifier{
Key: v.Key,
VersionId: v.VersionId,
})
}
}
params := &s3.DeleteObjectsInput{
Bucket: aws.String(bucket),
Delete: &s3.Delete{
Objects: objectsToDelete,
},
)
}
_, err = s3conn.DeleteObjects(params)
if err != nil {
return fmt.Errorf("Error S3 Bucket force_destroy error deleting: %s", err)
}