Skip to content

Commit 7d89c5d

Browse files
committed
feat: Add IMDS configuration support for AWS_METADATA_SERVICE_TIMEOUT
Add support for AWS_METADATA_SERVICE_TIMEOUT and AWS_METADATA_SERVICE_NUM_ATTEMPTS environment variables and config file settings to configure IMDS client behavior. - Add imdsConfig struct to ClientConfiguration.credentialProviderConfig - Support AWS_METADATA_SERVICE_TIMEOUT env var and metadata_service_timeout config - Support AWS_METADATA_SERVICE_NUM_ATTEMPTS env var and metadata_service_num_attempts config - Add InstanceProfileCredentialsProvider constructor accepting ClientConfiguration - Add EC2InstanceProfileConfigLoader constructor accepting CredentialProviderConfiguration - Update EC2MetadataClient to use configured timeout and retry values - Use StringUtils::ConvertToInt32 for parsing instead of std::stol Resolves customer request for configurable IMDS timeout settings.
1 parent cdb50ae commit 7d89c5d

File tree

5 files changed

+37
-43
lines changed

5 files changed

+37
-43
lines changed

src/aws-cpp-sdk-core/include/aws/core/client/ClientConfiguration.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,8 @@ namespace Aws
506506
* Timeout in seconds when retrieving data from IMDS. Default 1.
507507
*/
508508
long metadataServiceTimeout = 1;
509+
510+
509511
} imdsConfig;
510512
}credentialProviderConfig;
511513
};

src/aws-cpp-sdk-core/include/aws/core/config/EC2InstanceProfileConfigLoader.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#pragma once
77

88
#include <aws/core/config/AWSProfileConfigLoaderBase.h>
9-
#include <aws/core/client/ClientConfiguration.h>
109

1110
#include <aws/core/utils/memory/stl/AWSString.h>
1211
#include <aws/core/utils/memory/stl/AWSMap.h>
@@ -15,13 +14,16 @@
1514

1615
namespace Aws
1716
{
17+
namespace Client
18+
{
19+
struct ClientConfiguration;
20+
}
21+
1822
namespace Internal
1923
{
2024
class EC2MetadataClient;
2125
}
2226

23-
24-
2527
namespace Config
2628
{
2729
static const char* const INSTANCE_PROFILE_KEY = "InstanceProfile";
@@ -36,12 +38,7 @@ namespace Aws
3638
* If client is nullptr, the default EC2MetadataClient will be created.
3739
*/
3840
EC2InstanceProfileConfigLoader(const std::shared_ptr<Aws::Internal::EC2MetadataClient>& = nullptr);
39-
40-
/**
41-
* Creates EC2MetadataClient using the provided ClientConfiguration.
42-
*/
43-
EC2InstanceProfileConfigLoader(const Aws::Client::ClientConfiguration& clientConfig);
44-
41+
4542
/**
4643
* Creates EC2MetadataClient using the provided CredentialProviderConfiguration.
4744
*/

src/aws-cpp-sdk-core/source/client/ClientConfiguration.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -307,16 +307,14 @@ void setConfigFromEnvOrProfile(ClientConfiguration &config)
307307
{}, /* allowed values */
308308
"1" /* default value */);
309309

310-
// Parse and set IMDS num attempts
311-
long attempts = std::stol(numAttemptsStr.c_str());
312-
if (attempts >= 1) {
313-
config.credentialProviderConfig.imdsConfig.metadataServiceNumAttempts = attempts;
314-
}
315310
// Parse and set IMDS timeout
316-
long timeout = std::stol(timeoutStr.c_str());
317-
if (timeout >= 1) {
318-
config.credentialProviderConfig.imdsConfig.metadataServiceTimeout = timeout;
319-
}
311+
long timeout = static_cast<long>(Aws::Utils::StringUtils::ConvertToInt32(timeoutStr.c_str()));
312+
config.credentialProviderConfig.imdsConfig.metadataServiceTimeout = timeout;
313+
314+
// Parse and set IMDS num attempts
315+
long attempts = static_cast<long>(Aws::Utils::StringUtils::ConvertToInt32(numAttemptsStr.c_str()));
316+
config.credentialProviderConfig.imdsConfig.metadataServiceNumAttempts = attempts;
317+
320318
}
321319

322320
ClientConfiguration::ClientConfiguration()

src/aws-cpp-sdk-core/source/config/EC2InstanceProfileConfigLoader.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@ namespace Aws
3838
m_ec2metadataClient = client;
3939
}
4040
}
41-
42-
EC2InstanceProfileConfigLoader::EC2InstanceProfileConfigLoader(const Aws::Client::ClientConfiguration& clientConfig)
43-
: m_ec2metadataClient(Aws::MakeShared<Aws::Internal::EC2MetadataClient>(EC2_INSTANCE_PROFILE_LOG_TAG, clientConfig))
44-
{}
4541

