github.com/schwarzm/garden-linux@v0.0.0-20150507151835-33bca2147c47/scripts/awsreaper/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"time"
     8  
     9  	"github.com/awslabs/aws-sdk-go/aws"
    10  	"github.com/awslabs/aws-sdk-go/service/ec2"
    11  )
    12  
    13  func main() {
    14  	tagName := flag.String("tagName", "garden-ci-test-instance", "Name of tags to terminate")
    15  	lifeTime := flag.Duration("lifeTime", time.Hour, "The allowed lifetime of an instance")
    16  	dryRun := flag.Bool("dryRun", false, "Do not actually terminate instances")
    17  	region := flag.String("region", "us-east-1", "The aws region")
    18  
    19  	flag.Parse()
    20  
    21  	creds, err := aws.EnvCreds()
    22  	if err != nil {
    23  		log.Fatal("Please ensure that the AWS_SECRET_KEY and AWS_ACCESS_KEY variables are set")
    24  	}
    25  	ec2Config := &aws.Config{
    26  		Region:      *region,
    27  		Credentials: creds,
    28  	}
    29  
    30  	ec2Client := ec2.New(ec2Config)
    31  
    32  	tagValue := "tag-value"
    33  	state := "instance-state-name"
    34  	stateValue := "running"
    35  	fmt.Println("Getting instances for termination...")
    36  	output, err := ec2Client.DescribeInstances(&ec2.DescribeInstancesInput{
    37  		Filters: []*ec2.Filter{
    38  			&ec2.Filter{
    39  				Name: &tagValue, Values: []*string{tagName},
    40  			},
    41  			&ec2.Filter{
    42  				Name: &state, Values: []*string{&stateValue},
    43  			},
    44  		},
    45  	})
    46  	if err != nil {
    47  		log.Fatal(err)
    48  	}
    49  
    50  	instancesToKill := []*string{}
    51  	for _, reservation := range output.Reservations {
    52  		for _, instance := range reservation.Instances {
    53  			uptime := time.Now().UTC().Sub(*instance.LaunchTime)
    54  			if uptime < *lifeTime {
    55  				continue
    56  			}
    57  			fmt.Println("*************************")
    58  			fmt.Printf("Instance: %s\n", *instance.InstanceID)
    59  			fmt.Printf("State: %v\n", *instance.State.Name)
    60  			fmt.Printf("LaunchTime: %v\n", *instance.LaunchTime)
    61  			fmt.Printf("Uptime: %v\n", uptime)
    62  			fmt.Println("*************************")
    63  			fmt.Println("")
    64  
    65  			instancesToKill = append(instancesToKill, instance.InstanceID)
    66  		}
    67  	}
    68  
    69  	if len(instancesToKill) == 0 {
    70  		fmt.Println("Nothing to terminate")
    71  		return
    72  	}
    73  
    74  	fmt.Println("Terminating instances...")
    75  	_, err = ec2Client.TerminateInstances(&ec2.TerminateInstancesInput{
    76  		DryRun:      dryRun,
    77  		InstanceIDs: instancesToKill,
    78  	})
    79  
    80  	if err != nil {
    81  		log.Fatal(err)
    82  	}
    83  
    84  	fmt.Println("Done")
    85  }