Skip to content

Commit 35cec84

Browse files
authored
Merge pull request #2342 from AndrewSirenko/imds-fix
Skip IMDS call if AWS_EC2_METADATA_DISABLED=true
2 parents e7abba5 + 3b328ba commit 35cec84

File tree

2 files changed

+37
-19
lines changed

2 files changed

+37
-19
lines changed

pkg/cloud/metadata/metadata.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,26 @@ type MetadataServiceConfig struct {
4242

4343
var _ MetadataService = &Metadata{}
4444

45+
// NewMetadataService retrieves instance Metadata from one of the client in MetadataServiceConfig.
46+
// It prefers EC2MetadataClient (IMDS) in order to get an accurate number of attached devices.
4547
func NewMetadataService(cfg MetadataServiceConfig, region string) (MetadataService, error) {
46-
metadata, err := retrieveEC2Metadata(cfg.EC2MetadataClient, region)
47-
if err == nil {
48-
klog.InfoS("Retrieved metadata from IMDS")
49-
return metadata.overrideRegion(region), nil
48+
// Don't make an IMDS call if we know it's disabled
49+
if os.Getenv("AWS_EC2_METADATA_DISABLED") == "true" {
50+
klog.V(2).InfoS("Environment variable AWS_EC2_METADATA_DISABLED set to 'true'. Will not rely on IMDS for instance metadata")
51+
} else {
52+
klog.V(2).InfoS("Attempting to retrieve instance metadata from IMDS")
53+
metadata, err := retrieveEC2Metadata(cfg.EC2MetadataClient, region)
54+
if err == nil {
55+
klog.V(2).InfoS("Retrieved metadata from IMDS")
56+
return metadata.overrideRegion(region), nil
57+
}
58+
klog.ErrorS(err, "Retrieving IMDS metadata failed, falling back to Kubernetes metadata")
5059
}
51-
klog.ErrorS(err, "Retrieving IMDS metadata failed, falling back to Kubernetes metadata")
5260

53-
metadata, err = retrieveK8sMetadata(cfg.K8sAPIClient)
61+
klog.V(2).InfoS("Attempting to retrieve instance metadata from Kubernetes API")
62+
metadata, err := retrieveK8sMetadata(cfg.K8sAPIClient)
5463
if err == nil {
55-
klog.InfoS("Retrieved metadata from Kubernetes")
64+
klog.V(2).InfoS("Retrieved metadata from Kubernetes")
5665
return metadata.overrideRegion(region), nil
5766
}
5867
klog.ErrorS(err, "Retrieving Kubernetes metadata failed")
@@ -61,11 +70,6 @@ func NewMetadataService(cfg MetadataServiceConfig, region string) (MetadataServi
6170
}
6271

6372
func retrieveEC2Metadata(ec2MetadataClient EC2MetadataClient, region string) (*Metadata, error) {
64-
envValue := os.Getenv("AWS_EC2_METADATA_DISABLED")
65-
if envValue != "" {
66-
klog.InfoS("The AWS_EC2_METADATA_DISABLED environment variable disables access to EC2 IMDS", "enabled", envValue)
67-
}
68-
6973
svc, err := ec2MetadataClient()
7074
if err != nil {
7175
klog.ErrorS(err, "failed to initialize EC2 Metadata client")

pkg/cloud/metadata/metadata_test.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,14 @@ func TestNewMetadataService(t *testing.T) {
3939

4040
testCases := []struct {
4141
name string
42-
region string
42+
imdsDisabled bool
4343
ec2MetadataError error
4444
k8sAPIError error
4545
expectedMetadata *Metadata
4646
expectedError error
4747
}{
4848
{
49-
name: "TestNewMetadataService: EC2 metadata available",
50-
region: "us-west-2",
49+
name: "TestNewMetadataService: EC2 metadata available",
5150
expectedMetadata: &Metadata{
5251
InstanceID: "i-1234567890abcdef0",
5352
InstanceType: "c5.xlarge",
@@ -57,9 +56,20 @@ func TestNewMetadataService(t *testing.T) {
5756
NumBlockDeviceMappings: 2,
5857
},
5958
},
59+
{
60+
name: "TestNewMetadataService: AWS_EC2_METADATA_DISABLED=true, K8s API available",
61+
imdsDisabled: true,
62+
expectedMetadata: &Metadata{
63+
InstanceID: "i-1234567890abcdef0",
64+
InstanceType: "c5.xlarge",
65+
Region: "us-west-2",
66+
AvailabilityZone: "us-west-2a",
67+
NumAttachedENIs: 1,
68+
NumBlockDeviceMappings: 0,
69+
},
70+
},
6071
{
6172
name: "TestNewMetadataService: EC2 metadata error, K8s API available",
62-
region: "us-west-2",
6373
ec2MetadataError: errors.New("EC2 metadata error"),
6474
expectedMetadata: &Metadata{
6575
InstanceID: "i-1234567890abcdef0",
@@ -72,7 +82,6 @@ func TestNewMetadataService(t *testing.T) {
7282
},
7383
{
7484
name: "TestNewMetadataService: EC2 metadata error, K8s API error",
75-
region: "us-west-2",
7685
ec2MetadataError: errors.New("EC2 metadata error"),
7786
k8sAPIError: errors.New("K8s API error"),
7887
expectedError: errors.New("IMDS metadata and Kubernetes metadata are both unavailable"),
@@ -103,8 +112,13 @@ func TestNewMetadataService(t *testing.T) {
103112
}
104113

105114
t.Setenv("CSI_NODE_NAME", "test-node")
115+
if tc.imdsDisabled {
116+
t.Setenv("AWS_EC2_METADATA_DISABLED", "true")
117+
} else {
118+
t.Setenv("AWS_EC2_METADATA_DISABLED", "false")
119+
}
106120

107-
if tc.ec2MetadataError == nil {
121+
if tc.ec2MetadataError == nil && !tc.imdsDisabled {
108122
mockEC2Metadata.EXPECT().GetInstanceIdentityDocument(gomock.Any(), &imds.GetInstanceIdentityDocumentInput{}).Return(&imds.GetInstanceIdentityDocumentOutput{
109123
InstanceIdentityDocument: imds.InstanceIdentityDocument{
110124
InstanceID: "i-1234567890abcdef0",
@@ -132,7 +146,7 @@ func TestNewMetadataService(t *testing.T) {
132146
K8sAPIClient: mockK8sClient,
133147
}
134148

135-
metadata, err := NewMetadataService(cfg, tc.region)
149+
metadata, err := NewMetadataService(cfg, "us-west-2")
136150

137151
if tc.expectedError != nil {
138152
require.EqualError(t, err, tc.expectedError.Error())

0 commit comments

Comments
 (0)