@@ -15,17 +15,63 @@ import (
15
15
"github.com/aws/aws-sdk-go/service/ec2"
16
16
)
17
17
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 )
20
33
if err != nil {
21
34
return "" , err
22
35
}
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 )
25
46
if err != nil {
26
47
return "" , err
27
48
}
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
29
75
}
30
76
31
77
func main () {
@@ -48,23 +94,28 @@ func main() {
48
94
49
95
flag .Parse ()
50
96
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 ( )
53
99
if err != nil {
54
- fmt .Printf ("%s" , err )
100
+ fmt .Printf ("Failed to get IMDSv2 token: %s" , err )
55
101
os .Exit (1 )
56
102
}
57
- sz := len (resp )
58
- region = resp [:sz - 1 ]
59
- }
60
103
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
+ }
66
118
}
67
- instanceID = resp
68
119
}
69
120
70
121
var creds * credentials.Credentials
0 commit comments