Skip to content

Commit 62ce188

Browse files
committed
new configuration support for IMDSConfig
Add ClientConfiguration support for IMDS settings and update related classes Fix: Shared pointer bug in AWSCredentialsProvider allocator mismatch bug fix, change type using c_str() new configuration support for IMDSConfig Add ClientConfiguration support for IMDS settings and update related classes Fix: Shared pointer bug in AWSCredentialsProvider allocator mismatch bug fix, change type using c_str() Fix shared pointer bug and update IMDS config structure - Fix std::stol compilation error with Aws::String by using .c_str() - Update IMDS configuration to use credentialProviderConfig.imdsConfig structure - Add proper environment variable support for AWS_METADATA_SERVICE_TIMEOUT and AWS_METADATA_SERVICE_NUM_ATTEMPTS Update IMDS configuration and credentials provider fix: Remove duplicate IMDS config struct and fix comment syntax feat: Add IMDS configuration support to credential provider chain - Add CredentialProviderConfiguration struct with IMDS timeout and retry settings - Add constructor to DefaultAWSCredentialsProviderChain accepting CredentialProviderConfiguration - Add constructor to InstanceProfileCredentialsProvider accepting CredentialProviderConfiguration - Add constructor to EC2InstanceProfileConfigLoader accepting CredentialProviderConfiguration - Add constructor to EC2MetadataClient accepting CredentialProviderConfiguration with IMDS timeout/retry configuration - Enable IMDS configuration to flow through: CredentialProviderConfiguration → InstanceProfileCredentialsProvider → EC2InstanceProfileConfigLoader → EC2MetadataClient - Reduce object creation redundancy by passing configuration directly through the chain fix disableImdsvV1 member added new include 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. fixed snake case removed m_disableIMDSV1 and comment recreated retry strategy during client configuration updated forward declaration fixed nip
1 parent 382e223 commit 62ce188

File tree

9 files changed

+99
-4
lines changed

9 files changed

+99
-4
lines changed

src/aws-cpp-sdk-core/include/aws/core/auth/AWSCredentialsProvider.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222

2323
namespace Aws
2424
{
25+
namespace Client
26+
{
27+
struct ClientConfiguration;
28+
}
2529
namespace Auth
2630
{
2731
constexpr int REFRESH_THRESHOLD = 1000 * 60 * 5;
@@ -212,6 +216,11 @@ namespace Aws
212216
*/
213217
InstanceProfileCredentialsProvider(const std::shared_ptr<Aws::Config::EC2InstanceProfileConfigLoader>&, long refreshRateMs = REFRESH_THRESHOLD);
214218

219+
/**
220+
* Initializes the provider using ClientConfiguration for IMDS settings.
221+
*/
222+
InstanceProfileCredentialsProvider(const Aws::Client::ClientConfiguration::CredentialProviderConfiguration& credentialProviderConfig, long refreshRateMs = REFRESH_THRESHOLD);
223+
215224
/**
216225
* Retrieves the credentials if found, otherwise returns empty credential set.
217226
*/

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,21 @@ namespace Aws
492492
* AWS profile name to use for credentials.
493493
*/
494494
Aws::String profile;
495+
496+
/**
497+
* IMDS configuration settings
498+
*/
499+
struct {
500+
/**
501+
* Number of total attempts to make when retrieving data from IMDS. Default 1.
502+
*/
503+
long metadataServiceNumAttempts = 1;
504+
505+
/**
506+
* Timeout in seconds when retrieving data from IMDS. Default 1.
507+
*/
508+
long metadataServiceTimeout = 1;
509+
} imdsConfig;
495510
}credentialProviderConfig;
496511
};
497512

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

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

88
#include <aws/core/config/AWSProfileConfigLoaderBase.h>
9-
9+
#include <aws/core/client/ClientConfiguration.h>
1010
#include <aws/core/utils/memory/stl/AWSString.h>
1111
#include <aws/core/utils/memory/stl/AWSMap.h>
1212
#include <aws/core/utils/DateTime.h>
@@ -34,6 +34,11 @@ namespace Aws
3434
*/
3535
EC2InstanceProfileConfigLoader(const std::shared_ptr<Aws::Internal::EC2MetadataClient>& = nullptr);
3636

37+
/**
38+
* Creates EC2MetadataClient using the provided CredentialProviderConfiguration.
39+
*/
40+
EC2InstanceProfileConfigLoader(const Aws::Client::ClientConfiguration::CredentialProviderConfiguration& credentialConfig);
41+
3742
virtual ~EC2InstanceProfileConfigLoader() = default;
3843

3944
protected:

