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

acosentino pushed a commit to branch aws-common-proposal
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e458e87dd11b962a3872acc11fcacc8cfff171e9
Author: Andrea Cosentino <[email protected]>
AuthorDate: Mon Dec 15 11:43:51 2025 +0100

    Camel-AWS: Extract common logic for clients in a separated module - AWS S3 
implementation
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 bom/camel-bom/pom.xml                              |   5 +
 catalog/camel-allcomponents/pom.xml                |   5 +
 .../{camel-aws2-s3 => camel-aws-common}/pom.xml    |  45 ++---
 .../services/org/apache/camel/other.properties     |   7 +
 .../src/generated/resources/aws-common.json        |  15 ++
 .../component/aws/common/AwsClientBuilderUtil.java | 207 +++++++++++++++++++++
 .../aws/common/AwsCommonConfiguration.java         | 112 +++++++++++
 components/camel-aws/camel-aws2-s3/pom.xml         |   4 +
 .../component/aws2/s3/AWS2S3Configuration.java     |   3 +-
 .../camel/component/aws2/s3/AWS2S3Endpoint.java    |   2 +-
 .../aws2/s3/client/AWS2CamelS3InternalClient.java  |  32 ----
 .../aws2/s3/client/AWS2S3ClientFactory.java        |  34 ++--
 .../client/impl/AWS2S3ClientIAMOptimizedImpl.java  |  96 ----------
 .../impl/AWS2S3ClientIAMProfileOptimizedImpl.java  | 111 -----------
 .../client/impl/AWS2S3ClientSessionTokenImpl.java  | 114 ------------
 .../s3/client/impl/AWS2S3ClientStandardImpl.java   | 112 -----------
 .../component/aws2/s3/AWSS3ClientFactoryTest.java  |  57 +++---
 components/camel-aws/pom.xml                       |   1 +
 .../modules/others/examples/json/aws-common.json   |   1 +
 parent/pom.xml                                     |   5 +
 20 files changed, 424 insertions(+), 544 deletions(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 229266c9394e..643a971175b6 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -136,6 +136,11 @@
         <artifactId>camel-aws-cloudtrail</artifactId>
         <version>4.17.0-SNAPSHOT</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-aws-common</artifactId>
+        <version>4.17.0-SNAPSHOT</version>
+      </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
         <artifactId>camel-aws-config</artifactId>
diff --git a/catalog/camel-allcomponents/pom.xml 
b/catalog/camel-allcomponents/pom.xml
index 073ce53c6698..6483ad8378df 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -136,6 +136,11 @@
             <artifactId>camel-aws-cloudtrail</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-aws-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-aws-config</artifactId>
diff --git a/components/camel-aws/camel-aws2-s3/pom.xml 
b/components/camel-aws/camel-aws-common/pom.xml
similarity index 67%
copy from components/camel-aws/camel-aws2-s3/pom.xml
copy to components/camel-aws/camel-aws-common/pom.xml
index 12364fdd7f6e..5b4c0e1d1b97 100644
--- a/components/camel-aws/camel-aws2-s3/pom.xml
+++ b/components/camel-aws/camel-aws-common/pom.xml
@@ -18,6 +18,7 @@
 
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
@@ -26,13 +27,14 @@
         <version>4.17.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>camel-aws2-s3</artifactId>
+    <artifactId>camel-aws-common</artifactId>
     <packaging>jar</packaging>
-
-    <name>Camel :: AWS2 S3</name>
-    <description>Consume files and upload files through AWS S3 
Service</description>
+    <name>Camel :: AWS :: Common</name>
+    <description>Camel AWS Common utilities for client 
initialization</description>
 
     <properties>
+        <firstVersion>4.17.0</firstVersion>
+        <label>cloud,aws</label>
     </properties>
 
     <dependencies>
@@ -42,48 +44,29 @@
         </dependency>
         <dependency>
             <groupId>software.amazon.awssdk</groupId>
-            <artifactId>s3</artifactId>
+            <artifactId>apache-client</artifactId>
             <version>${aws-java-sdk2-version}</version>
         </dependency>
         <dependency>
             <groupId>software.amazon.awssdk</groupId>
-            <artifactId>checksums</artifactId>
+            <artifactId>auth</artifactId>
             <version>${aws-java-sdk2-version}</version>
         </dependency>
         <dependency>
             <groupId>software.amazon.awssdk</groupId>
-            <artifactId>sts</artifactId>
+            <artifactId>regions</artifactId>
             <version>${aws-java-sdk2-version}</version>
         </dependency>
         <dependency>
             <groupId>software.amazon.awssdk</groupId>
-            <artifactId>apache-client</artifactId>
+            <artifactId>sdk-core</artifactId>
             <version>${aws-java-sdk2-version}</version>
         </dependency>
         <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-health</artifactId>
-        </dependency>
-
-        <!-- for testing -->
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-test-spring-junit5</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-zip-deflater</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- test infra -->
-       <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-test-infra-aws-v2</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>aws-core</artifactId>
+            <version>${aws-java-sdk2-version}</version>
         </dependency>
     </dependencies>
+
 </project>
diff --git 
a/components/camel-aws/camel-aws-common/src/generated/resources/META-INF/services/org/apache/camel/other.properties
 
b/components/camel-aws/camel-aws-common/src/generated/resources/META-INF/services/org/apache/camel/other.properties
new file mode 100644
index 000000000000..cac64086e8f1
--- /dev/null
+++ 
b/components/camel-aws/camel-aws-common/src/generated/resources/META-INF/services/org/apache/camel/other.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+name=aws-common
+groupId=org.apache.camel
+artifactId=camel-aws-common
+version=4.17.0-SNAPSHOT
+projectName=Camel :: AWS :: Common
+projectDescription=Camel AWS Common utilities for client initialization
diff --git 
a/components/camel-aws/camel-aws-common/src/generated/resources/aws-common.json 
b/components/camel-aws/camel-aws-common/src/generated/resources/aws-common.json
new file mode 100644
index 000000000000..5355c49bf792
--- /dev/null
+++ 
b/components/camel-aws/camel-aws-common/src/generated/resources/aws-common.json
@@ -0,0 +1,15 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "aws-common",
+    "title": "Aws Common",
+    "description": "Camel AWS Common utilities for client initialization",
+    "deprecated": false,
+    "firstVersion": "4.17.0",
+    "label": "cloud,aws",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws-common",
+    "version": "4.17.0-SNAPSHOT"
+  }
+}
diff --git 
a/components/camel-aws/camel-aws-common/src/main/java/org/apache/camel/component/aws/common/AwsClientBuilderUtil.java
 