4642
EC2InstanceProfileConfigLoader::EC2InstanceProfileConfigLoader(const Aws::Client::ClientConfiguration::CredentialProviderConfiguration& credentialConfig)
4743
: m_ec2metadataClient(Aws::MakeShared<Aws::Internal::EC2MetadataClient>(EC2_INSTANCE_PROFILE_LOG_TAG, credentialConfig))

src/aws-cpp-sdk-core/source/internal/AWSHttpResourceClient.cpp

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ namespace Aws
8282
AWSHttpResourceClient::AWSHttpResourceClient(const Aws::Client::ClientConfiguration& clientConfiguration, const char* logtag)
8383
: m_logtag(logtag),
8484
m_userAgent(Aws::Client::ComputeUserAgentString(&clientConfiguration)),
85+
// consider the retry strategy, move it to clientconfiguration
8586
m_retryStrategy(clientConfiguration.retryStrategy ? clientConfiguration.retryStrategy : clientConfiguration.configFactories.retryStrategyCreateFn()),
8687
m_httpClient(nullptr)
8788
{
@@ -90,7 +91,7 @@ namespace Aws
9091
<< clientConfiguration.maxConnections
9192
<< " and scheme "
9293
<< SchemeMapper::ToString(clientConfiguration.scheme));
93-
94+
// **need
9495
m_httpClient = CreateHttpClient(clientConfiguration);
9596
}
9697

@@ -197,6 +198,7 @@ namespace Aws
197198
const char *endpoint) :
198199
AWSHttpResourceClient(clientConfiguration, EC2_METADATA_CLIENT_LOG_TAG),
199200
m_endpoint(endpoint),
201+
// add disable imds to below
200202
m_disableIMDS(clientConfiguration.disableIMDS),
201203
m_tokenRequired(true),
202204
m_disableIMDSV1(clientConfiguration.disableImdsV1)
@@ -207,28 +209,27 @@ namespace Aws
207209
AWS_LOGSTREAM_TRACE(m_logtag.c_str(), "IMDSv1 had been disabled at the SDK build time");
208210
#endif
209211
}
210-
212+
211213
EC2MetadataClient::EC2MetadataClient(const Aws::Client::ClientConfiguration::CredentialProviderConfiguration& credentialConfig,
212-
const char *endpoint) :
213-
AWSHttpResourceClient([&credentialConfig]() {
214-
Aws::Client::ClientConfiguration clientConfig;
215-
clientConfig.credentialProviderConfig = credentialConfig;
216-
clientConfig.connectTimeoutMs = credentialConfig.imdsConfig.metadataServiceTimeout * 1000;
217-
clientConfig.requestTimeoutMs = credentialConfig.imdsConfig.metadataServiceTimeout * 1000;
218-
clientConfig.retryStrategy = Aws::MakeShared<DefaultRetryStrategy>(RESOURCE_CLIENT_CONFIGURATION_ALLOCATION_TAG, credentialConfig.imdsConfig.metadataServiceNumAttempts - 1, 1000);
219-
clientConfig.maxConnections = 2;
220-
clientConfig.scheme = Scheme::HTTP;
221-
return clientConfig;
222-
}(), EC2_METADATA_CLIENT_LOG_TAG),
223-
m_endpoint(endpoint),
224-
m_disableIMDS(false),
225-
m_tokenRequired(true),
226-
m_disableIMDSV1(false)
227-
{
214+
const char* endpoint)
215+
: AWSHttpResourceClient(
216+
[&credentialConfig]() -> ClientConfiguration{
217+
Aws::Client::ClientConfiguration clientConfig;
218+
clientConfig.credentialProviderConfig = credentialConfig;
219+
clientConfig.connectTimeoutMs = credentialConfig.imdsConfig.metadata_service_timeout * 1000;
220+
clientConfig.requestTimeoutMs = credentialConfig.imdsConfig.metadata_service_timeout * 1000;
221+
clientConfig.retryStrategy = Aws::MakeShared<DefaultRetryStrategy>(
222+
RESOURCE_CLIENT_CONFIGURATION_ALLOCATION_TAG, credentialConfig.imdsConfig.metadata_service_num_attempts - 1, 1000);
223+
return clientConfig;
224+
}(),
225+
EC2_METADATA_CLIENT_LOG_TAG),
226+
m_endpoint(endpoint),
227+
m_disableIMDS(false),
228+
m_tokenRequired(true),
229+
m_disableIMDSV1(false) {
228230
#if defined(DISABLE_IMDSV1)
229-
AWS_UNREFERENCED_PARAM(m_disableIMDSV1);
230-
m_disableIMDSV1 = true;
231-
AWS_LOGSTREAM_TRACE(m_logtag.c_str(), "IMDSv1 had been disabled at the SDK build time");
231+
m_disableIMDSV1 = true;
232+
AWS_LOGSTREAM_TRACE(m_logtag.c_str(), "IMDSv1 had been disabled at the SDK build time");
232233
#endif
233234
}
234235

0 commit comments

Comments
 (0)