-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
116 lines (86 loc) · 2.78 KB
/
main.go
File metadata and controls
116 lines (86 loc) · 2.78 KB
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 (
"context"
"log"
"os"
"time"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ec2"
"github.com/aws/aws-sdk-go-v2/service/ecs"
)
var (
buildVersion = "development"
buildSha = "devel"
)
const (
maxWaitTimeRunning = 10 * time.Minute
)
var globalOptions RemoteShellOptions
func init() {
globalOptions = parseCommandFlags()
}
func main() {
defer func() {
exitCode := 0
if r := recover(); r != nil {
exitCode = 1
log.Println("FATAL ERROR! ", r)
}
os.Exit(exitCode)
}()
log.Println("Starting Cloud87 Remote Shell Client")
log.Printf("Version: %s@%s\n", buildVersion, buildSha)
log.Println("Application:", globalOptions.applicationName)
awsCfg := loadAwsConfig(globalOptions)
ecsClient := ecs.NewFromConfig(awsCfg)
taskDefResult, err := ecsClient.DescribeTaskDefinition(context.TODO(), &ecs.DescribeTaskDefinitionInput{
TaskDefinition: aws.String(globalOptions.applicationName),
})
if err != nil {
// log.Fatalln(err.Error())
panic(err)
}
taskDef := taskDefResult.TaskDefinition
log.Println("Task Definition:", aws.ToString(taskDef.TaskDefinitionArn))
containerDetails := extractContainerDetails(taskDef)
log.Println("Using Port:", containerDetails.port)
if globalOptions.interactive {
if conf := askForConfirmation("Are you sure you want to launch a remote shell?"); !conf {
log.Println("Alrighty then")
os.Exit(0)
}
}
// Launch the task
taskArn := runTask(ecsClient, aws.ToString(taskDef.TaskDefinitionArn), containerDetails, globalOptions)
// should anything bad happen, kill it
defer terminateTask(ecsClient, taskArn, containerDetails)
log.Println("Task ARN:", taskArn)
log.Println("Waiting for task to successfully launch...")
waiter := ecs.NewTasksRunningWaiter(ecsClient)
var taskArns []string
taskArns = append(taskArns, taskArn)
params := &ecs.DescribeTasksInput{
Cluster: aws.String(containerDetails.config.Cluster),
Tasks: taskArns,
}
err = waiter.Wait(context.TODO(), params, maxWaitTimeRunning, func(trwo *ecs.TasksRunningWaiterOptions) {
trwo.MaxDelay = 15 * time.Second
})
if err != nil {
log.Println(err)
}
taskInfoResult, err := ecsClient.DescribeTasks(context.TODO(), params)
check(err)
taskInfo := taskInfoResult.Tasks[0]
// check to make sure the task is viable to connect to
ensureHealthyTask(taskInfo, containerDetails)
var containerAddress string
if containerDetails.config.AssignPublicIp {
ec2Client := ec2.NewFromConfig(awsCfg)
containerAddress = extractContainerPublicAddress(ec2Client, taskInfo, containerDetails)
} else {
containerAddress = extractContainerPrivateAddress(taskInfo, containerDetails)
}
log.Println("Container IP:", containerAddress, containerDetails.port)
launchSSHSession(globalOptions, containerAddress, containerDetails.port)
}