b/components/camel-aws/camel-aws-common/src/main/java/org/apache/camel/component/aws/common/AwsClientBuilderUtil.java
new file mode 100644
index 000000000000..00858a7ae496
--- /dev/null
+++ 
b/components/camel-aws/camel-aws-common/src/main/java/org/apache/camel/component/aws/common/AwsClientBuilderUtil.java
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.common;
+
+import java.net.URI;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
+import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
+import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
+import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
+import software.amazon.awssdk.core.SdkClient;
+import software.amazon.awssdk.core.client.builder.SdkSyncClientBuilder;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.SdkHttpConfigurationOption;
+import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.utils.AttributeMap;
+
+/**
+ * Utility class for building AWS SDK clients with common configuration.
+ * <p>
+ * This class eliminates code duplication across all AWS Camel components by 
providing a centralized way to configure
+ * AWS clients with credentials, proxy, region, endpoint, and other common 
settings.
+ * </p>
+ */
+public final class AwsClientBuilderUtil {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(AwsClientBuilderUtil.class);
+
+    private AwsClientBuilderUtil() {
+    }
+
+    /**
+     * Build an AWS client with the given configuration.
+     *
+     * @param  config                The common AWS configuration
+     * @param  builderSupplier       Supplier for the service-specific client 
builder (e.g., S3Client::builder)
+     * @param  serviceSpecificConfig Optional consumer for service-specific 
configuration (e.g., S3's forcePathStyle)
+     * @param  <B>                   The builder type (must extend both 
AwsClientBuilder and SdkSyncClientBuilder)
+     * @param  <C>                   The client type
+     * @return                       The configured AWS client
+     */
+    @SuppressWarnings("unchecked")
+    public static <B extends AwsClientBuilder<B, C> & SdkSyncClientBuilder<B, 
C>, C extends SdkClient> C buildClient(
+            AwsCommonConfiguration config,
+            Supplier<B> builderSupplier,
+            Consumer<B> serviceSpecificConfig) {
+
+        B clientBuilder = builderSupplier.get();
+        ApacheHttpClient.Builder httpClientBuilder = null;
+        boolean httpClientConfigured = false;
+
+        // 1. Configure proxy
+        if (ObjectHelper.isNotEmpty(config.getProxyHost())
+                && ObjectHelper.isNotEmpty(config.getProxyPort())) {
+            LOG.trace("Configuring proxy: {}:{}", config.getProxyHost(), 
config.getProxyPort());
+            URI proxyEndpoint = URI.create(
+                    config.getProxyProtocol() + "://" + config.getProxyHost() 
+ ":" + config.getProxyPort());
+            ProxyConfiguration proxyConfig = ProxyConfiguration.builder()
+                    .endpoint(proxyEndpoint)
+                    .build();
+            httpClientBuilder = 
ApacheHttpClient.builder().proxyConfiguration(proxyConfig);
+            httpClientConfigured = true;
+        }
+
+        // 2. Configure credentials
+        AwsCredentialsProvider credentialsProvider = 
resolveCredentialsProvider(config);
+        if (credentialsProvider != null) {
+            clientBuilder.credentialsProvider(credentialsProvider);
+        }
+
+        // 3. Apply HTTP client builder if configured (before trust all certs 
check)
+        if (httpClientConfigured) {
+            clientBuilder.httpClientBuilder(httpClientBuilder);
+        }
+
+        // 4. Configure region
+        if (ObjectHelper.isNotEmpty(config.getRegion())) {
+            clientBuilder.region(Region.of(config.getRegion()));
+        }
+
+        // 5. Configure endpoint override
+        if (config.isOverrideEndpoint() && 
ObjectHelper.isNotEmpty(config.getUriEndpointOverride())) {
+            
clientBuilder.endpointOverride(URI.create(config.getUriEndpointOverride()));
+        }
+
+        // 6. Configure trust all certificates
+        if (config.isTrustAllCertificates()) {
+            if (httpClientBuilder == null) {
+                httpClientBuilder = ApacheHttpClient.builder();
+            }
+            SdkHttpClient httpClient = httpClientBuilder.buildWithDefaults(
+                    AttributeMap.builder()
+                            
.put(SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES, Boolean.TRUE)
+                            .build());
+            clientBuilder.httpClient(httpClient);
+            clientBuilder.httpClientBuilder(null);
+        }
+
+        // 7. Apply service-specific configuration
+        if (serviceSpecificConfig != null) {
+            serviceSpecificConfig.accept(clientBuilder);
+        }
+
+        return clientBuilder.build();
+    }
+
+    /**
+     * Build an AWS client with the given configuration, without 
service-specific configuration.
+     *
+     * @param  config          The common AWS configuration
+     * @param  builderSupplier Supplier for the service-specific client builder
+     * @param  <B>             The builder type
+     * @param  <C>             The client type
+     * @return                 The configured AWS client
+     */
+    public static <B extends AwsClientBuilder<B, C> & SdkSyncClientBuilder<B, 
C>, C extends SdkClient> C buildClient(
+            AwsCommonConfiguration config,
+            Supplier<B> builderSupplier) {
+        return buildClient(config, builderSupplier, null);
+    }
+
+    /**
+     * Resolve the appropriate credentials provider based on configuration.
+     * <p>
+     * The priority order is:
+     * <ol>
+     * <li>Default credentials provider (IAM roles, environment variables, 
etc.)</li>
+     * <li>Profile credentials provider</li>
+     * <li>Session credentials (temporary credentials with session token)</li>
+     * <li>Static credentials (access key + secret key)</li>
+     * </ol>
+     * </p>
+     *
+     * @param  config The AWS configuration
+     * @return        The resolved credentials provider, or null to use SDK 
default chain
+     */
+    private static AwsCredentialsProvider 
resolveCredentialsProvider(AwsCommonConfiguration config) {
+
+        // Priority 1: Default credentials provider (IAM roles, env vars, etc.)
+        if (Boolean.TRUE.equals(config.isUseDefaultCredentialsProvider())) {
+            LOG.trace("Using default credentials provider (IAM)");
+            return DefaultCredentialsProvider.create();
+        }
+
+        // Priority 2: Profile credentials provider
+        if (config.isUseProfileCredentialsProvider()) {
+            String profileName = config.getProfileCredentialsName();
+            LOG.trace("Using profile credentials provider: {}", profileName);
+            if (ObjectHelper.isNotEmpty(profileName)) {
+                return ProfileCredentialsProvider.create(profileName);
+            }
+            return ProfileCredentialsProvider.create();
+        }
+
+        // Priority 3: Session credentials (temporary credentials with session 
token)
+        if (config.isUseSessionCredentials()) {
+            if (ObjectHelper.isNotEmpty(config.getAccessKey())
+                    && ObjectHelper.isNotEmpty(config.getSecretKey())
+                    && ObjectHelper.isNotEmpty(config.getSessionToken())) {
+                LOG.trace("Using session credentials");
+                AwsSessionCredentials sessionCredentials = 
AwsSessionCredentials.create(
+                        config.getAccessKey(),
+                        config.getSecretKey(),
+                        config.getSessionToken());
+                return StaticCredentialsProvider.create(sessionCredentials);
+            }
+        }
+
+        // Priority 4: Static credentials (access key + secret key)
+        if (ObjectHelper.isNotEmpty(config.getAccessKey())
+                && ObjectHelper.isNotEmpty(config.getSecretKey())) {
+            LOG.trace("Using static credentials");
+            AwsBasicCredentials basicCredentials = AwsBasicCredentials.create(
+                    config.getAccessKey(),
+                    config.getSecretKey());
+            return StaticCredentialsProvider.create(basicCredentials);
+        }
+
+        // No explicit credentials - let SDK use its default chain
+        LOG.trace("No explicit credentials configured, using SDK default 
chain");
+        return null;
+    }
+}
diff --git 
a/components/camel-aws/camel-aws-common/src/main/java/org/apache/camel/component/aws/common/AwsCommonConfiguration.java
 
