tool/clean/clean_ebs/clean_ebs.go (53 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package main
import (
"context"
"log"
"time"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/aws/amazon-cloudwatch-agent/tool/clean"
)
// Clean ebs volumes if they have been open longer than 7 day and unused
func main() {
err := cleanVolumes()
if err != nil {
log.Fatalf("errors cleaning %v", err)
}
}
func cleanVolumes() error {
log.Print("Begin to clean EBS Volumes")
ctx := context.Background()
defaultConfig, err := config.LoadDefaultConfig(ctx)
if err != nil {
return err
}
ec2Client := ec2.NewFromConfig(defaultConfig)
return deleteUnusedVolumes(ctx, ec2Client)
}
func deleteUnusedVolumes(ctx context.Context, client *ec2.Client) error {
input := &ec2.DescribeVolumesInput{
Filters: []types.Filter{
{
//if the status is availble, then EBS volume is not currently attached to any ec2 instance (so not being used)
Name: aws.String("status"),
Values: []string{"available"},
},
},
}
volumes, err := client.DescribeVolumes(ctx, input)
if err != nil {
return err
}
for _, volume := range volumes.Volumes {
if time.Since(*volume.CreateTime) > clean.KeepDurationOneWeek && len(volume.Attachments) == 0 {
log.Printf("Deleting unused volume %s", *volume.VolumeId)
_, err = client.DeleteVolume(ctx, &ec2.DeleteVolumeInput{
VolumeId: volume.VolumeId,
})
}
if err != nil {
log.Printf("Error deleting volume %s: %v", *volume.VolumeId, err)
}
}
return nil
}