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 }