github.com/aavshr/aws-sdk-go@v1.41.3/awstesting/cmd/bucket_cleanup/main.go (about) 1 //go:build integration 2 // +build integration 3 4 package main 5 6 import ( 7 "fmt" 8 "os" 9 "strings" 10 11 "github.com/aavshr/aws-sdk-go/aws" 12 "github.com/aavshr/aws-sdk-go/aws/session" 13 "github.com/aavshr/aws-sdk-go/service/s3" 14 ) 15 16 // Searches the buckets of an account that match the prefix, and deletes 17 // those buckets, and all objects within. Before deleting will prompt user 18 // to confirm bucket should be deleted. Positive confirmation is required. 19 // 20 // Usage: 21 // go run deleteBuckets.go <bucketPrefix> 22 func main() { 23 sess := session.Must(session.NewSession()) 24 25 svc := s3.New(sess) 26 buckets, err := svc.ListBuckets(&s3.ListBucketsInput{}) 27 if err != nil { 28 panic(fmt.Sprintf("failed to list buckets, %v", err)) 29 } 30 31 if len(os.Args) < 2 { 32 fmt.Fprintln(os.Stderr, "bucket prefix required") 33 os.Exit(1) 34 } 35 bucketPrefix := os.Args[1] 36 37 var failed bool 38 for _, b := range buckets.Buckets { 39 bucket := aws.StringValue(b.Name) 40 41 if !strings.HasPrefix(bucket, bucketPrefix) { 42 continue 43 } 44 45 fmt.Printf("Delete bucket %q? [y/N]: ", bucket) 46 var v string 47 if _, err := fmt.Scanln(&v); err != nil || !(v == "Y" || v == "y") { 48 fmt.Println("\tSkipping") 49 continue 50 } 51 52 fmt.Println("\tDeleting") 53 if err := deleteBucket(svc, bucket); err != nil { 54 fmt.Fprintf(os.Stderr, "failed to delete bucket %q, %v", bucket, err) 55 failed = true 56 } 57 } 58 59 if failed { 60 os.Exit(1) 61 } 62 } 63 64 func deleteBucket(svc *s3.S3, bucket string) error { 65 bucketName := &bucket 66 67 objs, err := svc.ListObjects(&s3.ListObjectsInput{Bucket: bucketName}) 68 if err != nil { 69 return fmt.Errorf("failed to list bucket %q objects, %v", *bucketName, err) 70 } 71 72 for _, o := range objs.Contents { 73 svc.DeleteObject(&s3.DeleteObjectInput{Bucket: bucketName, Key: o.Key}) 74 } 75 76 uploads, err := svc.ListMultipartUploads(&s3.ListMultipartUploadsInput{Bucket: bucketName}) 77 if err != nil { 78 return fmt.Errorf("failed to list bucket %q multipart objects, %v", *bucketName, err) 79 } 80 81 for _, u := range uploads.Uploads { 82 svc.AbortMultipartUpload(&s3.AbortMultipartUploadInput{ 83 Bucket: bucketName, 84 Key: u.Key, 85 UploadId: u.UploadId, 86 }) 87 } 88 89 _, err = svc.DeleteBucket(&s3.DeleteBucketInput{Bucket: bucketName}) 90 if err != nil { 91 return fmt.Errorf("failed to delete bucket %q, %v", *bucketName, err) 92 } 93 94 return nil 95 }