Skip to content

Commit 1380ea2

Browse files
authored
Merge pull request #1 from flant/add-support-fot-imdsv2
use imdsv2 for getting region/instanceId
2 parents 088cdae + 72a47c4 commit 1380ea2

File tree

1 file changed

+68
-17
lines changed

1 file changed

+68
-17
lines changed

ec2_describe_tags.go

+68-17
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,63 @@ import (
1515
"github.com/aws/aws-sdk-go/service/ec2"
1616
)
1717

18-
func get(url string) (string, error) {
19-
response, err := http.Get(url)
18+
const (
19+
awsTokenTTLHeader = "X-aws-ec2-metadata-token-ttl-seconds"
20+
awsTokenHeader = "X-aws-ec2-metadata-token"
21+
awsIMDSURL = "http://169.254.169.254"
22+
awsIMDSv2TokenPath = "latest/api/token"
23+
awsIMDSRegionPath = "latest/meta-data/placement/region"
24+
awsIMDSInstanceIDPath = "latest/meta-data/instance-id"
25+
awsIMDSv2TokenTTL = "30"
26+
)
27+
28+
//get imsdv2 token
29+
func getToken() (string, error) {
30+
client := http.Client{}
31+
32+
req, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/%s", awsIMDSURL, awsIMDSv2TokenPath), nil)
2033
if err != nil {
2134
return "", err
2235
}
23-
defer response.Body.Close()
24-
contents, err := ioutil.ReadAll(response.Body)
36+
37+
req.Header.Set(awsTokenTTLHeader, awsIMDSv2TokenTTL)
38+
39+
resp, err := client.Do(req)
40+
if err != nil {
41+
return "", err
42+
}
43+
defer resp.Body.Close()
44+
45+
token, err := ioutil.ReadAll(resp.Body)
2546
if err != nil {
2647
return "", err
2748
}
28-
return string(contents), nil
49+
50+
return string(token), nil
51+
}
52+
53+
func getMetadata(token, path string) (string, error) {
54+
client := http.Client{}
55+
56+
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/%s", awsIMDSURL, path), nil)
57+
if err != nil {
58+
return "", err
59+
}
60+
61+
req.Header.Set(awsTokenHeader, token)
62+
63+
resp, err := client.Do(req)
64+
if err != nil {
65+
return "", err
66+
}
67+
defer resp.Body.Close()
68+
69+
data, err := ioutil.ReadAll(resp.Body)
70+
if err != nil {
71+
return "", err
72+
}
73+
74+
return string(data), nil
2975
}
3076

3177
func main() {
@@ -48,23 +94,28 @@ func main() {
4894

4995
flag.Parse()
5096

51-
if queryMetadata && region == "" {
52-
resp, err := get("http://169.254.169.254/latest/meta-data/placement/availability-zone")
97+
if queryMetadata {
98+
token, err := getToken()
5399
if err != nil {
54-
fmt.Printf("%s", err)
100+
fmt.Printf("Failed to get IMDSv2 token: %s", err)
55101
os.Exit(1)
56102
}
57-
sz := len(resp)
58-
region = resp[:sz-1]
59-
}
60103

61-
if queryMetadata && instanceID == "" {
62-
resp, err := get("http://169.254.169.254/latest/meta-data/instance-id")
63-
if err != nil {
64-
fmt.Printf("%s", err)
65-
os.Exit(1)
104+
if region == "" {
105+
region, err = getMetadata(token, awsIMDSRegionPath)
106+
if err != nil {
107+
fmt.Printf("%s", err)
108+
os.Exit(1)
109+
}
110+
}
111+
112+
if instanceID == "" {
113+
instanceID, err = getMetadata(token, awsIMDSInstanceIDPath)
114+
if err != nil {
115+
fmt.Printf("%s", err)
116+
os.Exit(1)
117+
}
66118
}
67-
instanceID = resp
68119
}
69120

70121
var creds *credentials.Credentials

0 commit comments

Comments
 (0)