In cloud environments, managing storage costs is crucial for optimizing infrastructure. AWS S3 buckets can accumulate unused data over time, resulting in unnecessary expenses. Automating the cleanup of these buckets not only helps maintain a clean and cost-effective environment but simplifies bucket management. This guide will explore how to automate AWS S3 cleanup using Go and the Cobra CLI.

Introduction to Automating AWS S3 Cleanup

AWS S3 is a powerful object storage service, but unused buckets and old objects can lead to high costs over time. Automating the cleanup process ensures that only necessary resources are retained, saving time and money. By leveraging the Go programming language and Cobra CLI, we can create a streamlined, efficient command-line tool to list, empty, and delete unwanted buckets.

Setting Up the Go Project Environment

Setting up a clean development environment for your project is essential before diving into the code. First, make sure you have Go installed on your machine and create a new project directory for the cleanup utility.

  1. Install Go: You can download and install Go from the official website.
  2. Create a new Go module:
    mkdir s3-cleanup

cd s3-cleanup

go mod init github.com/yourusername/s3-cleanup

  1. Install Cobra CLI: Cobra CLI is a library for creating CLI applications in Go. Install it using:
    go get -u github.com/spf13/cobra/cobra

Integrating AWS SDK and Cobra CLI

We will integrate the AWS SDK for Go to interact with AWS S3. This allows us to programmatically access S3, list buckets, and perform operations like emptying and deleting them.

  1. Install the AWS SDK:
    go get github.com/aws/aws-sdk-go
  2. Set up Cobra CLI: Create a new Cobra-based CLI command to serve as the entry point for your S3 cleanup tool.
    cobra init

This command will scaffold a basic CLI structure. Add a new command to handle bucket cleanup.

Listing and Selecting Buckets for Deletion

The first step is to list all the S3 buckets in your AWS account and allow users to choose which ones to delete. Using the AWS SDK, we can fetch and display the list of buckets:

  1. List Buckets Code:
    func listBuckets(svc *s3.S3) ([]*s3.Bucket, error) {

    result, err := svc.ListBuckets(&s3.ListBucketsInput{})

    if err != nil {

        return nil, err

    }

    return result.Buckets, nil

}

  1. Display Buckets to User: In the Cobra command, prompt the user to select one or more buckets for deletion.

Implementing Bucket Emptying and Deletion Logic

Once the user selects the buckets, the next step is to ensure that the buckets are emptied before deletion. S3 does not allow the deletion of non-empty buckets, so it’s essential to first remove all objects within them.

  1. Empty Bucket Code:
    func emptyBucket(svc *s3.S3, bucketName string) error {

    // Code to list and delete all objects in the bucket

}

  1. Delete Bucket: Once the bucket is emptied, delete the bucket:
    func deleteBucket(svc *s3.S3, bucketName string) error {

    _, err := svc.DeleteBucket(&s3.DeleteBucketInput{

        Bucket: aws.String(bucketName),

    })

    return err

}

Adding User Confirmation and Error Handling

It’s important to implement a confirmation step to prevent accidental deletion of buckets. You can prompt users with a simple yes/no confirmation before proceeding with the deletion.

  1. User Confirmation Prompt:
    func confirmDeletion(bucketName string) bool {

    fmt.Printf(“Are you sure you want to delete bucket %s? (y/n): “, bucketName)

    var response string

    fmt.Scanln(&response)

    return strings.ToLower(response) == “y”

}

  1. Error Handling: Ensure proper error handling for cases where the bucket cannot be emptied or deleted due to permissions or other issues.

Finalizing and Testing the Cleanup Utility

After implementing the core features, finalize your tool by thoroughly testing it. Test it in different environments, such as accounts with various permissions and buckets with different configurations (e.g., versioning enabled).

  1. Test Cases:
    • Deleting an empty bucket.
    • Deleting a bucket with objects.
    • Handling permission errors.
    • Ensuring confirmation prompt works.
  2. Run Tests: Make sure the tool handles different edge cases without crashing, and provides meaningful feedback to the user in case of failures.

Enhancements and Future Directions

While the basic functionality covers listing, emptying, and deleting buckets, there are several enhancements you could add in the future:

  • Logging: Add logging for audit purposes.
  • Scheduled Cleanup: Implement a scheduler (e.g., using AWS Lambda) to automatically run the cleanup periodically.
  • Tag-Based Filtering: Delete buckets based on specific tags or criteria.
  • Dry Run Mode: Allow users to simulate the deletion process without actually deleting any buckets.

Conclusion

Automating AWS S3 cleanup with Go and Cobra CLI streamlines the bucket management process, helping to maintain a cost-effective cloud environment. By integrating the AWS SDK and Cobra CLI, we’ve built a powerful and efficient tool that not only automates the cleanup but also ensures user control and error handling throughout the process.

References

Use high-level (s3) commands with the AWS CLI

Deleting a bucket