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(&regionArgs, "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  }