diff --git a/example/service/ec2/instancesbyRegion/README.md b/example/service/ec2/instancesbyRegion/README.md new file mode 100644 index 00000000000..8125a4d5b85 --- /dev/null +++ b/example/service/ec2/instancesbyRegion/README.md @@ -0,0 +1,32 @@ + +# Example Fetch By region + +This is an example using the AWS SDK for Go to list ec2 instances instance state By different region . By default it fetch all running and stopped instance + + +# Usage + + +```sh +# 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 +``` + +## Sample Output + +``` +Fetching instace details for region: ap-south-1 with criteria: [running][stopped]** + printing instance details..... +instance id i-************ +current State stopped +done for region ap-south-1 **** + + + +Fetching instace details for region: eu-west-2 with criteria: [running][stopped]** + There is no instance for the for region eu-west-2 with the matching Criteria: [running][stopped] +done for region eu-west-2 **** +``` diff --git a/example/service/ec2/instancesbyRegion/instancesByRegion.go b/example/service/ec2/instancesbyRegion/instancesByRegion.go new file mode 100644 index 00000000000..869b28ab64c --- /dev/null +++ b/example/service/ec2/instancesbyRegion/instancesByRegion.go @@ -0,0 +1,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 [-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{ + &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 instace details for region: %s with criteria: %s**\n ", region, instanceCriteria) + if len(result.Reservations) == 0 { + fmt.Printf("There is no instance for the for 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 +` +}