b/components/camel-aws/camel-aws-common/src/main/java/org/apache/camel/component/aws/common/AwsCommonConfiguration.java
new file mode 100644
index 000000000000..61295244a9db
--- /dev/null
+++ 
b/components/camel-aws/camel-aws-common/src/main/java/org/apache/camel/component/aws/common/AwsCommonConfiguration.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws.common;
+
+import software.amazon.awssdk.core.Protocol;
+
+/**
+ * Common configuration interface for all AWS components.
+ * <p>
+ * Each AWS component's Configuration class should implement this interface to 
enable use of the common
+ * {@link AwsClientBuilderUtil} for client creation.
+ * </p>
+ */
+public interface AwsCommonConfiguration {
+
+    // ==================== Credentials - Static ====================
+
+    /**
+     * Amazon AWS Access Key.
+     */
+    String getAccessKey();
+
+    /**
+     * Amazon AWS Secret Key.
+     */
+    String getSecretKey();
+
+    /**
+     * Amazon AWS Session Token used when the user needs to assume an IAM role.
+     */
+    String getSessionToken();
+
+    // ==================== Credentials - Provider Selection 
====================
+
+    /**
+     * Set whether the client should expect to load credentials through a 
default credentials provider.
+     */
+    Boolean isUseDefaultCredentialsProvider();
+
+    /**
+     * Set whether the client should expect to load credentials through a 
profile credentials provider.
+     */
+    boolean isUseProfileCredentialsProvider();
+
+    /**
+     * Set whether the client should expect to use Session Credentials. This 
is useful in a situation in which the user
+     * needs to assume an IAM role.
+     */
+    boolean isUseSessionCredentials();
+
+    /**
+     * If using a profile credentials provider, this parameter specifies the 
profile name.
+     */
+    String getProfileCredentialsName();
+
+    // ==================== Proxy Configuration ====================
+
+    /**
+     * To define a proxy protocol when instantiating the client.
+     */
+    Protocol getProxyProtocol();
+
+    /**
+     * To define a proxy host when instantiating the client.
+     */
+    String getProxyHost();
+
+    /**
+     * Specify a proxy port to be used inside the client definition.
+     */
+    Integer getProxyPort();
+
+    // ==================== Region and Endpoint ====================
+
+    /**
+     * The region in which the client needs to work. When using this 
parameter, the configuration will expect the
+     * lowercase name of the region (for example, ap-east-1).
+     */
+    String getRegion();
+
+    /**
+     * Set the need for overriding the endpoint. This option needs to be used 
in combination with the
+     * uriEndpointOverride option.
+     */
+    boolean isOverrideEndpoint();
+
+    /**
+     * Set the overriding URI endpoint. This option needs to be used in 
combination with overrideEndpoint option.
+     */
+    String getUriEndpointOverride();
+
+    // ==================== Security ====================
+
+    /**
+     * If we want to trust all certificates in case of overriding the endpoint.
+     */
+    boolean isTrustAllCertificates();
+}
diff --git a/components/camel-aws/camel-aws2-s3/pom.xml 
b/components/camel-aws/camel-aws2-s3/pom.xml
index 12364fdd7f6e..86a575c8857b 100644
--- a/components/camel-aws/camel-aws2-s3/pom.xml
+++ b/components/camel-aws/camel-aws2-s3/pom.xml
@@ -36,6 +36,10 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-aws-common</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-support</artifactId>
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Configuration.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Configuration.java
index 86a2adfa2753..039572e79f9f 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Configuration.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Configuration.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.aws2.s3;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.aws.common.AwsCommonConfiguration;
 import org.apache.camel.component.aws2.s3.stream.AWSS3NamingStrategyEnum;
 import org.apache.camel.component.aws2.s3.stream.AWSS3RestartingPolicyEnum;
 import org.apache.camel.spi.Metadata;
