Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions presto-docs/src/main/sphinx/connector/hive.rst
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,10 @@ Property Name Description

``hive.metastore.glue.default-warehouse-dir`` Hive Glue metastore default warehouse directory

``hive.metastore.glue.aws-credentials-provider`` Fully qualified name of the Java class to use for obtaining
AWS credentials. Can be used to supply a custom credentials
provider.

``hive.metastore.glue.aws-access-key`` AWS access key to use to connect to the Glue Catalog. If
specified along with ``hive.metastore.glue.aws-secret-key``,
this parameter takes precedence over
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.metrics.RequestMetricCollector;
Expand Down Expand Up @@ -137,6 +138,7 @@
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
import static com.google.common.collect.Comparators.lexicographical;
import static java.lang.String.format;
import static java.util.Comparator.comparing;
import static java.util.Objects.requireNonNull;
import static java.util.function.UnaryOperator.identity;
Expand Down Expand Up @@ -204,19 +206,41 @@ else if (config.getPinGlueClientToCurrentRegion()) {
}
}

asyncGlueClientBuilder.setCredentials(getAwsCredentialsProvider(config));

return asyncGlueClientBuilder.build();
}

private static AWSCredentialsProvider getAwsCredentialsProvider(GlueHiveMetastoreConfig config)
{
if (config.getAwsAccessKey().isPresent() && config.getAwsSecretKey().isPresent()) {
AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(
return new AWSStaticCredentialsProvider(
new BasicAWSCredentials(config.getAwsAccessKey().get(), config.getAwsSecretKey().get()));
asyncGlueClientBuilder.setCredentials(credentialsProvider);
}
else if (config.getIamRole().isPresent()) {
AWSCredentialsProvider credentialsProvider = new STSAssumeRoleSessionCredentialsProvider
if (config.getIamRole().isPresent()) {
return new STSAssumeRoleSessionCredentialsProvider
.Builder(config.getIamRole().get(), "roleSessionName")
.build();
asyncGlueClientBuilder.setCredentials(credentialsProvider);
}
if (config.getAwsCredentialsProvider().isPresent()) {
return getCustomAWSCredentialsProvider(config.getAwsCredentialsProvider().get());
}

return asyncGlueClientBuilder.build();
return DefaultAWSCredentialsProviderChain.getInstance();
}

private static AWSCredentialsProvider getCustomAWSCredentialsProvider(String providerClass)
{
try {
Object instance = Class.forName(providerClass).getConstructor().newInstance();
if (!(instance instanceof AWSCredentialsProvider)) {
throw new RuntimeException("Invalid credentials provider class: " + instance.getClass().getName());
}
return (AWSCredentialsProvider) instance;
}
catch (ReflectiveOperationException e) {
throw new RuntimeException(format("Error creating an instance of %s", providerClass), e);
}
}

@Managed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class GlueHiveMetastoreConfig
private Optional<String> iamRole = Optional.empty();
private Optional<String> awsAccessKey = Optional.empty();
private Optional<String> awsSecretKey = Optional.empty();
private Optional<String> awsCredentialsProvider = Optional.empty();

public Optional<String> getGlueRegion()
{
Expand Down Expand Up @@ -197,4 +198,16 @@ public GlueHiveMetastoreConfig setAwsSecretKey(String awsSecretKey)
this.awsSecretKey = Optional.ofNullable(awsSecretKey);
return this;
}

public Optional<String> getAwsCredentialsProvider()
{
return awsCredentialsProvider;
}

@Config("hive.metastore.glue.aws-credentials-provider")
public GlueHiveMetastoreConfig setAwsCredentialsProvider(String awsCredentialsProvider)
{
this.awsCredentialsProvider = Optional.ofNullable(awsCredentialsProvider);
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public void testDefaults()
.setGetPartitionThreads(20)
.setIamRole(null)
.setAwsAccessKey(null)
.setAwsSecretKey(null));
.setAwsSecretKey(null)
.setAwsCredentialsProvider(null));
}

@Test
Expand All @@ -58,6 +59,7 @@ public void testExplicitPropertyMapping()
.put("hive.metastore.glue.iam-role", "role")
.put("hive.metastore.glue.aws-access-key", "ABC")
.put("hive.metastore.glue.aws-secret-key", "DEF")
.put("hive.metastore.glue.aws-credentials-provider", "custom")
.build();

GlueHiveMetastoreConfig expected = new GlueHiveMetastoreConfig()
Expand All @@ -72,7 +74,8 @@ public void testExplicitPropertyMapping()
.setGetPartitionThreads(42)
.setIamRole("role")
.setAwsAccessKey("ABC")
.setAwsSecretKey("DEF");
.setAwsSecretKey("DEF")
.setAwsCredentialsProvider("custom");

assertFullMapping(properties, expected);
}
Expand Down