/
aw2.go
92 lines (80 loc) · 2.54 KB
/
aw2.go
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
package main
import (
"fmt"
"os"
"regexp"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/olekukonko/tablewriter"
)
func main() {
sess := session.Must(session.NewSession())
svc := ec2.New(sess)
filters := []*ec2.Filter{}
if len(os.Args) > 1 {
filterText := os.Args[1]
filterKey := "tag:Name"
useIpFilter, _ := regexp.MatchString(`^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){1,4})`, filterText)
if useIpFilter {
filterKey = "private-ip-address"
}
filter := &ec2.Filter{
Name: aws.String(filterKey),
Values: []*string{
aws.String("*" + filterText + "*"),
},
}
filters = append(filters, filter)
}
var resp *ec2.DescribeInstancesOutput
var err error
if len(filters) > 0 {
resp, err = svc.DescribeInstances(&ec2.DescribeInstancesInput{
Filters: filters,
})
} else {
resp, err = svc.DescribeInstances(nil)
}
if err != nil {
fmt.Println("Error", err)
return
}
instances := []*InstanceDetails{}
for _, reservation := range resp.Reservations {
for _, instance := range reservation.Instances {
instanceDetails := &InstanceDetails{
PublicIP: aws.StringValue(instance.PublicIpAddress),
PrivateIP: aws.StringValue(instance.PrivateIpAddress),
Name: getNameTagValue(instance.Tags),
Type: aws.StringValue(instance.InstanceType),
Status: aws.StringValue(instance.State.Name),
VpcId: aws.StringValue(instance.VpcId),
}
instances = append(instances, instanceDetails)
}
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Public IP", "Private IP", "Name", "Type", "Status", "VpcId"})
for _, instance := range instances {
row := []string{instance.PublicIP, instance.PrivateIP, instance.Name, instance.Type, instance.Status, instance.VpcId}
table.Append(row)
}
table.Render()
}
type InstanceDetails struct {
PublicIP string
PrivateIP string
Name string
Type string
Status string
VpcId string
}
func getNameTagValue(tags []*ec2.Tag) string {
for _, tag := range tags {
if aws.StringValue(tag.Key) == "Name" {
return aws.StringValue(tag.Value)
}
}
return ""
}