1
1
package main
2
2
3
3
import (
4
+ "encoding/json"
4
5
"errors"
5
6
"html/template"
7
+ "io/ioutil"
6
8
"log"
9
+ "net/http"
7
10
"os"
8
11
"os/exec"
9
12
"time"
@@ -18,6 +21,12 @@ type container struct {
18
21
Address string
19
22
}
20
23
24
+ type metadata struct {
25
+ Cluster string
26
+ ContainerInstanceArn string
27
+ Version string
28
+ }
29
+
21
30
var (
22
31
errClusterNotActive = errors .New ("ecs-nginx-proxy: cluster is not active" )
23
32
)
26
35
app = kingpin .New ("ecs-gen" , "docker-gen for AWS ECS." )
27
36
28
37
region = app .Flag ("region" , "AWS region." ).Short ('r' ).Default ("ap-northeast-1" ).String ()
29
- cluster = app .Flag ("cluster" , "ECS cluster name." ).Short ('c' ).Required (). String ()
38
+ cluster = app .Flag ("cluster" , "ECS cluster name." ).Short ('c' ).String ()
30
39
templateFile = app .Flag ("template" , "Path to template file." ).Short ('t' ).Required ().ExistingFile ()
31
40
outputFile = app .Flag ("output" , "Path to output file." ).Short ('o' ).Required ().String ()
32
41
taskName = app .Flag ("task" , "Name of ECS task containing nginx." ).Default ("ecs-nginx-proxy" ).String ()
@@ -43,6 +52,14 @@ func main() {
43
52
app .Version (version )
44
53
app .DefaultEnvars ()
45
54
kingpin .MustParse (app .Parse (os .Args [1 :]))
55
+ if * cluster == "" {
56
+ var err error
57
+ cluster , err = findClusterName ()
58
+ if * cluster == "" || err != nil {
59
+ panic ("could not determine cluster name. please define using --cluster / -c." )
60
+ }
61
+ log .Println ("found cluster name to be:" , * cluster )
62
+ }
46
63
sess , err := session .NewSession ()
47
64
if err != nil {
48
65
panic (err )
@@ -100,3 +117,43 @@ func writeConfig(params []*container) error {
100
117
defer f .Close ()
101
118
return tmpl .Execute (f , params )
102
119
}
120
+
121
+ func findClusterName () (* string , error ) {
122
+ ip , err := findHostIP ()
123
+ if err != nil {
124
+ return nil , err
125
+ }
126
+ meta , err := fetchMetadata (ip )
127
+ if err != nil {
128
+ return nil , err
129
+ }
130
+ return & meta .Cluster , nil
131
+ }
132
+
133
+ func findHostIP () (string , error ) {
134
+ result , err := sendHTTRequest ("http://169.254.169.254/latest/meta-data/local-ipv4" )
135
+ return string (result ), err
136
+ }
137
+
138
+ func fetchMetadata (host string ) (* metadata , error ) {
139
+ result , err := sendHTTRequest ("http://" + host + ":51678/v1/metadata" )
140
+ var meta metadata
141
+ err = json .Unmarshal (result , & meta )
142
+ if err != nil {
143
+ return nil , err
144
+ }
145
+ return & meta , nil
146
+ }
147
+
148
+ func sendHTTRequest (url string ) ([]byte , error ) {
149
+ resp , err := http .Get (url )
150
+ if err != nil {
151
+ return nil , err
152
+ }
153
+ defer resp .Body .Close ()
154
+ body , err := ioutil .ReadAll (resp .Body )
155
+ if err != nil {
156
+ return nil , err
157
+ }
158
+ return body , nil
159
+ }
0 commit comments