diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/HiveS3Config.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/HiveS3Config.java index d256eb1f37b9..22c2e2cbaffd 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/HiveS3Config.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/HiveS3Config.java @@ -42,6 +42,7 @@ public class HiveS3Config private String s3AwsAccessKey; private String s3AwsSecretKey; private String s3Endpoint; + private String s3Region; private TrinoS3StorageClass s3StorageClass = TrinoS3StorageClass.STANDARD; private TrinoS3SignerType s3SignerType; private String s3SignerClass; @@ -118,6 +119,18 @@ public HiveS3Config setS3Endpoint(String s3Endpoint) return this; } + public String getS3Region() + { + return s3Region; + } + + @Config("hive.s3.region") + public HiveS3Config setS3Region(String s3Region) + { + this.s3Region = s3Region; + return this; + } + @NotNull public TrinoS3StorageClass getS3StorageClass() { diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/TrinoS3ConfigurationInitializer.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/TrinoS3ConfigurationInitializer.java index 0dd7c9f5e59c..f6c4deaae96f 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/TrinoS3ConfigurationInitializer.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/TrinoS3ConfigurationInitializer.java @@ -47,6 +47,7 @@ import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_PROXY_PORT; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_PROXY_PROTOCOL; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_PROXY_USERNAME; +import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_REGION; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_REQUESTER_PAYS_ENABLED; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_SECRET_KEY; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_SIGNER_CLASS; @@ -72,6 +73,7 @@ public class TrinoS3ConfigurationInitializer private final String awsAccessKey; private final String awsSecretKey; private final String endpoint; + private final String region; private final TrinoS3StorageClass s3StorageClass; private final TrinoS3SignerType signerType; private final boolean pathStyleAccess; @@ -117,6 +119,7 @@ public TrinoS3ConfigurationInitializer(HiveS3Config config) this.awsAccessKey = config.getS3AwsAccessKey(); this.awsSecretKey = config.getS3AwsSecretKey(); this.endpoint = config.getS3Endpoint(); + this.region = config.getS3Region(); this.s3StorageClass = config.getS3StorageClass(); this.signerType = config.getS3SignerType(); this.signerClass = config.getS3SignerClass(); @@ -174,6 +177,9 @@ public void initializeConfiguration(Configuration config) if (endpoint != null) { config.set(S3_ENDPOINT, endpoint); } + if (region != null) { + config.set(S3_REGION, region); + } config.set(S3_STORAGE_CLASS, s3StorageClass.name()); if (signerType != null) { config.set(S3_SIGNER_TYPE, signerType.name()); diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/TrinoS3FileSystem.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/TrinoS3FileSystem.java index ac5f232d297e..793168d6139a 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/TrinoS3FileSystem.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/s3/TrinoS3FileSystem.java @@ -192,6 +192,7 @@ public class TrinoS3FileSystem public static final String S3_SIGNER_TYPE = "trino.s3.signer-type"; public static final String S3_SIGNER_CLASS = "trino.s3.signer-class"; public static final String S3_ENDPOINT = "trino.s3.endpoint"; + public static final String S3_REGION = "trino.s3.region"; public static final String S3_SECRET_KEY = "trino.s3.secret-key"; public static final String S3_ACCESS_KEY = "trino.s3.access-key"; public static final String S3_SESSION_TOKEN = "trino.s3.session-token"; @@ -920,7 +921,7 @@ private AmazonS3 createAmazonS3Client(Configuration hadoopConfig, ClientConfigur String endpoint = hadoopConfig.get(S3_ENDPOINT); if (endpoint != null) { - clientBuilder.setEndpointConfiguration(new EndpointConfiguration(endpoint, null)); + clientBuilder.setEndpointConfiguration(new EndpointConfiguration(endpoint, hadoopConfig.get(S3_REGION))); regionOrEndpointSet = true; } diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3/TestHiveS3Config.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3/TestHiveS3Config.java index 111c5d3185a5..d07da3216533 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3/TestHiveS3Config.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3/TestHiveS3Config.java @@ -41,6 +41,7 @@ public void testDefaults() .setS3AwsAccessKey(null) .setS3AwsSecretKey(null) .setS3Endpoint(null) + .setS3Region(null) .setS3SignerType(null) .setS3SignerClass(null) .setS3PathStyleAccess(false) @@ -91,6 +92,7 @@ public void testExplicitPropertyMappings() .put("hive.s3.aws-access-key", "abc123") .put("hive.s3.aws-secret-key", "secret") .put("hive.s3.endpoint", "endpoint.example.com") + .put("hive.s3.region", "eu-central-1") .put("hive.s3.signer-type", "S3SignerType") .put("hive.s3.signer-class", "com.amazonaws.services.s3.internal.AWSS3V4Signer") .put("hive.s3.path-style-access", "true") @@ -135,6 +137,7 @@ public void testExplicitPropertyMappings() .setS3AwsAccessKey("abc123") .setS3AwsSecretKey("secret") .setS3Endpoint("endpoint.example.com") + .setS3Region("eu-central-1") .setS3SignerType(TrinoS3SignerType.S3SignerType) .setS3SignerClass("com.amazonaws.services.s3.internal.AWSS3V4Signer") .setS3PathStyleAccess(true) diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3/TestTrinoS3FileSystem.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3/TestTrinoS3FileSystem.java index dc080a87bf1b..5c420ee34dbb 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3/TestTrinoS3FileSystem.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3/TestTrinoS3FileSystem.java @@ -87,6 +87,7 @@ import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_MAX_RETRY_TIME; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_PATH_STYLE_ACCESS; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_PIN_CLIENT_TO_CURRENT_REGION; +import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_REGION; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_SECRET_KEY; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_SESSION_TOKEN; import static io.trino.plugin.hive.s3.TrinoS3FileSystem.S3_SKIP_GLACIER_OBJECTS; @@ -171,6 +172,19 @@ public void testEndpointWithPinToCurrentRegionConfiguration() } } + @Test + public void testEndpointWithExplicitRegionConfiguration() + throws Exception + { + Configuration config = newEmptyConfiguration(); + config.set(S3_ENDPOINT, "test.example.endpoint.com"); + config.set(S3_REGION, "region1"); + try (TrinoS3FileSystem fs = new TrinoS3FileSystem()) { + fs.initialize(new URI("s3a://test-bucket/"), config); + assertThat(((AmazonS3Client) fs.getS3Client()).getSignerRegionOverride()).isEqualTo("region1"); + } + } + @Test public void testAssumeRoleDefaultCredentials() throws Exception