@@ -28,7 +29,7 @@ import software.amazon.awssdk.services.s3.S3Client;
 import software.amazon.awssdk.services.s3.presigner.S3Presigner;
 
 @UriParams
-public class AWS2S3Configuration implements Cloneable {
+public class AWS2S3Configuration implements Cloneable, AwsCommonConfiguration {
 
     private String bucketName;
     @UriParam(label = "advanced")
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Endpoint.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Endpoint.java
index 06c174ed3782..614d1143ea95 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Endpoint.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Endpoint.java
@@ -132,7 +132,7 @@ public class AWS2S3Endpoint extends ScheduledPollEndpoint 
implements EndpointSer
         super.doStart();
 
         s3Client = configuration.getAmazonS3Client() != null
-                ? configuration.getAmazonS3Client() : 
AWS2S3ClientFactory.getAWSS3Client(configuration).getS3Client();
+                ? configuration.getAmazonS3Client() : 
AWS2S3ClientFactory.getS3Client(configuration);
 
         String fileName = getConfiguration().getFileName();
 
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2CamelS3InternalClient.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2CamelS3InternalClient.java
deleted file mode 100644
index 3c45ce9dca3d..000000000000
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2CamelS3InternalClient.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.aws2.s3.client;
-
-import software.amazon.awssdk.services.s3.S3Client;
-
-/**
- * Manage the required actions of an s3 client for either local or remote.
- */
-public interface AWS2CamelS3InternalClient {
-
-    /**
-     * Returns an s3 client after a factory method determines which one to 
return.
-     *
-     * @return AmazonS3 AmazonS3
-     */
-    S3Client getS3Client();
-}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2S3ClientFactory.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2S3ClientFactory.java
index 80c48033d0c3..a1e638cea303 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2S3ClientFactory.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2S3ClientFactory.java
@@ -16,14 +16,12 @@
  */
 package org.apache.camel.component.aws2.s3.client;
 
+import org.apache.camel.component.aws.common.AwsClientBuilderUtil;
 import org.apache.camel.component.aws2.s3.AWS2S3Configuration;
-import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientIAMOptimizedImpl;
-import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientIAMProfileOptimizedImpl;
-import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientSessionTokenImpl;
-import org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientStandardImpl;
+import software.amazon.awssdk.services.s3.S3Client;
 
 /**
- * Factory class to return the correct type of AWS S3 aws.
+ * Factory class to create AWS S3 clients using common configuration.
  */
 public final class AWS2S3ClientFactory {
 
@@ -31,20 +29,20 @@ public final class AWS2S3ClientFactory {
     }
 
     /**
-     * Return the correct aws s3 client (based on remote vs local).
+     * Create an S3 client based on configuration.
      *
-     * @param  configuration configuration
-     * @return               AWSS3Client
+     * @param  configuration The S3 configuration
+     * @return               Configured S3Client
      */
-    public static AWS2CamelS3InternalClient getAWSS3Client(AWS2S3Configuration 
configuration) {
-        if 
(Boolean.TRUE.equals(configuration.isUseDefaultCredentialsProvider())) {
-            return new AWS2S3ClientIAMOptimizedImpl(configuration);
-        } else if 
(Boolean.TRUE.equals(configuration.isUseProfileCredentialsProvider())) {
-            return new AWS2S3ClientIAMProfileOptimizedImpl(configuration);
-        } else if 
(Boolean.TRUE.equals(configuration.isUseSessionCredentials())) {
-            return new AWS2S3ClientSessionTokenImpl(configuration);
-        } else {
-            return new AWS2S3ClientStandardImpl(configuration);
-        }
+    public static S3Client getS3Client(AWS2S3Configuration configuration) {
+        return AwsClientBuilderUtil.buildClient(
+                configuration,
+                S3Client::builder,
+                builder -> {
+                    // S3-specific configuration
+                    if (configuration.isForcePathStyle()) {
+                        builder.forcePathStyle(true);
+                    }
+                });
     }
 }
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientIAMOptimizedImpl.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientIAMOptimizedImpl.java
deleted file mode 100644
index fa3b4b68fb7a..000000000000
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientIAMOptimizedImpl.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.aws2.s3.client.impl;
-
-import java.net.URI;
-
-import org.apache.camel.component.aws2.s3.AWS2S3Configuration;
-import org.apache.camel.component.aws2.s3.client.AWS2CamelS3InternalClient;
-import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import software.amazon.awssdk.http.SdkHttpClient;
-import software.amazon.awssdk.http.SdkHttpConfigurationOption;
-import software.amazon.awssdk.http.apache.ApacheHttpClient;
-import software.amazon.awssdk.http.apache.ProxyConfiguration;
-import software.amazon.awssdk.regions.Region;
-import software.amazon.awssdk.services.s3.S3Client;
-import software.amazon.awssdk.services.s3.S3ClientBuilder;
-import software.amazon.awssdk.utils.AttributeMap;
-
-/**
- * Manage an AWS s3 client for all users to use (enabling temporary creds). 
This implementation is for remote instances
- * to manage the credentials on their own (eliminating credential rotations)
- */
-public class AWS2S3ClientIAMOptimizedImpl implements AWS2CamelS3InternalClient 
{
-    private static final Logger LOG = 
LoggerFactory.getLogger(AWS2S3ClientIAMOptimizedImpl.class);
-    private AWS2S3Configuration configuration;
-
-    /**
-     * Constructor that uses the config file.
-     */
-    public AWS2S3ClientIAMOptimizedImpl(AWS2S3Configuration configuration) {
-        LOG.trace("Creating an AWS S3 client for an ec2 instance with IAM 
temporary credentials (normal for ec2s).");
-        this.configuration = configuration;
-    }
-
-    /**
-     * Getting the s3 aws client that is used.
-     *
-     * @return Amazon S3 Client.
-     */
-    @Override
-    public S3Client getS3Client() {
-        S3Client client = null;
-        S3ClientBuilder clientBuilder = S3Client.builder();
-        ProxyConfiguration.Builder proxyConfig = null;
-        ApacheHttpClient.Builder httpClientBuilder = null;
-        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && 
ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
-            proxyConfig = ProxyConfiguration.builder();
-            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + 
"://" + configuration.getProxyHost() + ":"
-                                           + configuration.getProxyPort());
-            proxyConfig.endpoint(proxyEndpoint);
-            httpClientBuilder = 
ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
-            clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder);
-        }
-        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
-            clientBuilder = 
clientBuilder.region(Region.of(configuration.getRegion()));
-        }
-        if (configuration.isOverrideEndpoint()) {
-            
clientBuilder.endpointOverride(URI.create(configuration.getUriEndpointOverride()));
-        }
-        if (configuration.isForcePathStyle()) {
-            clientBuilder.forcePathStyle(true);
-        }
-        if (configuration.isTrustAllCertificates()) {
-            if (httpClientBuilder == null) {
-                httpClientBuilder = ApacheHttpClient.builder();
-            }
-            SdkHttpClient ahc = 
httpClientBuilder.buildWithDefaults(AttributeMap
-                    .builder()
-                    .put(
-                            SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES,
-                            Boolean.TRUE)
-                    .build());
-            // set created http client to use instead of builder
-            clientBuilder.httpClient(ahc);
-            clientBuilder.httpClientBuilder(null);
-        }
-        client = clientBuilder.build();
-        return client;
-    }
-}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientIAMProfileOptimizedImpl.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientIAMProfileOptimizedImpl.java
deleted file mode 100644
index 5047471c8b7b..000000000000
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientIAMProfileOptimizedImpl.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.aws2.s3.client.impl;
-
-import java.net.URI;
-
-import org.apache.camel.component.aws2.s3.AWS2S3Configuration;
-import org.apache.camel.component.aws2.s3.client.AWS2CamelS3InternalClient;
-import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
-import software.amazon.awssdk.http.SdkHttpClient;
-import software.amazon.awssdk.http.SdkHttpConfigurationOption;
-import software.amazon.awssdk.http.apache.ApacheHttpClient;
-import software.amazon.awssdk.http.apache.ProxyConfiguration;
-import software.amazon.awssdk.regions.Region;
-import software.amazon.awssdk.services.s3.S3Client;
-import software.amazon.awssdk.services.s3.S3ClientBuilder;
-import software.amazon.awssdk.utils.AttributeMap;
-
-/**
- * Manage an AWS s3 client for all users to use. This implementation is for 
local instances to use a static and solid
- * credential set.
- */
-public class AWS2S3ClientIAMProfileOptimizedImpl implements 
AWS2CamelS3InternalClient {
-    private static final Logger LOG = 
LoggerFactory.getLogger(AWS2S3ClientIAMProfileOptimizedImpl.class);
-    private AWS2S3Configuration configuration;
-
-    /**
-     * Constructor that uses the config file.
-     */
-    public AWS2S3ClientIAMProfileOptimizedImpl(AWS2S3Configuration 
configuration) {
-        LOG.trace("Creating an AWS S3 manager using profile credentials.");
-        this.configuration = configuration;
-    }
-
-    /**
-     * Getting the s3 aws client that is used.
-     *
-     * @return Amazon S3 Client.
-     */
-    @Override
-    public S3Client getS3Client() {
-        S3Client client = null;
-        S3ClientBuilder clientBuilder = S3Client.builder();
-        ProxyConfiguration.Builder proxyConfig = null;
-        ApacheHttpClient.Builder httpClientBuilder = null;
-        boolean isClientConfigFound = false;
-        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && 
ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
-            proxyConfig = ProxyConfiguration.builder();
-            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + 
"://" + configuration.getProxyHost() + ":"
-                                           + configuration.getProxyPort());
-            proxyConfig.endpoint(proxyEndpoint);
-            httpClientBuilder = 
ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
-            isClientConfigFound = true;
-        }
-        if (configuration.getProfileCredentialsName() != null) {
-            if (isClientConfigFound) {
-                clientBuilder = 
clientBuilder.httpClientBuilder(httpClientBuilder)
-                        
.credentialsProvider(ProfileCredentialsProvider.create(configuration.getProfileCredentialsName()));
-            } else {
-                clientBuilder = clientBuilder
-                        
.credentialsProvider(ProfileCredentialsProvider.create(configuration.getProfileCredentialsName()));
-            }
-        } else {
-            if (!isClientConfigFound) {
-                clientBuilder = 
clientBuilder.httpClientBuilder(httpClientBuilder);
-            }
-        }
-        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
-            clientBuilder = 
clientBuilder.region(Region.of(configuration.getRegion()));
-        }
-        if (configuration.isOverrideEndpoint()) {
-            
clientBuilder.endpointOverride(URI.create(configuration.getUriEndpointOverride()));
-        }
-        if (configuration.isForcePathStyle()) {
-            clientBuilder.forcePathStyle(true);
-        }
-        if (configuration.isTrustAllCertificates()) {
-            if (httpClientBuilder == null) {
-                httpClientBuilder = ApacheHttpClient.builder();
-            }
-            SdkHttpClient ahc = 
httpClientBuilder.buildWithDefaults(AttributeMap
-                    .builder()
-                    .put(
-                            SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES,
-                            Boolean.TRUE)
-                    .build());
-            // set created http client to use instead of builder
-            clientBuilder.httpClient(ahc);
-            clientBuilder.httpClientBuilder(null);
-        }
-        client = clientBuilder.build();
-        return client;
-    }
-}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientSessionTokenImpl.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientSessionTokenImpl.java
deleted file mode 100644
index 610231ef48ce..000000000000
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientSessionTokenImpl.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.aws2.s3.client.impl;
-
-import java.net.URI;
-
-import org.apache.camel.component.aws2.s3.AWS2S3Configuration;
-import org.apache.camel.component.aws2.s3.client.AWS2CamelS3InternalClient;
-import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
-import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
-import software.amazon.awssdk.http.SdkHttpClient;
-import software.amazon.awssdk.http.SdkHttpConfigurationOption;
-import software.amazon.awssdk.http.apache.ApacheHttpClient;
-import software.amazon.awssdk.http.apache.ProxyConfiguration;
-import software.amazon.awssdk.regions.Region;
-import software.amazon.awssdk.services.s3.S3Client;
-import software.amazon.awssdk.services.s3.S3ClientBuilder;
-import software.amazon.awssdk.utils.AttributeMap;
-
-/**
- * Manage an AWS s3 client for all users to use. This implementation is for 
local instances to use a static and solid
- * credential set.
- */
-public class AWS2S3ClientSessionTokenImpl implements AWS2CamelS3InternalClient 
{
-    private static final Logger LOG = 
LoggerFactory.getLogger(AWS2S3ClientSessionTokenImpl.class);
-    private AWS2S3Configuration configuration;
-
-    /**
-     * Constructor that uses the config file.
-     */
-    public AWS2S3ClientSessionTokenImpl(AWS2S3Configuration configuration) {
-        LOG.trace("Creating an AWS S3 manager using static credentials.");
-        this.configuration = configuration;
-    }
-
-    /**
-     * Getting the s3 aws client that is used.
-     *
-     * @return Amazon S3 Client.
-     */
-    @Override
-    public S3Client getS3Client() {
-        S3Client client = null;
-        S3ClientBuilder clientBuilder = S3Client.builder();
-        ProxyConfiguration.Builder proxyConfig = null;
-        ApacheHttpClient.Builder httpClientBuilder = null;
-        boolean isClientConfigFound = false;
-        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && 
ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
-            proxyConfig = ProxyConfiguration.builder();
-            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + 
"://" + configuration.getProxyHost() + ":"
-                                           + configuration.getProxyPort());
-            proxyConfig.endpoint(proxyEndpoint);
-            httpClientBuilder = 
ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
-            isClientConfigFound = true;
-        }
-        if (configuration.getAccessKey() != null && 
configuration.getSecretKey() != null
-                && configuration.getSessionToken() != null) {
-            AwsSessionCredentials cred = 
AwsSessionCredentials.create(configuration.getAccessKey(),
-                    configuration.getSecretKey(), 
configuration.getSessionToken());
-            if (isClientConfigFound) {
-                clientBuilder = 
clientBuilder.httpClientBuilder(httpClientBuilder)
-                        
.credentialsProvider(StaticCredentialsProvider.create(cred));
-            } else {
-                clientBuilder = 
clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred));
-            }
-        } else {
-            if (!isClientConfigFound) {
-                clientBuilder = 
clientBuilder.httpClientBuilder(httpClientBuilder);
-            }
-        }
-        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
-            clientBuilder = 
clientBuilder.region(Region.of(configuration.getRegion()));
-        }
-        if (configuration.isOverrideEndpoint()) {
-            
clientBuilder.endpointOverride(URI.create(configuration.getUriEndpointOverride()));
-        }
-        if (configuration.isForcePathStyle()) {
-            clientBuilder.forcePathStyle(true);
-        }
-        if (configuration.isTrustAllCertificates()) {
-            if (httpClientBuilder == null) {
-                httpClientBuilder = ApacheHttpClient.builder();
-            }
-            SdkHttpClient ahc = 
httpClientBuilder.buildWithDefaults(AttributeMap
-                    .builder()
-                    .put(
-                            SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES,
-                            Boolean.TRUE)
-                    .build());
-            // set created http client to use instead of builder
-            clientBuilder.httpClient(ahc);
-            clientBuilder.httpClientBuilder(null);
-        }
-        client = clientBuilder.build();
-        return client;
-    }
-}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientStandardImpl.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientStandardImpl.java
deleted file mode 100644
index 0b84db11c993..000000000000
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientStandardImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.aws2.s3.client.impl;
-
-import java.net.URI;
-
-import org.apache.camel.component.aws2.s3.AWS2S3Configuration;
-import org.apache.camel.component.aws2.s3.client.AWS2CamelS3InternalClient;
-import org.apache.camel.util.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
-import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
-import software.amazon.awssdk.http.SdkHttpClient;
-import software.amazon.awssdk.http.SdkHttpConfigurationOption;
-import software.amazon.awssdk.http.apache.ApacheHttpClient;
-import software.amazon.awssdk.http.apache.ProxyConfiguration;
-import software.amazon.awssdk.regions.Region;
-import software.amazon.awssdk.services.s3.S3Client;
-import software.amazon.awssdk.services.s3.S3ClientBuilder;
-import software.amazon.awssdk.utils.AttributeMap;
-
-/**
- * Manage an AWS s3 client for all users to use. This implementation is for 
local instances to use a static and solid
- * credential set.
- */
-public class AWS2S3ClientStandardImpl implements AWS2CamelS3InternalClient {
-    private static final Logger LOG = 
LoggerFactory.getLogger(AWS2S3ClientStandardImpl.class);
-    private AWS2S3Configuration configuration;
-
-    /**
-     * Constructor that uses the config file.
-     */
-    public AWS2S3ClientStandardImpl(AWS2S3Configuration configuration) {
-        LOG.trace("Creating an AWS S3 manager using static credentials.");
-        this.configuration = configuration;
-    }
-
-    /**
-     * Getting the s3 aws client that is used.
-     *
-     * @return Amazon S3 Client.
-     */
-    @Override
-    public S3Client getS3Client() {
-        S3Client client = null;
-        S3ClientBuilder clientBuilder = S3Client.builder();
-        ProxyConfiguration.Builder proxyConfig = null;
-        ApacheHttpClient.Builder httpClientBuilder = null;
-        boolean isClientConfigFound = false;
-        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && 
ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
-            proxyConfig = ProxyConfiguration.builder();
-            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + 
"://" + configuration.getProxyHost() + ":"
-                                           + configuration.getProxyPort());
-            proxyConfig.endpoint(proxyEndpoint);
-            httpClientBuilder = 
ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
-            isClientConfigFound = true;
-        }
-        if (configuration.getAccessKey() != null && 
configuration.getSecretKey() != null) {
-            AwsBasicCredentials cred = 
AwsBasicCredentials.create(configuration.getAccessKey(), 
configuration.getSecretKey());
-            if (isClientConfigFound) {
-                clientBuilder = 
clientBuilder.httpClientBuilder(httpClientBuilder)
-                        
.credentialsProvider(StaticCredentialsProvider.create(cred));
-            } else {
-                clientBuilder = 
clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred));
-            }
-        } else {
-            if (!isClientConfigFound) {
-                clientBuilder = 
clientBuilder.httpClientBuilder(httpClientBuilder);
-            }
-        }
-        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
-            clientBuilder = 
clientBuilder.region(Region.of(configuration.getRegion()));
-        }
-        if (configuration.isOverrideEndpoint()) {
-            
clientBuilder.endpointOverride(URI.create(configuration.getUriEndpointOverride()));
-        }
-        if (configuration.isForcePathStyle()) {
-            clientBuilder.forcePathStyle(true);
-        }
-        if (configuration.isTrustAllCertificates()) {
-            if (httpClientBuilder == null) {
-                httpClientBuilder = ApacheHttpClient.builder();
-            }
-            SdkHttpClient ahc = 
httpClientBuilder.buildWithDefaults(AttributeMap
-                    .builder()
-                    .put(
-                            SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES,
-                            Boolean.TRUE)
-                    .build());
-            // set created http client to use instead of builder
-            clientBuilder.httpClient(ahc);
-            clientBuilder.httpClientBuilder(null);
-        }
-        client = clientBuilder.build();
-        return client;
-    }
-}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWSS3ClientFactoryTest.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWSS3ClientFactoryTest.java
index 7a35a0282a78..c691286f7774 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWSS3ClientFactoryTest.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWSS3ClientFactoryTest.java
@@ -16,54 +16,55 @@
  */
 package org.apache.camel.component.aws2.s3;
 
