-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathmain.go
116 lines (95 loc) · 3.35 KB
/
main.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/ecs"
"github.com/hamstah/awstools/common"
kingpin "github.com/alecthomas/kingpin/v2"
)
var (
containerName = kingpin.Flag("container-name", "ECS container name").Required().String()
containerPort = kingpin.Flag("container-port", "ECS container port").Required().Int64()
cluster = kingpin.Flag("cluster", "ECS cluster").Required().String()
service = kingpin.Flag("service", "ECS service").Required().String()
)
func main() {
kingpin.CommandLine.Name = "ecs-locate"
kingpin.CommandLine.Help = "Find an instance/port for a service"
flags := common.HandleFlags()
session, conf := common.OpenSession(flags)
ecsClient := ecs.New(session, conf)
tasksResult, err := ecsClient.ListTasks(&ecs.ListTasksInput{
Cluster: cluster,
DesiredStatus: aws.String("RUNNING"),
ServiceName: service,
})
common.FatalOnError(err)
describeTasks, err := ecsClient.DescribeTasks(&ecs.DescribeTasksInput{
Cluster: cluster,
Tasks: tasksResult.TaskArns,
})
common.FatalOnError(err)
containerInstances := map[string]bool{}
bindings := map[string]int64{}
for _, task := range describeTasks.Tasks {
found := false
for _, container := range task.Containers {
if *container.Name != *containerName {
continue
}
for _, binding := range container.NetworkBindings {
if *binding.ContainerPort != *containerPort {
continue
}
bindings[*task.ContainerInstanceArn] = *binding.HostPort
containerInstances[*task.ContainerInstanceArn] = true
found = true
}
}
if !found {
common.Fatalln(fmt.Sprintf("Could not find container in task %s", *task.TaskArn))
}
}
containerInstancesArns := make([]*string, 0, len(containerInstances))
for key := range containerInstances {
containerInstancesArns = append(containerInstancesArns, aws.String(key))
}
containerInstancesResult, err := ecsClient.DescribeContainerInstances(&ecs.DescribeContainerInstancesInput{
Cluster: cluster,
ContainerInstances: containerInstancesArns,
})
common.FatalOnError(err)
containerInstanceToEC2 := map[string]string{}
ec2InstanceIDs := make([]*string, 0, len(containerInstancesResult.ContainerInstances))
for _, containerInstance := range containerInstancesResult.ContainerInstances {
ec2InstanceIDs = append(ec2InstanceIDs, containerInstance.Ec2InstanceId)
containerInstanceToEC2[*containerInstance.ContainerInstanceArn] = *containerInstance.Ec2InstanceId
}
ec2Client := ec2.New(session, conf)
ec2Result, err := ec2Client.DescribeInstances(&ec2.DescribeInstancesInput{
InstanceIds: ec2InstanceIDs,
})
common.FatalOnError(err)
ec2ToIPs := map[string]string{}
for _, reservation := range ec2Result.Reservations {
for _, ec2Instance := range reservation.Instances {
if ec2Instance.PublicIpAddress != nil {
ec2ToIPs[*ec2Instance.InstanceId] = *ec2Instance.PublicIpAddress
} else {
ec2ToIPs[*ec2Instance.InstanceId] = *ec2Instance.PrivateIpAddress
}
}
}
for containerInstanceId, port := range bindings {
ec2ID, ok := containerInstanceToEC2[containerInstanceId]
if !ok {
common.Fatalln("Could not resolve the container instance to EC2")
}
ip, ok := ec2ToIPs[ec2ID]
if !ok {
common.Fatalln("Could not get an IP address for EC2")
}
fmt.Printf("%s:%d\n", ip, port)
}
}