@@ -46,6 +46,13 @@ namespace S3AuthSetting
4646 extern const S3AuthSettingsString server_side_encryption_customer_key_base64;
4747 extern const S3AuthSettingsBool use_environment_credentials;
4848 extern const S3AuthSettingsBool use_insecure_imds_request;
49+
50+ extern const S3AuthSettingsString role_arn;
51+ extern const S3AuthSettingsString role_session_name;
52+ extern const S3AuthSettingsString http_client;
53+ extern const S3AuthSettingsString service_account;
54+ extern const S3AuthSettingsString metadata_service;
55+ extern const S3AuthSettingsString request_token_path;
4956}
5057
5158namespace S3RequestSetting
@@ -69,6 +76,8 @@ namespace
6976 const S3::URI & s3_uri,
7077 const String & access_key_id,
7178 const String & secret_access_key,
79+ String role_arn,
80+ String role_session_name,
7281 const S3Settings & settings,
7382 const ContextPtr & context)
7483 {
@@ -84,6 +93,12 @@ namespace
8493 const Settings & global_settings = context->getGlobalContext ()->getSettingsRef ();
8594 const Settings & local_settings = context->getSettingsRef ();
8695
96+ if (role_arn.empty ())
97+ {
98+ role_arn = settings.auth_settings [S3AuthSetting::role_arn];
99+ role_session_name = settings.auth_settings [S3AuthSetting::role_session_name];
100+ }
101+
87102 S3::PocoHTTPClientConfiguration client_configuration = S3::ClientFactory::instance ().createClientConfiguration (
88103 settings.auth_settings [S3AuthSetting::region],
89104 context->getRemoteHostFilter (),
@@ -108,6 +123,11 @@ namespace
108123 client_configuration.http_max_field_name_size = request_settings[S3RequestSetting::http_max_field_name_size];
109124 client_configuration.http_max_field_value_size = request_settings[S3RequestSetting::http_max_field_value_size];
110125
126+ client_configuration.http_client = settings.auth_settings [S3AuthSetting::http_client];
127+ client_configuration.service_account = settings.auth_settings [S3AuthSetting::service_account];
128+ client_configuration.metadata_service = settings.auth_settings [S3AuthSetting::metadata_service];
129+ client_configuration.request_token_path = settings.auth_settings [S3AuthSetting::request_token_path];
130+
111131 S3::ClientSettings client_settings{
112132 .use_virtual_addressing = s3_uri.is_virtual_hosted_style ,
113133 .disable_checksum = local_settings[Setting::s3_disable_checksum],
@@ -128,7 +148,10 @@ namespace
128148 settings.auth_settings [S3AuthSetting::use_environment_credentials],
129149 settings.auth_settings [S3AuthSetting::use_insecure_imds_request],
130150 settings.auth_settings [S3AuthSetting::expiration_window_seconds],
131- settings.auth_settings [S3AuthSetting::no_sign_request]
151+ settings.auth_settings [S3AuthSetting::no_sign_request],
152+ std::move (role_arn),
153+ std::move (role_session_name),
154+ /* sts_endpoint_override=*/ " "
132155 });
133156 }
134157
@@ -150,14 +173,16 @@ BackupReaderS3::BackupReaderS3(
150173 const S3::URI & s3_uri_,
151174 const String & access_key_id_,
152175 const String & secret_access_key_,
176+ const String & role_arn,
177+ const String & role_session_name,
153178 bool allow_s3_native_copy,
154179 const ReadSettings & read_settings_,
155180 const WriteSettings & write_settings_,
156181 const ContextPtr & context_,
157182 bool is_internal_backup)
158183 : BackupReaderDefault(read_settings_, write_settings_, getLogger(" BackupReaderS3" ))
159184 , s3_uri(s3_uri_)
160- , data_source_description{DataSourceType::ObjectStorage, ObjectStorageType::S3, MetadataStorageType::None, s3_uri.endpoint , false , false }
185+ , data_source_description{DataSourceType::ObjectStorage, ObjectStorageType::S3, MetadataStorageType::None, s3_uri.endpoint , false , false , " " }
161186{
162187 s3_settings.loadFromConfig (context_->getConfigRef (), " s3" , context_->getSettingsRef ());
163188
@@ -170,7 +195,7 @@ BackupReaderS3::BackupReaderS3(
170195 s3_settings.request_settings .updateFromSettings (context_->getSettingsRef (), /* if_changed */ true );
171196 s3_settings.request_settings [S3RequestSetting::allow_native_copy] = allow_s3_native_copy;
172197
173- client = makeS3Client (s3_uri_, access_key_id_, secret_access_key_, s3_settings, context_);
198+ client = makeS3Client (s3_uri_, access_key_id_, secret_access_key_, role_arn, role_session_name, s3_settings, context_);
174199
175200 if (auto blob_storage_system_log = context_->getBlobStorageLog ())
176201 blob_storage_log = std::make_shared<BlobStorageLogWriter>(blob_storage_system_log);
@@ -247,6 +272,8 @@ BackupWriterS3::BackupWriterS3(
247272 const S3::URI & s3_uri_,
248273 const String & access_key_id_,
249274 const String & secret_access_key_,
275+ const String & role_arn,
276+ const String & role_session_name,
250277 bool allow_s3_native_copy,
251278 const String & storage_class_name,
252279 const ReadSettings & read_settings_,
@@ -255,7 +282,7 @@ BackupWriterS3::BackupWriterS3(
255282 bool is_internal_backup)
256283 : BackupWriterDefault(read_settings_, write_settings_, getLogger(" BackupWriterS3" ))
257284 , s3_uri(s3_uri_)
258- , data_source_description{DataSourceType::ObjectStorage, ObjectStorageType::S3, MetadataStorageType::None, s3_uri.endpoint , false , false }
285+ , data_source_description{DataSourceType::ObjectStorage, ObjectStorageType::S3, MetadataStorageType::None, s3_uri.endpoint , false , false , " " }
259286 , s3_capabilities(getCapabilitiesFromConfig(context_->getConfigRef (), "s3"))
260287{
261288 s3_settings.loadFromConfig (context_->getConfigRef (), " s3" , context_->getSettingsRef ());
@@ -270,7 +297,8 @@ BackupWriterS3::BackupWriterS3(
270297 s3_settings.request_settings [S3RequestSetting::allow_native_copy] = allow_s3_native_copy;
271298 s3_settings.request_settings [S3RequestSetting::storage_class_name] = storage_class_name;
272299
273- client = makeS3Client (s3_uri_, access_key_id_, secret_access_key_, s3_settings, context_);
300+ client = makeS3Client (s3_uri_, access_key_id_, secret_access_key_, role_arn, role_session_name, s3_settings, context_);
301+
274302 if (auto blob_storage_system_log = context_->getBlobStorageLog ())
275303 {
276304 blob_storage_log = std::make_shared<BlobStorageLogWriter>(blob_storage_system_log);
0 commit comments