This is an automated email from the ASF dual-hosted git repository.

hello-stephen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 533f02b970e [improvement](cloud) Support configurable S3 credentials 
providers (#62788)
533f02b970e is described below

commit 533f02b970e8c96820d7ebe646b4eadc23bc064b
Author: Yixuan Wang <[email protected]>
AuthorDate: Wed May 13 10:42:18 2026 +0800

    [improvement](cloud) Support configurable S3 credentials providers (#62788)
    
    ### What problem does this PR solve?
    Support configuring the AWS S3 credentials provider type for cloud
    storage vaults and S3 storage parameters. This allows IAM role based
    access to use providers other than instance profile, such as
    environment, system
    properties, web identity, container, default chain, and anonymous
    credentials. The credential provider type is propagated through FE
    properties, thrift/proto definitions, meta service storage vault
    handling, and cloud
      recycler S3 accessor creation.
    
    ```
    CREATE storage vault IF NOT EXISTS s3_vault_2
        PROPERTIES (
        "type"="S3",
        "s3.endpoint"="xxx",
        "s3.role_arn" = "xxx",
        "s3.region" = "us-west-1",
        "s3.root.path" = "xxx",
        "s3.bucket" = "xxx",
        "provider" = "S3",
        "use_path_style" = "false",
        "s3.credentials_provider_type" = "WEB_IDENTITY",
        "s3_validity_check" = "false"
    );
    
    ```
    
    ```
    curl "127.0.0.1:5678/MetaService/http/get_obj_store_info
    ```
    ```
    {
        "id": "3",
        "name": "s3_vault_2",
        "obj_info": {
            "ctime": "1777011933",
            "mtime": "1777011933",
            "id": "3",
            "bucket": "xxx",
            "prefix": "wyx_test",
            "endpoint": "xxx",
            "region": "us-west-1",
            "provider": "S3",
            "external_endpoint": "",
            "sse_enabled": true,
            "use_path_style": false,
            "cred_provider_type": "WEB_IDENTITY",
            "role_arn": "xxx",
            "external_id": ""
        }
    }
    ```
---
 be/src/util/s3_util.cpp                            | 10 ++++
 cloud/src/meta-service/meta_service_resource.cpp   | 28 +++++----
 cloud/src/recycler/s3_accessor.cpp                 | 41 ++++++++++---
 cloud/src/recycler/s3_accessor.h                   |  3 +
 common/cpp/aws_common.cpp                          | 12 +++-
 .../org/apache/doris/catalog/S3StorageVault.java   |  4 +-
 .../datasource/property/storage/S3Properties.java  | 67 +++++++++++++++++++++-
 .../property/storage/S3PropertiesTest.java         | 32 +++++++++++
 gensrc/proto/cloud.proto                           |  5 ++
 gensrc/thrift/AgentService.thrift                  |  7 ++-
 10 files changed, 184 insertions(+), 25 deletions(-)

diff --git a/be/src/util/s3_util.cpp b/be/src/util/s3_util.cpp
index ee8293f49bd..851fbf43edf 100644
--- a/be/src/util/s3_util.cpp
+++ b/be/src/util/s3_util.cpp
@@ -626,6 +626,16 @@ static CredProviderType 
cred_provider_type_from_thrift(TCredProviderType::type c
         return CredProviderType::Simple;
     case TCredProviderType::INSTANCE_PROFILE:
         return CredProviderType::InstanceProfile;
+    case TCredProviderType::ENV:
+        return CredProviderType::Env;
+    case TCredProviderType::SYSTEM_PROPERTIES:
+        return CredProviderType::SystemProperties;
+    case TCredProviderType::WEB_IDENTITY:
+        return CredProviderType::WebIdentity;
+    case TCredProviderType::CONTAINER:
+        return CredProviderType::Container;
+    case TCredProviderType::ANONYMOUS:
+        return CredProviderType::Anonymous;
     default:
         __builtin_unreachable();
         LOG(WARNING) << "Invalid TCredProviderType value: " << 
cred_provider_type
diff --git a/cloud/src/meta-service/meta_service_resource.cpp 
b/cloud/src/meta-service/meta_service_resource.cpp
index b4e5e0d0b15..1c511488673 100644
--- a/cloud/src/meta-service/meta_service_resource.cpp
+++ b/cloud/src/meta-service/meta_service_resource.cpp
@@ -59,6 +59,11 @@ bool is_valid_storage_vault_name(const std::string& str) {
 
 namespace doris::cloud {
 
+static CredProviderTypePB get_cred_provider_type(const ObjectStoreInfoPB& obj) 
{
+    return obj.has_cred_provider_type() ? obj.cred_provider_type()
+                                        : CredProviderTypePB::INSTANCE_PROFILE;
+}
+
 static std::string_view print_cluster_status(const ClusterStatus& status) {
     switch (status) {
     case ClusterStatus::UNKNOWN:
@@ -679,12 +684,11 @@ static void create_object_info_with_encrypt(const 
InstanceInfoPB& instance, Obje
     std::string region = obj->has_region() ? obj->region() : "";
 
     if (obj->has_role_arn()) {
-        if (obj->role_arn().empty() || !obj->has_cred_provider_type() ||
-            obj->cred_provider_type() != CredProviderTypePB::INSTANCE_PROFILE 
||
-            !obj->has_provider() || obj->provider() != ObjectStoreInfoPB::S3 
|| bucket.empty() ||
-            endpoint.empty() || region.empty()) {
+        if (obj->role_arn().empty() || !obj->has_cred_provider_type() || 
!obj->has_provider() ||
+            obj->provider() != ObjectStoreInfoPB::S3 || bucket.empty() || 
endpoint.empty() ||
+            region.empty()) {
             code = MetaServiceCode::INVALID_ARGUMENT;
-            msg = "s3 conf info err with role_arn, please check it";
+            msg = "s3 conf info err with role_arn or cred provider, please 
check it";
             return;
         }
     } else {
@@ -1037,7 +1041,7 @@ static int alter_s3_storage_vault(InstanceInfoPB& 
instance, std::unique_ptr<Tran
         new_vault.mutable_obj_info()->clear_encryption_info();
 
         new_vault.mutable_obj_info()->set_role_arn(obj_info.role_arn());
-        
new_vault.mutable_obj_info()->set_cred_provider_type(CredProviderTypePB::INSTANCE_PROFILE);
+        
new_vault.mutable_obj_info()->set_cred_provider_type(get_cred_provider_type(obj_info));
         if (obj_info.has_external_id()) {
             
new_vault.mutable_obj_info()->set_external_id(obj_info.external_id());
         }
@@ -1170,7 +1174,7 @@ static ObjectStoreInfoPB 
object_info_pb_factory(ObjectStorageDesc& obj_desc,
     } else {
         last_item.set_role_arn(role_arn);
         last_item.set_external_id(external_id);
-        last_item.set_cred_provider_type(CredProviderTypePB::INSTANCE_PROFILE);
+        last_item.set_cred_provider_type(get_cred_provider_type(obj));
     }
     last_item.set_bucket(bucket);
     // format prefix, such as `/aa/bb/`, `aa/bb//`, `//aa/bb`, `  /aa/bb` -> 
`aa/bb`
@@ -1330,9 +1334,8 @@ void 
MetaServiceImpl::alter_storage_vault(google::protobuf::RpcController* contr
         }
 
         if (!role_arn.empty()) {
-            if (!obj.has_cred_provider_type() ||
-                obj.cred_provider_type() != 
CredProviderTypePB::INSTANCE_PROFILE ||
-                !obj.has_provider() || obj.provider() != 
ObjectStoreInfoPB::S3) {
+            if (!obj.has_cred_provider_type() || !obj.has_provider() ||
+                obj.provider() != ObjectStoreInfoPB::S3) {
                 code = MetaServiceCode::INVALID_ARGUMENT;
                 msg = "s3 conf info err with role_arn, please check it";
                 return;
@@ -1627,7 +1630,8 @@ void 
MetaServiceImpl::alter_obj_store_info(google::protobuf::RpcController* cont
                         return;
                     }
 
-                    if (it.role_arn() == role_arn && it.external_id() == 
external_id) {
+                    if (it.role_arn() == role_arn && it.external_id() == 
external_id &&
+                        get_cred_provider_type(it) == 
get_cred_provider_type(request->obj())) {
                         // not change, just return ok
                         code = MetaServiceCode::OK;
                         msg = "ak/sk not changed";
@@ -1639,7 +1643,7 @@ void 
MetaServiceImpl::alter_obj_store_info(google::protobuf::RpcController* cont
 
                     it.set_role_arn(role_arn);
                     it.set_external_id(external_id);
-                    
it.set_cred_provider_type(CredProviderTypePB::INSTANCE_PROFILE);
+                    
it.set_cred_provider_type(get_cred_provider_type(request->obj()));
                 }
 
                 auto now_time = std::chrono::system_clock::now();
diff --git a/cloud/src/recycler/s3_accessor.cpp 
b/cloud/src/recycler/s3_accessor.cpp
index 9c98d3dc8af..cc4384b75a5 100644
--- a/cloud/src/recycler/s3_accessor.cpp
+++ b/cloud/src/recycler/s3_accessor.cpp
@@ -20,7 +20,9 @@
 #include <aws/core/auth/AWSAuthSigner.h>
 #include <aws/core/auth/AWSCredentials.h>
 #include <aws/core/auth/AWSCredentialsProviderChain.h>
+#include <aws/core/auth/STSCredentialsProvider.h>
 #include <aws/core/client/DefaultRetryStrategy.h>
+#include <aws/core/platform/Environment.h>
 #include <aws/identity-management/auth/STSAssumeRoleCredentialsProvider.h>
 #include <aws/s3/S3Client.h>
 #include <aws/sts/STSClient.h>
@@ -238,7 +240,12 @@ std::optional<S3Conf> S3Conf::from_obj_store_info(const 
ObjectStoreInfoPB& obj_i
         if (obj_info.has_role_arn() && !obj_info.role_arn().empty()) {
             s3_conf.role_arn = obj_info.role_arn();
             s3_conf.external_id = obj_info.external_id();
-            s3_conf.cred_provider_type = CredProviderType::InstanceProfile;
+            if (obj_info.has_cred_provider_type()) {
+                s3_conf.cred_provider_type =
+                        
cred_provider_type_from_pb(obj_info.cred_provider_type());
+            } else {
+                s3_conf.cred_provider_type = CredProviderType::InstanceProfile;
+            }
         }
     }
 
@@ -314,6 +321,28 @@ std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
S3Accessor::_get_aws_credenti
     return std::make_shared<Aws::Auth::DefaultAWSCredentialsProviderChain>();
 }
 
+std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
S3Accessor::_create_credentials_provider(
+        CredProviderType type) {
+    switch (type) {
+    case CredProviderType::Env:
+        return 
std::make_shared<Aws::Auth::EnvironmentAWSCredentialsProvider>();
+    case CredProviderType::SystemProperties:
+        return 
std::make_shared<Aws::Auth::ProfileConfigFileAWSCredentialsProvider>();
+    case CredProviderType::WebIdentity:
+        return 
std::make_shared<Aws::Auth::STSAssumeRoleWebIdentityCredentialsProvider>();
+    case CredProviderType::Container:
+        return std::make_shared<Aws::Auth::TaskRoleCredentialsProvider>(
+                
Aws::Environment::GetEnv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI").c_str());
+    case CredProviderType::InstanceProfile:
+        return 
std::make_shared<Aws::Auth::InstanceProfileCredentialsProvider>();
+    case CredProviderType::Anonymous:
+        return std::make_shared<Aws::Auth::AnonymousAWSCredentialsProvider>();
+    case CredProviderType::Default:
+    default:
+        return std::make_shared<CustomAwsCredentialsProviderChain>();
+    }
+}
+
 std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
S3Accessor::_get_aws_credentials_provider_v2(
         const S3Conf& s3_conf) {
     if (!s3_conf.ak.empty() && !s3_conf.sk.empty()) {
@@ -322,11 +351,7 @@ std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
S3Accessor::_get_aws_credenti
         return 
std::make_shared<Aws::Auth::SimpleAWSCredentialsProvider>(std::move(aws_cred));
     }
 
-    if (s3_conf.cred_provider_type == CredProviderType::InstanceProfile) {
-        if (s3_conf.role_arn.empty()) {
-            return std::make_shared<CustomAwsCredentialsProviderChain>();
-        }
-
+    if (!s3_conf.role_arn.empty()) {
         Aws::Client::ClientConfiguration clientConfiguration =
                 S3Environment::getClientConfiguration();
         if (_ca_cert_file_path.empty()) {
@@ -338,13 +363,13 @@ std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
S3Accessor::_get_aws_credenti
         }
 
         auto stsClient = std::make_shared<Aws::STS::STSClient>(
-                std::make_shared<CustomAwsCredentialsProviderChain>(), 
clientConfiguration);
+                _create_credentials_provider(s3_conf.cred_provider_type), 
clientConfiguration);
 
         return std::make_shared<Aws::Auth::STSAssumeRoleCredentialsProvider>(
                 s3_conf.role_arn, Aws::String(), s3_conf.external_id,
                 Aws::Auth::DEFAULT_CREDS_LOAD_FREQ_SECONDS, stsClient);
     }
-    return std::make_shared<CustomAwsCredentialsProviderChain>();
+    return _create_credentials_provider(s3_conf.cred_provider_type);
 }
 
 std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
S3Accessor::get_aws_credentials_provider(
diff --git a/cloud/src/recycler/s3_accessor.h b/cloud/src/recycler/s3_accessor.h
index 652f0c0681a..28d12c7f980 100644
--- a/cloud/src/recycler/s3_accessor.h
+++ b/cloud/src/recycler/s3_accessor.h
@@ -163,6 +163,9 @@ protected:
     std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
_get_aws_credentials_provider_v2(
             const S3Conf& s3_conf);
 
+    std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
_create_credentials_provider(
+            CredProviderType type);
+
     std::shared_ptr<Aws::Auth::AWSCredentialsProvider> 
get_aws_credentials_provider(
             const S3Conf& s3_conf);
 
diff --git a/common/cpp/aws_common.cpp b/common/cpp/aws_common.cpp
index c8f5e4faf47..3c7f5a0eda5 100644
--- a/common/cpp/aws_common.cpp
+++ b/common/cpp/aws_common.cpp
@@ -29,6 +29,16 @@ CredProviderType 
cred_provider_type_from_pb(cloud::CredProviderTypePB cred_provi
         return CredProviderType::Simple;
     case cloud::CredProviderTypePB::INSTANCE_PROFILE:
         return CredProviderType::InstanceProfile;
+    case cloud::CredProviderTypePB::ENV:
+        return CredProviderType::Env;
+    case cloud::CredProviderTypePB::SYSTEM_PROPERTIES:
+        return CredProviderType::SystemProperties;
+    case cloud::CredProviderTypePB::WEB_IDENTITY:
+        return CredProviderType::WebIdentity;
+    case cloud::CredProviderTypePB::CONTAINER:
+        return CredProviderType::Container;
+    case cloud::CredProviderTypePB::ANONYMOUS:
+        return CredProviderType::Anonymous;
     default:
         __builtin_unreachable();
         LOG(WARNING) << "Invalid CredProviderTypePB value: " << 
cred_provider_type
@@ -74,4 +84,4 @@ std::string get_valid_ca_cert_path(const 
std::vector<std::string>& ca_cert_file_
     }
     return "";
 }
-}
\ No newline at end of file
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/S3StorageVault.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/S3StorageVault.java
index b2a8b61fff1..d312cc0e45d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/S3StorageVault.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/S3StorageVault.java
@@ -72,6 +72,7 @@ public class S3StorageVault extends StorageVault {
         public static final String BUCKET = S3Properties.BUCKET;
         public static final String ROLE_ARN = S3Properties.ROLE_ARN;
         public static final String EXTERNAL_ID = S3Properties.EXTERNAL_ID;
+        public static final String CREDENTIALS_PROVIDER_TYPE = 
S3Properties.CREDENTIALS_PROVIDER_TYPE;
     }
 
     public static final HashSet<String> ALLOW_ALTER_PROPERTIES = new 
HashSet<>(Arrays.asList(
@@ -81,7 +82,8 @@ public class S3StorageVault extends StorageVault {
             PropertyKey.SECRET_KEY,
             PropertyKey.USE_PATH_STYLE,
             PropertyKey.ROLE_ARN,
-            PropertyKey.EXTERNAL_ID
+            PropertyKey.EXTERNAL_ID,
+            PropertyKey.CREDENTIALS_PROVIDER_TYPE
     ));
 
     @SerializedName(value = "properties")
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/S3Properties.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/S3Properties.java
index db4608be2d0..d0166e195f9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/S3Properties.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/S3Properties.java
@@ -473,6 +473,7 @@ public class S3Properties extends 
AbstractS3CompatibleProperties {
 
         public static final String ROLE_ARN = "AWS_ROLE_ARN";
         public static final String EXTERNAL_ID = "AWS_EXTERNAL_ID";
+        public static final String CREDENTIALS_PROVIDER_TYPE = 
"AWS_CREDENTIALS_PROVIDER_TYPE";
 
         public static final List<String> REQUIRED_FIELDS = 
Arrays.asList(ENDPOINT);
         public static final List<String> FS_KEYS = Arrays.asList(ENDPOINT, 
REGION, ACCESS_KEY, SECRET_KEY, TOKEN,
@@ -562,6 +563,68 @@ public class S3Properties extends 
AbstractS3CompatibleProperties {
         if (properties.containsKey(Env.EXTERNAL_ID)) {
             properties.putIfAbsent(EXTERNAL_ID, 
properties.get(Env.EXTERNAL_ID));
         }
+
+        if (properties.containsKey(Env.CREDENTIALS_PROVIDER_TYPE)) {
+            properties.putIfAbsent(CREDENTIALS_PROVIDER_TYPE, 
properties.get(Env.CREDENTIALS_PROVIDER_TYPE));
+        }
+    }
+
+    private static AwsCredentialsProviderMode 
getCredentialsProviderMode(Map<String, String> properties,
+            AwsCredentialsProviderMode defaultMode) {
+        String mode = properties.get(CREDENTIALS_PROVIDER_TYPE);
+        if (StringUtils.isBlank(mode)) {
+            mode = properties.get(Env.CREDENTIALS_PROVIDER_TYPE);
+        }
+        if (StringUtils.isBlank(mode)) {
+            return defaultMode;
+        }
+        return AwsCredentialsProviderMode.fromString(mode);
+    }
+
+    private static CredProviderTypePB getCredProviderTypePB(Map<String, 
String> properties) {
+        AwsCredentialsProviderMode mode = 
getCredentialsProviderMode(properties,
+                AwsCredentialsProviderMode.INSTANCE_PROFILE);
+        switch (mode) {
+            case DEFAULT:
+                return CredProviderTypePB.DEFAULT;
+            case ENV:
+                return CredProviderTypePB.ENV;
+            case SYSTEM_PROPERTIES:
+                return CredProviderTypePB.SYSTEM_PROPERTIES;
+            case WEB_IDENTITY:
+                return CredProviderTypePB.WEB_IDENTITY;
+            case CONTAINER:
+                return CredProviderTypePB.CONTAINER;
+            case INSTANCE_PROFILE:
+                return CredProviderTypePB.INSTANCE_PROFILE;
+            case ANONYMOUS:
+                return CredProviderTypePB.ANONYMOUS;
+            default:
+                throw new IllegalArgumentException("Unsupported AWS 
credentials provider mode: " + mode);
+        }
+    }
+
+    private static TCredProviderType getTCredProviderType(Map<String, String> 
properties) {
+        AwsCredentialsProviderMode mode = 
getCredentialsProviderMode(properties,
+                AwsCredentialsProviderMode.INSTANCE_PROFILE);
+        switch (mode) {
+            case DEFAULT:
+                return TCredProviderType.DEFAULT;
+            case ENV:
+                return TCredProviderType.ENV;
+            case SYSTEM_PROPERTIES:
+                return TCredProviderType.SYSTEM_PROPERTIES;
+            case WEB_IDENTITY:
+                return TCredProviderType.WEB_IDENTITY;
+            case CONTAINER:
+                return TCredProviderType.CONTAINER;
+            case INSTANCE_PROFILE:
+                return TCredProviderType.INSTANCE_PROFILE;
+            case ANONYMOUS:
+                return TCredProviderType.ANONYMOUS;
+            default:
+                throw new IllegalArgumentException("Unsupported AWS 
credentials provider mode: " + mode);
+        }
     }
 
     private static final Pattern IPV4_PORT_PATTERN = 
Pattern.compile("((?:\\d{1,3}\\.){3}\\d{1,3}:\\d{1,5})");
@@ -638,7 +701,7 @@ public class S3Properties extends 
AbstractS3CompatibleProperties {
             if (properties.containsKey(S3Properties.EXTERNAL_ID)) {
                 
builder.setExternalId(properties.get(S3Properties.EXTERNAL_ID));
             }
-            builder.setCredProviderType(CredProviderTypePB.INSTANCE_PROFILE);
+            builder.setCredProviderType(getCredProviderTypePB(properties));
         }
 
         return builder;
@@ -652,7 +715,7 @@ public class S3Properties extends 
AbstractS3CompatibleProperties {
             if (properties.containsKey(S3Properties.EXTERNAL_ID)) {
                 s3Info.setExternalId(properties.get(S3Properties.EXTERNAL_ID));
             }
-            s3Info.setCredProviderType(TCredProviderType.INSTANCE_PROFILE);
+            s3Info.setCredProviderType(getTCredProviderType(properties));
         }
 
         s3Info.setEndpoint(properties.get(S3Properties.ENDPOINT));
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/S3PropertiesTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/S3PropertiesTest.java
index abe52d64cc4..97bb862df33 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/S3PropertiesTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/S3PropertiesTest.java
@@ -17,9 +17,13 @@
 
 package org.apache.doris.datasource.property.storage;
 
+import org.apache.doris.catalog.S3StorageVault;
+import org.apache.doris.cloud.proto.Cloud.CredProviderTypePB;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.ExceptionChecker;
 import org.apache.doris.common.UserException;
+import org.apache.doris.thrift.TCredProviderType;
+import org.apache.doris.thrift.TS3StorageParam;
 
 import com.google.common.collect.Maps;
 import org.junit.jupiter.api.Assertions;
@@ -260,6 +264,34 @@ public class S3PropertiesTest {
         Assertions.assertNull(backendProperties.get("AWS_EXTERNAL_ID"));
     }
 
+    @Test
+    public void testS3IamRoleCredentialsProviderTypeForCloudAndThrift() {
+        origProps.put("s3.endpoint", "s3.us-west-2.amazonaws.com");
+        origProps.put("s3.region", "us-west-2");
+        origProps.put("s3.bucket", "bucket");
+        origProps.put("s3.root.path", "root");
+        origProps.put("s3.role_arn", 
"arn:aws:iam::123456789012:role/MyTestRole");
+
+        Assertions.assertEquals(CredProviderTypePB.INSTANCE_PROFILE,
+                
S3Properties.getObjStoreInfoPB(origProps).getCredProviderType());
+        TS3StorageParam s3StorageParam = 
S3Properties.getS3TStorageParam(origProps);
+        Assertions.assertEquals(TCredProviderType.INSTANCE_PROFILE, 
s3StorageParam.getCredProviderType());
+
+        origProps.put("s3.credentials_provider_type", "container");
+        Assertions.assertEquals(CredProviderTypePB.CONTAINER,
+                
S3Properties.getObjStoreInfoPB(origProps).getCredProviderType());
+        s3StorageParam = S3Properties.getS3TStorageParam(origProps);
+        Assertions.assertEquals(TCredProviderType.CONTAINER, 
s3StorageParam.getCredProviderType());
+
+        origProps.remove("s3.credentials_provider_type");
+        origProps.put("AWS_CREDENTIALS_PROVIDER_TYPE", "env");
+        Assertions.assertEquals(CredProviderTypePB.ENV,
+                
S3Properties.getObjStoreInfoPB(origProps).getCredProviderType());
+        s3StorageParam = S3Properties.getS3TStorageParam(origProps);
+        Assertions.assertEquals(TCredProviderType.ENV, 
s3StorageParam.getCredProviderType());
+        
Assertions.assertTrue(S3StorageVault.ALLOW_ALTER_PROPERTIES.contains(S3Properties.CREDENTIALS_PROVIDER_TYPE));
+    }
+
 
     @Test
     public void testGetAwsCredentialsProviderWithIamRoleAndExternalId() {
diff --git a/gensrc/proto/cloud.proto b/gensrc/proto/cloud.proto
index 710a0b0dd79..d16f30cb53f 100644
--- a/gensrc/proto/cloud.proto
+++ b/gensrc/proto/cloud.proto
@@ -269,6 +269,11 @@ enum CredProviderTypePB {
     DEFAULT = 1;    // DefaultAWSCredentialsProviderChain
     SIMPLE = 2;     // SimpleAWSCredentialsProvider, corresponding to (ak, sk)
     INSTANCE_PROFILE = 3;  // InstanceProfileCredentialsProvider
+    ENV = 4;  // EnvironmentAWSCredentialsProvider
+    SYSTEM_PROPERTIES = 5;  // SystemPropertiesCredentialsProvider
+    WEB_IDENTITY = 6;  // STSAssumeRoleWebIdentityCredentialsProvider
+    CONTAINER = 7;  // TaskRoleCredentialsProvider
+    ANONYMOUS = 8;  // AnonymousAWSCredentialsProvider
 }
 
 message ObjectStoreInfoPB {
diff --git a/gensrc/thrift/AgentService.thrift 
b/gensrc/thrift/AgentService.thrift
index de1354f4de3..663e5376f9f 100644
--- a/gensrc/thrift/AgentService.thrift
+++ b/gensrc/thrift/AgentService.thrift
@@ -92,7 +92,12 @@ enum TCredProviderType {
     // used for creating different credentials provider when creating s3client
     DEFAULT = 0,  // DefaultAWSCredentialsProviderChain
     SIMPLE = 1,  // SimpleAWSCredentialsProvider, corresponding to (ak, sk)
-    INSTANCE_PROFILE = 2  // InstanceProfileCredentialsProvider
+    INSTANCE_PROFILE = 2,  // InstanceProfileCredentialsProvider
+    ENV = 3,  // EnvironmentAWSCredentialsProvider
+    SYSTEM_PROPERTIES = 4,  // SystemPropertiesCredentialsProvider
+    WEB_IDENTITY = 5,  // STSAssumeRoleWebIdentityCredentialsProvider
+    CONTAINER = 6,  // TaskRoleCredentialsProvider
+    ANONYMOUS = 7  // AnonymousAWSCredentialsProvider
 }
 
 struct TS3StorageParam {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to