src/aws-cpp-sdk-core/include/aws/core/internal/AWSHttpResourceClient.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ namespace Aws
103103
*/
104104
EC2MetadataClient(const char* endpoint = "http://169.254.169.254");
105105
EC2MetadataClient(const Client::ClientConfiguration& clientConfiguration, const char* endpoint = "http://169.254.169.254");
106+
EC2MetadataClient(const Client::ClientConfiguration::CredentialProviderConfiguration& credentialConfig, const char* endpoint = "http://169.254.169.254");
106107

107108
EC2MetadataClient& operator =(const EC2MetadataClient& rhs) = delete;
108109
EC2MetadataClient(const EC2MetadataClient& rhs) = delete;

src/aws-cpp-sdk-core/source/auth/AWSCredentialsProvider.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <aws/core/auth/AWSCredentialsProvider.h>
88

99
#include <aws/core/config/AWSProfileConfigLoader.h>
10+
#include <aws/core/client/ClientConfiguration.h>
1011
#include <aws/core/platform/Environment.h>
1112
#include <aws/core/platform/FileSystem.h>
1213
#include <aws/core/platform/OSVersionInfo.h>
@@ -242,6 +243,12 @@ InstanceProfileCredentialsProvider::InstanceProfileCredentialsProvider(const std
242243
AWS_LOGSTREAM_INFO(INSTANCE_LOG_TAG, "Creating Instance with injected EC2MetadataClient and refresh rate " << refreshRateMs);
243244
}
244245

246+
InstanceProfileCredentialsProvider::InstanceProfileCredentialsProvider(const Aws::Client::ClientConfiguration::CredentialProviderConfiguration& credentialConfig, long refreshRateMs) :
247+
m_ec2MetadataConfigLoader(Aws::MakeShared<Aws::Config::EC2InstanceProfileConfigLoader>(INSTANCE_LOG_TAG, credentialConfig)),
248+
m_loadFrequencyMs(refreshRateMs)
249+
{
250+
AWS_LOGSTREAM_INFO(INSTANCE_LOG_TAG, "Creating Instance with IMDS timeout: " << credentialConfig.imdsConfig.metadataServiceTimeout << "s, attempts: " << credentialConfig.imdsConfig.metadataServiceNumAttempts);
251+
}
245252

246253
AWSCredentials InstanceProfileCredentialsProvider::GetAWSCredentials()
247254
{

src/aws-cpp-sdk-core/source/auth/AWSCredentialsProviderChain.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <aws/core/auth/AWSCredentialsProviderChain.h>
77
#include <aws/core/auth/STSCredentialsProvider.h>
88
#include <aws/core/auth/SSOCredentialsProvider.h>
9+
#include <aws/core/client/ClientConfiguration.h>
910
#include <aws/core/platform/Environment.h>
1011
#include <aws/core/utils/memory/AWSMemory.h>
1112
#include <aws/core/utils/StringUtils.h>
@@ -125,7 +126,7 @@ DefaultAWSCredentialsProviderChain::DefaultAWSCredentialsProviderChain(const Aws
125126
}
126127
else if (Aws::Utils::StringUtils::ToLower(ec2MetadataDisabled.c_str()) != "true")
127128
{
128-
AddProvider(Aws::MakeShared<InstanceProfileCredentialsProvider>(DefaultCredentialsProviderChainTag));
129+
AddProvider(Aws::MakeShared<InstanceProfileCredentialsProvider>(DefaultCredentialsProviderChainTag, config));
129130
AWS_LOGSTREAM_INFO(DefaultCredentialsProviderChainTag, "Added EC2 metadata service credentials provider to the provider chain.");
130131
}
131132
}

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ static const char* DISABLE_IMDSV1_CONFIG_VAR = "AWS_EC2_METADATA_V1_DISABLED";
4141
static const char* DISABLE_IMDSV1_ENV_VAR = "ec2_metadata_v1_disabled";
4242
static const char* AWS_ACCOUNT_ID_ENDPOINT_MODE_ENVIRONMENT_VARIABLE = "AWS_ACCOUNT_ID_ENDPOINT_MODE";
4343
static const char* AWS_ACCOUNT_ID_ENDPOINT_MODE_CONFIG_FILE_OPTION = "account_id_endpoint_mode";
44+
static const char* AWS_METADATA_SERVICE_TIMEOUT_ENV_VAR = "AWS_METADATA_SERVICE_TIMEOUT";
45+
static const char* AWS_METADATA_SERVICE_TIMEOUT_CONFIG_VAR = "metadata_service_timeout";
46+
static const char* AWS_METADATA_SERVICE_NUM_ATTEMPTS_ENV_VAR = "AWS_METADATA_SERVICE_NUM_ATTEMPTS";
47+
static const char* AWS_METADATA_SERVICE_NUM_ATTEMPTS_CONFIG_VAR = "metadata_service_num_attempts";
4448

