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  }