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

yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new f03c9e41ccf branch-4.0: [fix](s3)Use anonymous credentials for 
S3-compatible storage when credentials are absent #60443 (#60613)
f03c9e41ccf is described below

commit f03c9e41ccf9073365d2e10108d1a0082c032f48
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Feb 10 21:26:21 2026 +0800

    branch-4.0: [fix](s3)Use anonymous credentials for S3-compatible storage 
when credentials are absent #60443 (#60613)
    
    Cherry-picked from #60443
    
    Co-authored-by: Calvin Kirs <[email protected]>
---
 .../storage/AbstractS3CompatibleProperties.java    | 12 +++++++++++
 .../datasource/property/storage/S3Properties.java  | 10 ++++-----
 .../property/storage/COSPropertiesTest.java        |  4 ++++
 .../property/storage/OBSPropertyTest.java          |  4 ++++
 .../property/storage/OSSPropertiesTest.java        |  4 ++++
 .../property/storage/S3PropertiesTest.java         | 25 ++++++++++++++++++++++
 6 files changed, 54 insertions(+), 5 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/AbstractS3CompatibleProperties.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/AbstractS3CompatibleProperties.java
index 9c5c01a2b3a..f8f7f6fad6c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/AbstractS3CompatibleProperties.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/AbstractS3CompatibleProperties.java
@@ -18,6 +18,7 @@
 package org.apache.doris.datasource.property.storage;
 
 import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.property.common.AwsCredentialsProviderMode;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
@@ -108,9 +109,20 @@ public abstract class AbstractS3CompatibleProperties 
extends StorageProperties i
         if (StringUtils.isNotBlank(getSessionToken())) {
             s3Props.put("AWS_TOKEN", getSessionToken());
         }
+        String credentialsProviderType = 
getAwsCredentialsProviderTypeForBackend();
+        if (StringUtils.isNotBlank(credentialsProviderType)) {
+            s3Props.put("AWS_CREDENTIALS_PROVIDER_TYPE", 
credentialsProviderType);
+        }
         return s3Props;
     }
 
