1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
// +build example
package main
import (
"flag"
"fmt"
"os"
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
)
// Prints a list of instances for each region. If no regions are provided
// all regions will be searched. The state is required.
//
// Will use the AWS SDK for Go's default credential chain and region. You can
// specify the region with the AWS_REGION environment variable.
//
// Usage: instancesByRegion -state <value> [-state val...] [-region region...]
func main() {
states, regions := parseArguments()
if len(states) == 0 {
fmt.Fprintf(os.Stderr, "error: %v\n", usage())
os.Exit(1)
}
instanceCriteria := " "
for _, state := range states {
instanceCriteria += "[" + state + "]"
}
if len(regions) == 0 {
var err error
regions, err = fetchRegion()
if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
for _, region := range regions {
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String(region),
}))
ec2Svc := ec2.New(sess)
params := &ec2.DescribeInstancesInput{
Filters: []*ec2.Filter{
{
Name: aws.String("instance-state-name"),
Values: aws.StringSlice(states),
},
},
}
result, err := ec2Svc.DescribeInstances(params)
if err != nil {
fmt.Println("Error", err)
} else {
fmt.Printf("\n\n\nFetching instance details for region: %s with criteria: %s**\n ", region, instanceCriteria)
if len(result.Reservations) == 0 {
fmt.Printf("There is no instance for the region: %s with the matching criteria:%s \n", region, instanceCriteria)
}
for _, reservation := range result.Reservations {
fmt.Println("printing instance details.....")
for _, instance := range reservation.Instances {
fmt.Println("instance id " + *instance.InstanceId)
fmt.Println("current State " + *instance.State.Name)
}
}
fmt.Printf("done for region %s **** \n", region)
}
}
}
func fetchRegion() ([]string, error) {
awsSession := session.Must(session.NewSession(&aws.Config{}))
svc := ec2.New(awsSession)
awsRegions, err := svc.DescribeRegions(&ec2.DescribeRegionsInput{})
if err != nil {
return nil, err
}
regions := make([]string, 0, len(awsRegions.Regions))
for _, region := range awsRegions.Regions {
regions = append(regions, *region.RegionName)
}
return regions, nil
}
type flagArgs []string
func (a flagArgs) String() string {
return strings.Join(a.Args(), ",")
}
func (a *flagArgs) Set(value string) error {
*a = append(*a, value)
return nil
}
func (a flagArgs) Args() []string {
return []string(a)
}
func parseArguments() (states []string, regions []string) {
var stateArgs, regionArgs flagArgs
flag.Var(&stateArgs, "state", "state list")
flag.Var(®ionArgs, "region", "region list")
flag.Parse()
if flag.NFlag() != 0 {
states = append([]string{}, stateArgs.Args()...)
regions = append([]string{}, regionArgs.Args()...)
}
return states, regions
}
func usage() string {
return `
Missing mandatory flag 'state'. Please use like below Example:
To fetch the stopped instance of all region use below:
./filter_ec2_by_region -state running -state stopped
To fetch the stopped and running instance for region us-west-1 and eu-west-1 use below:
./filter_ec2_by_region -state running -state stopped -region us-west-1 -region=eu-west-1
`
}
|