Skip to content

Commit f708af3

Browse files
committed
add automatic cluster name detection
1 parent 4eebc9d commit f708af3

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ deps:
2828

2929
zip:
3030
for file in build/*; do \
31-
zip -r "$${file}.zip" "$$file"; \
31+
zip -j -r "$${file}.zip" "$$file"; \
3232
done

main.go

+58-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package main
22

33
import (
4+
"encoding/json"
45
"errors"
56
"html/template"
7+
"io/ioutil"
68
"log"
9+
"net/http"
710
"os"
811
"os/exec"
912
"time"
@@ -18,6 +21,12 @@ type container struct {
1821
Address string
1922
}
2023

24+
type metadata struct {
25+
Cluster string
26+
ContainerInstanceArn string
27+
Version string
28+
}
29+
2130
var (
2231
errClusterNotActive = errors.New("ecs-nginx-proxy: cluster is not active")
2332
)
@@ -26,7 +35,7 @@ var (
2635
app = kingpin.New("ecs-gen", "docker-gen for AWS ECS.")
2736

2837
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()
3039
templateFile = app.Flag("template", "Path to template file.").Short('t').Required().ExistingFile()
3140
outputFile = app.Flag("output", "Path to output file.").Short('o').Required().String()
3241
taskName = app.Flag("task", "Name of ECS task containing nginx.").Default("ecs-nginx-proxy").String()
@@ -43,6 +52,14 @@ func main() {
4352
app.Version(version)
4453
app.DefaultEnvars()
4554
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+
}
4663
sess, err := session.NewSession()
4764
if err != nil {
4865
panic(err)
@@ -100,3 +117,43 @@ func writeConfig(params []*container) error {
100117
defer f.Close()
101118
return tmpl.Execute(f, params)
102119
}
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

Comments
 (0)