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