4549
using RequestChecksumConfigurationEnumMapping = std::pair<const char*, RequestChecksumCalculation>;
4650
static const std::array<RequestChecksumConfigurationEnumMapping, 2> REQUEST_CHECKSUM_CONFIG_MAPPING = {{
@@ -288,6 +292,33 @@ void setConfigFromEnvOrProfile(ClientConfiguration &config)
288292
AWS_ACCOUNT_ID_ENDPOINT_MODE_CONFIG_FILE_OPTION,
289293
{"required", "disabled", "preferred"}, /* allowed values */
290294
"preferred" /* default value */);
295+
296+
// Load IMDS configuration from environment variables and config file
297+
Aws::String timeoutStr = ClientConfiguration::LoadConfigFromEnvOrProfile(AWS_METADATA_SERVICE_TIMEOUT_ENV_VAR,
298+
config.profileName,
299+
AWS_METADATA_SERVICE_TIMEOUT_CONFIG_VAR,
300+
{}, /* allowed values */
301+
"1" /* default value */);
302+
303+
// Load IMDS configuration from environment variables and config file
304+
Aws::String numAttemptsStr = ClientConfiguration::LoadConfigFromEnvOrProfile(AWS_METADATA_SERVICE_NUM_ATTEMPTS_ENV_VAR,
305+
config.profileName,
306+
AWS_METADATA_SERVICE_NUM_ATTEMPTS_CONFIG_VAR,
307+
{}, /* allowed values */
308+
"1" /* default value */);
309+
310+
// Parse and set IMDS timeout
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+
318+
// Ensure retry strategy is set using factory pattern
319+
if (!config.retryStrategy) {
320+
config.retryStrategy = config.configFactories.retryStrategyCreateFn();
321+
}
291322
}
292323

293324
ClientConfiguration::ClientConfiguration()

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <aws/core/config/AWSProfileConfigLoader.h>
77
#include <aws/core/internal/AWSHttpResourceClient.h>
88
#include <aws/core/auth/AWSCredentialsProvider.h>
9+
#include <aws/core/client/ClientConfiguration.h>
910
#include <aws/core/utils/memory/stl/AWSList.h>
1011
#include <aws/core/utils/logging/LogMacros.h>
1112
#include <aws/core/utils/json/JsonSerializer.h>
@@ -37,6 +38,10 @@ namespace Aws
3738
m_ec2metadataClient = client;
3839
}
3940
}
41+
42+
EC2InstanceProfileConfigLoader::EC2InstanceProfileConfigLoader(const Aws::Client::ClientConfiguration::CredentialProviderConfiguration& credentialConfig)
43+
: m_ec2metadataClient(Aws::MakeShared<Aws::Internal::EC2MetadataClient>(EC2_INSTANCE_PROFILE_LOG_TAG, credentialConfig))
44+
{}
4045

4146
bool EC2InstanceProfileConfigLoader::LoadInternal()
4247
{

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,14 @@ 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-
m_retryStrategy(clientConfiguration.retryStrategy ? clientConfiguration.retryStrategy : clientConfiguration.configFactories.retryStrategyCreateFn()),
85+
m_retryStrategy(clientConfiguration.retryStrategy),
8686
m_httpClient(nullptr)
8787
{
8888
AWS_LOGSTREAM_INFO(m_logtag.c_str(),
8989
"Creating AWSHttpResourceClient with max connections "
9090
<< clientConfiguration.maxConnections
9191
<< " and scheme "
9292
<< SchemeMapper::ToString(clientConfiguration.scheme));
93-
9493
m_httpClient = CreateHttpClient(clientConfiguration);
9594
}
9695

@@ -208,6 +207,28 @@ namespace Aws
208207
#endif
209208
}
210209

210+
EC2MetadataClient::EC2MetadataClient(const Aws::Client::ClientConfiguration::CredentialProviderConfiguration& credentialConfig,
211+
const char* endpoint)
212+
: AWSHttpResourceClient(
213+
[&credentialConfig]() -> ClientConfiguration{
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>(
219+
RESOURCE_CLIENT_CONFIGURATION_ALLOCATION_TAG, credentialConfig.imdsConfig.metadataServiceNumAttempts - 1, 1000);
220+
return clientConfig;
221+
}(),
222+
EC2_METADATA_CLIENT_LOG_TAG),
223+
m_endpoint(endpoint),
224+
m_disableIMDS(false),
225+
m_tokenRequired(true) {
226+
#if defined(DISABLE_IMDSV1)
227+
m_disableIMDSV1 = true;
228+
AWS_LOGSTREAM_TRACE(m_logtag.c_str(), "IMDSv1 had been disabled at the SDK build time");
229+
#endif
230+
}
231+
211232
EC2MetadataClient::~EC2MetadataClient()
212233
{
213234

0 commit comments

Comments
 (0)