-import org.apache.camel.component.aws2.s3.client.AWS2CamelS3InternalClient;
 import org.apache.camel.component.aws2.s3.client.AWS2S3ClientFactory;
-import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientIAMOptimizedImpl;
-import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientIAMProfileOptimizedImpl;
-import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientSessionTokenImpl;
-import org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientStandardImpl;
 import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.services.s3.S3Client;
 
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 public class AWSS3ClientFactoryTest {
 
     @Test
-    public void getStandardS3ClientDefault() {
+    public void getS3ClientWithDefaultCredentials() {
         AWS2S3Configuration s3Configuration = new AWS2S3Configuration();
-        AWS2CamelS3InternalClient awss3Client = 
AWS2S3ClientFactory.getAWSS3Client(s3Configuration);
-        assertTrue(awss3Client instanceof AWS2S3ClientStandardImpl);
+        s3Configuration.setUseDefaultCredentialsProvider(true);
+        s3Configuration.setRegion("eu-west-1");
+        S3Client s3Client = AWS2S3ClientFactory.getS3Client(s3Configuration);
+        assertNotNull(s3Client);
+        s3Client.close();
     }
 
     @Test
-    public void getStandardS3Client() {
+    public void getS3ClientWithStaticCredentials() {
         AWS2S3Configuration s3Configuration = new AWS2S3Configuration();
-        s3Configuration.setUseDefaultCredentialsProvider(false);
-        AWS2CamelS3InternalClient awss3Client = 
AWS2S3ClientFactory.getAWSS3Client(s3Configuration);
-        assertTrue(awss3Client instanceof AWS2S3ClientStandardImpl);
+        s3Configuration.setAccessKey("testAccessKey");
+        s3Configuration.setSecretKey("testSecretKey");
+        s3Configuration.setRegion("eu-west-1");
+        S3Client s3Client = AWS2S3ClientFactory.getS3Client(s3Configuration);
+        assertNotNull(s3Client);
+        s3Client.close();
     }
 
     @Test
-    public void getIAMOptimizedS3Client() {
+    public void getS3ClientWithForcePathStyle() {
         AWS2S3Configuration s3Configuration = new AWS2S3Configuration();
         s3Configuration.setUseDefaultCredentialsProvider(true);
-        AWS2CamelS3InternalClient awss3Client = 
AWS2S3ClientFactory.getAWSS3Client(s3Configuration);
-        assertTrue(awss3Client instanceof AWS2S3ClientIAMOptimizedImpl);
-    }
-
-    @Test
-    public void getIAMProfileOptimizedS3Client() {
-        AWS2S3Configuration s3Configuration = new AWS2S3Configuration();
-        s3Configuration.setUseProfileCredentialsProvider(true);
-        AWS2CamelS3InternalClient awss3Client = 
AWS2S3ClientFactory.getAWSS3Client(s3Configuration);
-        assertTrue(awss3Client instanceof AWS2S3ClientIAMProfileOptimizedImpl);
+        s3Configuration.setRegion("eu-west-1");
+        s3Configuration.setForcePathStyle(true);
+        S3Client s3Client = AWS2S3ClientFactory.getS3Client(s3Configuration);
+        assertNotNull(s3Client);
+        s3Client.close();
     }
 
     @Test
-    public void getSessionTokenS3Client() {
+    public void getS3ClientWithEndpointOverride() {
         AWS2S3Configuration s3Configuration = new AWS2S3Configuration();
-        s3Configuration.setUseSessionCredentials(true);
-        AWS2CamelS3InternalClient awss3Client = 
AWS2S3ClientFactory.getAWSS3Client(s3Configuration);
-        assertTrue(awss3Client instanceof AWS2S3ClientSessionTokenImpl);
+        s3Configuration.setUseDefaultCredentialsProvider(true);
+        s3Configuration.setRegion("eu-west-1");
+        s3Configuration.setOverrideEndpoint(true);
+        s3Configuration.setUriEndpointOverride("http://localhost:4566";);
+        S3Client s3Client = AWS2S3ClientFactory.getS3Client(s3Configuration);
+        assertNotNull(s3Client);
+        s3Client.close();
     }
 }
diff --git a/components/camel-aws/pom.xml b/components/camel-aws/pom.xml
index 98fabd1b3a6d..78d66f363967 100644
--- a/components/camel-aws/pom.xml
+++ b/components/camel-aws/pom.xml
@@ -39,6 +39,7 @@
     </properties>
 
     <modules>
+        <module>camel-aws-common</module>
         <module>camel-aws2-athena</module>
         <module>camel-aws-bedrock</module>
         <module>camel-aws-cloudtrail</module>
diff --git a/docs/components/modules/others/examples/json/aws-common.json 
b/docs/components/modules/others/examples/json/aws-common.json
new file mode 120000
index 000000000000..5597b0618d3b
--- /dev/null
+++ b/docs/components/modules/others/examples/json/aws-common.json
@@ -0,0 +1 @@
+../../../../../../components/camel-aws/camel-aws-common/src/generated/resources/aws-common.json
\ No newline at end of file
diff --git a/parent/pom.xml b/parent/pom.xml
index e44d3753962f..3d15b44b9e13 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -808,6 +808,11 @@
                 <artifactId>camel-aws-cloudtrail</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-aws-common</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
                 <artifactId>camel-aws-config</artifactId>

Reply via email to