forked from hairyhenderson/gomplate
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ec2meta.go
96 lines (83 loc) · 2.01 KB
/
ec2meta.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
package aws
import (
"encoding/json"
"io/ioutil"
"log"
"net/http"
"strings"
"time"
)
// DefaultEndpoint -
const DefaultEndpoint = "http://169.254.169.254"
// Ec2Meta -
type Ec2Meta struct {
Endpoint string
Client *http.Client
}
// returnDefault -
func returnDefault(def []string) string {
if len(def) > 0 {
return def[0]
}
return ""
}
func (e *Ec2Meta) retrieveMetadata(url string, key string, def ...string) string {
if e.Client == nil {
e.Client = &http.Client{
Timeout: 5 * time.Second,
}
}
resp, err := e.Client.Get(url)
if err != nil {
return returnDefault(def)
}
defer resp.Body.Close()
if resp.StatusCode > 399 {
return returnDefault(def)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("Failed to read response body from %s: %v", url, err)
}
value := strings.TrimSpace(string(body))
return value
}
// Meta -
func (e *Ec2Meta) Meta(key string, def ...string) string {
if e.Endpoint == "" {
e.Endpoint = DefaultEndpoint
}
url := e.Endpoint + "/latest/meta-data/" + key
return e.retrieveMetadata(url, key, def...)
}
// Dynamic -
func (e *Ec2Meta) Dynamic(key string, def ...string) string {
if e.Endpoint == "" {
e.Endpoint = DefaultEndpoint
}
url := e.Endpoint + "/latest/dynamic/" + key
return e.retrieveMetadata(url, key, def...)
}
// Region -
func (e *Ec2Meta) Region() string {
doc := e.Dynamic("instance-identity/document", `{"region":"unknown"}`)
obj := &InstanceDocument{
Region: "unknown",
}
err := json.Unmarshal([]byte(doc), &obj)
if err != nil {
log.Fatalf("Unable to unmarshal JSON object %s: %v", doc, err)
}
return obj.Region
}
// InstanceDocument -
type InstanceDocument struct {
PrivateIP string `json:"privateIp"`
AvailabilityZone string `json:"availabilityZone"`
InstanceID string `json:"InstanceId"`
InstanceType string `json:"InstanceType"`
AccountID string `json:"AccountId"`
ImageID string `json:"imageId"`
Architecture string `json:"architecture"`
Region string `json:"region"`
}