@@ -66,11 +66,6 @@ namespace DB::Setting
6666 extern const SettingsUInt64 s3_request_timeout_ms;
6767}
6868
69- namespace DB ::StorageObjectStorageSetting
70- {
71- extern const StorageObjectStorageSettingsString iceberg_metadata_file_path;
72- }
73-
7469namespace DB ::DatabaseDataLakeSetting
7570{
7671 extern const DatabaseDataLakeSettingsString storage_endpoint;
@@ -96,14 +91,15 @@ GlueCatalog::GlueCatalog(
9691 : ICatalog(" " )
9792 , DB::WithContext(context_)
9893 , log(getLogger(" GlueCatalog(" + settings_.region + " )" ))
99- , credentials(settings_.aws_access_key_id, settings_.aws_secret_access_key)
10094 , region(settings_.region)
10195 , settings(settings_)
10296 , table_engine_definition(table_engine_definition_)
10397 , metadata_objects(CurrentMetrics::MarkCacheBytes, CurrentMetrics::MarkCacheFiles, 1024 )
10498{
10599 DB::S3::CredentialsConfiguration creds_config;
106100 creds_config.use_environment_credentials = true ;
101+ creds_config.role_arn = settings.aws_role_arn ;
102+ creds_config.role_session_name = settings.aws_role_session_name ;
107103
108104 const DB::Settings & global_settings = getContext ()->getGlobalContext ()->getSettingsRef ();
109105
@@ -126,38 +122,48 @@ GlueCatalog::GlueCatalog(
126122 /* get_request_throttler = */ nullptr ,
127123 /* put_request_throttler = */ nullptr );
128124
125+
129126 Aws::Glue::GlueClientConfiguration client_configuration;
130127 client_configuration.maxConnections = static_cast <unsigned >(global_settings[DB::Setting::s3_max_connections]);
131128 client_configuration.connectTimeoutMs = static_cast <unsigned >(global_settings[DB::Setting::s3_connect_timeout_ms]);
132129 client_configuration.requestTimeoutMs = static_cast <unsigned >(global_settings[DB::Setting::s3_request_timeout_ms]);
133130 client_configuration.region = region;
134131 auto endpoint_provider = std::make_shared<Aws::Glue::GlueEndpointProvider>();
135132
133+ Aws::Auth::AWSCredentials credentials (settings_.aws_access_key_id , settings_.aws_secret_access_key );
136134 // / Only for testing when we are mocking glue
137135 if (!endpoint.empty ())
138136 {
139137 client_configuration.endpointOverride = endpoint;
140138 endpoint_provider->OverrideEndpoint (endpoint);
141- Aws::Auth::AWSCredentials fake_credentials_for_fake_catalog;
139+
142140 if (credentials.IsEmpty ())
143141 {
144142 // / You can specify any key for fake moto glue, it's just important
145143 // / for it not to be empty.
146- fake_credentials_for_fake_catalog .SetAWSAccessKeyId (" testing" );
147- fake_credentials_for_fake_catalog .SetAWSSecretKey (" testing" );
144+ credentials .SetAWSAccessKeyId (" testing" );
145+ credentials .SetAWSSecretKey (" testing" );
148146 }
149- else
150- fake_credentials_for_fake_catalog = credentials;
151147
152- glue_client = std::make_unique<Aws::Glue::GlueClient>(fake_credentials_for_fake_catalog, endpoint_provider, client_configuration);
148+ Poco::URI uri (endpoint);
149+ if (uri.getScheme () == " http" )
150+ poco_config.scheme = Aws::Http::Scheme::HTTP;
153151 }
154152 else
155153 {
156154 LOG_TRACE (log, " Creating AWS glue client with credentials empty {}, region '{}', endpoint '{}'" , credentials.IsEmpty (), region, endpoint);
157- std::shared_ptr<DB::S3::S3CredentialsProviderChain> chain = std::make_shared<DB::S3::S3CredentialsProviderChain>(poco_config, credentials, creds_config);
158- glue_client = std::make_unique<Aws::Glue::GlueClient>(chain, endpoint_provider, client_configuration);
159155 }
160156
157+ credentials_provider = std::make_shared<DB::S3::S3CredentialsProviderChain>(poco_config, credentials, creds_config);
158+ if (!creds_config.role_arn .empty ())
159+ credentials_provider = std::make_shared<DB::S3::AwsAuthSTSAssumeRoleCredentialsProvider>(
160+ creds_config.role_arn ,
161+ creds_config.role_session_name ,
162+ creds_config.expiration_window_seconds ,
163+ std::move (credentials_provider),
164+ poco_config,
165+ creds_config.sts_endpoint_override );
166+ glue_client = std::make_unique<Aws::Glue::GlueClient>(credentials_provider, endpoint_provider, client_configuration);
161167}
162168
163169GlueCatalog::~GlueCatalog () = default ;
@@ -282,7 +288,6 @@ bool GlueCatalog::tryGetTableMetadata(
282288 request.SetDatabaseName (database_name);
283289 request.SetName (table_name);
284290
285-
286291 auto outcome = glue_client->GetTable (request);
287292 if (outcome.IsSuccess ())
288293 {
@@ -412,8 +417,9 @@ void GlueCatalog::setCredentials(TableMetadata & metadata) const
412417
413418 if (storage_type == StorageType::S3)
414419 {
415- auto creds = std::make_shared<S3Credentials>(credentials.GetAWSAccessKeyId (), credentials.GetAWSSecretKey (), credentials.GetSessionToken ());
416- metadata.setStorageCredentials (creds);
420+ auto credentials = credentials_provider->GetAWSCredentials ();
421+ auto s3_creds = std::make_shared<S3Credentials>(credentials.GetAWSAccessKeyId (), credentials.GetAWSSecretKey (), credentials.GetSessionToken ());
422+ metadata.setStorageCredentials (s3_creds);
417423 }
418424 else
419425 {
@@ -459,7 +465,7 @@ bool GlueCatalog::classifyTimestampTZ(const String & column_name, const TableMet
459465 DB::ASTs args = storage->engine ->arguments ->children ;
460466
461467 String storage_endpoint = !settings.storage_endpoint .empty () ? settings.storage_endpoint : metadata_uri;
462-
468+
463469 if (args.empty ())
464470 args.emplace_back (std::make_shared<DB::ASTLiteral>(storage_endpoint));
465471 else
@@ -469,8 +475,12 @@ bool GlueCatalog::classifyTimestampTZ(const String & column_name, const TableMet
469475 {
470476 if (table_metadata.hasStorageCredentials ())
471477 table_metadata.getStorageCredentials ()->addCredentialsToEngineArgs (args);
472- else if (!credentials.IsExpiredOrEmpty ())
473- DataLake::S3Credentials (credentials.GetAWSAccessKeyId (), credentials.GetAWSSecretKey (), credentials.GetSessionToken ()).addCredentialsToEngineArgs (args);
478+ else
479+ {
480+ auto credentials = credentials_provider->GetAWSCredentials ();
481+ if (!credentials.IsExpiredOrEmpty ())
482+ DataLake::S3Credentials (credentials.GetAWSAccessKeyId (), credentials.GetAWSSecretKey (), credentials.GetSessionToken ()).addCredentialsToEngineArgs (args);
483+ }
474484 }
475485
476486 auto storage_settings = std::make_shared<DB::DataLakeStorageSettings>();
@@ -529,11 +539,17 @@ String GlueCatalog::resolveMetadataPathFromTableLocation(const String & table_lo
529539 else
530540 args[0 ] = std::make_shared<DB::ASTLiteral>(storage_endpoint);
531541
532- if (args.size () == 1 && table_metadata. hasStorageCredentials () )
542+ if (args.size () == 1 )
533543 {
534- auto storage_credentials = table_metadata.getStorageCredentials ();
535- if (storage_credentials)
536- storage_credentials->addCredentialsToEngineArgs (args);
544+ if (table_metadata.hasStorageCredentials ())
545+ {
546+ table_metadata.getStorageCredentials ()->addCredentialsToEngineArgs (args);
547+ }
548+ else
549+ {
550+ auto credentials = credentials_provider->GetAWSCredentials ();
551+ DataLake::S3Credentials (credentials.GetAWSAccessKeyId (), credentials.GetAWSSecretKey (), credentials.GetSessionToken ()).addCredentialsToEngineArgs (args);
552+ }
537553 }
538554
539555 auto storage_settings = std::make_shared<DB::DataLakeStorageSettings>();
0 commit comments