+    protected String getAwsCredentialsProviderTypeForBackend() {
+        if (StringUtils.isBlank(getAccessKey()) && 
StringUtils.isBlank(getSecretKey())) {
+            return AwsCredentialsProviderMode.ANONYMOUS.name();
+        }
+        return null;
+    }
+
     @Override
     public Map<String, String> getBackendConfigProperties() {
         return generateBackendS3Configuration();
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 63cfe478a0e..df09803be61 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
@@ -291,13 +291,14 @@ public class S3Properties extends 
AbstractS3CompatibleProperties {
         if (StringUtils.isNotBlank(s3ExternalId)) {
             backendProperties.put("AWS_EXTERNAL_ID", s3ExternalId);
         }
-        // Pass credentials provider type to BE
-        if (awsCredentialsProviderMode != null) {
-            backendProperties.put("AWS_CREDENTIALS_PROVIDER_TYPE", 
awsCredentialsProviderMode.getMode());
-        }
         return backendProperties;
     }
 
+    @Override
+    protected String getAwsCredentialsProviderTypeForBackend() {
+        return awsCredentialsProviderMode == null ? null : 
awsCredentialsProviderMode.getMode();
+    }
+
     private void convertGlueToS3EndpointIfNeeded() {
         if (this.endpoint.contains("glue")) {
             this.endpoint = "https://s3."; + this.region + ".amazonaws.com";
@@ -671,4 +672,3 @@ public class S3Properties extends 
AbstractS3CompatibleProperties {
     }
 
 }
-
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/COSPropertiesTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/COSPropertiesTest.java
index d4b0277c946..de919e723c5 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/COSPropertiesTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/COSPropertiesTest.java
@@ -173,10 +173,14 @@ public class COSPropertiesTest {
         props.put("cos.endpoint", "cos.ap-beijing.myqcloud.com");
         COSProperties obsStorageProperties = (COSProperties) 
StorageProperties.createPrimary(props);
         Assertions.assertEquals(AnonymousCredentialsProvider.class, 
obsStorageProperties.getAwsCredentialsProvider().getClass());
+        Map<String, String> backendProps = 
obsStorageProperties.getBackendConfigProperties();
+        Assertions.assertEquals("ANONYMOUS", 
backendProps.get("AWS_CREDENTIALS_PROVIDER_TYPE"));
         props.put("cos.access_key", "myAccessKey");
         props.put("cos.secret_key", "mySecretKey");
         obsStorageProperties = (COSProperties) 
StorageProperties.createPrimary(props);
         Assertions.assertEquals(StaticCredentialsProvider.class, 
obsStorageProperties.getAwsCredentialsProvider().getClass());
+        backendProps = obsStorageProperties.getBackendConfigProperties();
+        
Assertions.assertNull(backendProps.get("AWS_CREDENTIALS_PROVIDER_TYPE"));
     }
 
     @Test
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OBSPropertyTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OBSPropertyTest.java
index 06c2b36cf7d..f08168965d2 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OBSPropertyTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OBSPropertyTest.java
@@ -149,10 +149,14 @@ public class OBSPropertyTest {
         props.put("obs.endpoint", "obs.cn-north-4.myhuaweicloud.com");
         OBSProperties obsStorageProperties = (OBSProperties) 
StorageProperties.createPrimary(props);
         Assertions.assertEquals(AnonymousCredentialsProvider.class, 
obsStorageProperties.getAwsCredentialsProvider().getClass());
+        Map<String, String> backendProps = 
obsStorageProperties.getBackendConfigProperties();
+        Assertions.assertEquals("ANONYMOUS", 
backendProps.get("AWS_CREDENTIALS_PROVIDER_TYPE"));
         props.put("obs.access_key", "myAccessKey");
         props.put("obs.secret_key", "mySecretKey");
         obsStorageProperties = (OBSProperties) 
StorageProperties.createPrimary(props);
         Assertions.assertEquals(StaticCredentialsProvider.class, 
obsStorageProperties.getAwsCredentialsProvider().getClass());
+        backendProps = obsStorageProperties.getBackendConfigProperties();
+        
Assertions.assertNull(backendProps.get("AWS_CREDENTIALS_PROVIDER_TYPE"));
     }
 
     @Test
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OSSPropertiesTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OSSPropertiesTest.java
index 4be6414ae01..912f20b3144 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OSSPropertiesTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OSSPropertiesTest.java
@@ -246,10 +246,14 @@ public class OSSPropertiesTest {
         ossProps.put("oss.endpoint", "oss-cn-hangzhou.aliyuncs.com");
         OSSProperties ossStorageProperties = (OSSProperties) 
StorageProperties.createPrimary(ossProps);
         Assertions.assertEquals(AnonymousCredentialsProvider.class, 
ossStorageProperties.getAwsCredentialsProvider().getClass());
+        Map<String, String> backendProps = 
ossStorageProperties.getBackendConfigProperties();
+        Assertions.assertEquals("ANONYMOUS", 
backendProps.get("AWS_CREDENTIALS_PROVIDER_TYPE"));
         ossProps.put("oss.access_key", "myAccessKey");
         ossProps.put("oss.secret_key", "mySecretKey");
         ossStorageProperties = (OSSProperties) 
StorageProperties.createPrimary(ossProps);
         Assertions.assertEquals(StaticCredentialsProvider.class, 
ossStorageProperties.getAwsCredentialsProvider().getClass());
+        backendProps = ossStorageProperties.getBackendConfigProperties();
+        
Assertions.assertNull(backendProps.get("AWS_CREDENTIALS_PROVIDER_TYPE"));
     }
 
     @Test
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 1882019127c..aa1c95b433d 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
@@ -149,6 +149,7 @@ public class S3PropertiesTest {
         Assertions.assertEquals("88", s3Props.get("AWS_MAX_CONNECTIONS"));
         Assertions.assertEquals("6000", 
s3Props.get("AWS_CONNECTION_TIMEOUT_MS"));
         Assertions.assertEquals("true", s3Props.get("use_path_style"));
+        Assertions.assertEquals("DEFAULT", 
s3Props.get("AWS_CREDENTIALS_PROVIDER_TYPE"));
         origProps.remove("use_path_style");
         origProps.remove("s3.connection.maximum");
         origProps.remove("s3.connection.timeout");
@@ -159,6 +160,30 @@ public class S3PropertiesTest {
         Assertions.assertEquals("6000", 
s3Props.get("AWS_CONNECTION_TIMEOUT_MS"));
     }
 
+    @Test
+    public void testBackendCredentialsProviderType() throws UserException {
+        Map<String, String> props = new HashMap<>();
+        props.put("s3.endpoint", "s3.us-west-2.amazonaws.com");
+        props.put("s3.region", "us-west-2");
+
+        String[][] cases = new String[][] {
+                {"default", "DEFAULT"},
+                {"env", "ENV"},
+                {"system_properties", "SYSTEM_PROPERTIES"},
+                {"web_identity", "WEB_IDENTITY"},
+                {"container", "CONTAINER"},
+                {"instance_profile", "INSTANCE_PROFILE"},
+                {"anonymous", "ANONYMOUS"}
+        };
+
+        for (String[] testCase : cases) {
+            props.put("s3.credentials_provider_type", testCase[0]);
+            S3Properties s3Props = (S3Properties) 
StorageProperties.createPrimary(props);
+            Map<String, String> backendProps = 
s3Props.getBackendConfigProperties();
+            Assertions.assertEquals(testCase[1], 
backendProps.get("AWS_CREDENTIALS_PROVIDER_TYPE"));
+        }
+    }
+
 
     @Test
     public void testGetRegion() throws UserException {


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

Reply via email to