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

danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git


The following commit(s) were added to refs/heads/master by this push:
     new 9860e943c63 [HUDI-7699] Support STS external ids and configurable 
session names in the AWS StsAssumeRoleCredentialsProvider (#11134)
9860e943c63 is described below

commit 9860e943c638c11302964d943a0d2f2f46a77051
Author: Ian Streeter <[email protected]>
AuthorDate: Thu May 9 00:17:29 2024 +0100

    [HUDI-7699] Support STS external ids and configurable session names in the 
AWS StsAssumeRoleCredentialsProvider (#11134)
    
    [HUDI-6695](https://issues.apache.org/jira/browse/HUDI-6695) added a AWS 
credentials provider to support assuming a role when syncing to Glue.
    
    We use Hudi in a multi-tenant environment, and our customers give us 
delegated access to their Glue catalog.  In this multi-tenant setup it is 
important to use [an external 
ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)
 to improve security when assuming IAM roles.
    
    Furthermore, the STS session name is currently hard-coded to "hoodie".  It 
is helpful for us to have configurable session names so we have better 
tracability of what entities are creating STS sessions in the cloud.
    
    Currently, the assumed role is configured with the `hoodie.aws.role.arn` 
config property.  I would like to add the following extra optional config 
properties, which will be used by the 
`HoodieConfigAWSAssumedRoleCredentialsProvider`:
    
    - `hoodie.aws.role.external.id`
    - `hoodie.aws.role.session.name`
---
 ...dieConfigAWSAssumedRoleCredentialsProvider.java |  5 +++-
 .../org/apache/hudi/config/HoodieAWSConfig.java    | 34 +++++++++++++++++++++-
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git 
a/hudi-aws/src/main/java/org/apache/hudi/aws/credentials/HoodieConfigAWSAssumedRoleCredentialsProvider.java
 
b/hudi-aws/src/main/java/org/apache/hudi/aws/credentials/HoodieConfigAWSAssumedRoleCredentialsProvider.java
index 89c31b8a08b..0333e973da7 100644
--- 
a/hudi-aws/src/main/java/org/apache/hudi/aws/credentials/HoodieConfigAWSAssumedRoleCredentialsProvider.java
+++ 
b/hudi-aws/src/main/java/org/apache/hudi/aws/credentials/HoodieConfigAWSAssumedRoleCredentialsProvider.java
@@ -41,9 +41,12 @@ public class HoodieConfigAWSAssumedRoleCredentialsProvider 
implements AwsCredent
 
   public HoodieConfigAWSAssumedRoleCredentialsProvider(Properties props) {
     String roleArn = 
props.getProperty(HoodieAWSConfig.AWS_ASSUME_ROLE_ARN.key());
+    String externalId = 
props.getProperty(HoodieAWSConfig.AWS_ASSUME_ROLE_EXTERNAL_ID.key());
+    String sessionName = 
props.getProperty(HoodieAWSConfig.AWS_ASSUME_ROLE_SESSION_NAME.key());
     AssumeRoleRequest req = AssumeRoleRequest.builder()
           .roleArn(roleArn)
-          .roleSessionName("hoodie")
+          .roleSessionName(sessionName)
+          .externalId(externalId)
           .build();
     StsClient stsClient = StsClient.builder().build();
 
diff --git a/hudi-aws/src/main/java/org/apache/hudi/config/HoodieAWSConfig.java 
b/hudi-aws/src/main/java/org/apache/hudi/config/HoodieAWSConfig.java
index c74d5fdfa0b..8a13652e0fa 100644
--- a/hudi-aws/src/main/java/org/apache/hudi/config/HoodieAWSConfig.java
+++ b/hudi-aws/src/main/java/org/apache/hudi/config/HoodieAWSConfig.java
@@ -73,9 +73,23 @@ public class HoodieAWSConfig extends HoodieConfig {
           .key("hoodie.aws.role.arn")
           .noDefaultValue()
           .markAdvanced()
-          .sinceVersion("0.13.2")
+          .sinceVersion("0.15.0")
           .withDocumentation("AWS Role ARN to assume");
 
+  public static final ConfigProperty<String> AWS_ASSUME_ROLE_SESSION_NAME = 
ConfigProperty
+          .key("hoodie.aws.role.session.name")
+          .defaultValue("hoodie")
+          .markAdvanced()
+          .sinceVersion("0.15.0")
+          .withDocumentation("Session name to use when assuming the AWS Role");
+
+  public static final ConfigProperty<String> AWS_ASSUME_ROLE_EXTERNAL_ID = 
ConfigProperty
+          .key("hoodie.aws.role.external.id")
+          .noDefaultValue()
+          .markAdvanced()
+          .sinceVersion("0.15.0")
+          .withDocumentation("External ID use when assuming the AWS Role");
+
   public static final ConfigProperty<String> AWS_GLUE_ENDPOINT = ConfigProperty
           .key("hoodie.aws.glue.endpoint")
           .noDefaultValue()
@@ -114,6 +128,14 @@ public class HoodieAWSConfig extends HoodieConfig {
     return getString(AWS_ASSUME_ROLE_ARN);
   }
 
+  public String getAWSAssumeRoleExternalID() {
+    return getString(AWS_ASSUME_ROLE_EXTERNAL_ID);
+  }
+
+  public String getAWSAssumeRoleSessionName() {
+    return getString(AWS_ASSUME_ROLE_SESSION_NAME);
+  }
+
   public static class Builder {
 
     private final HoodieAWSConfig awsConfig = new HoodieAWSConfig();
@@ -150,6 +172,16 @@ public class HoodieAWSConfig extends HoodieConfig {
       return this;
     }
 
+    public HoodieAWSConfig.Builder withAssumeRoleExternalID(String 
assumeRoleExternalID) {
+      awsConfig.setValue(AWS_ASSUME_ROLE_EXTERNAL_ID, assumeRoleExternalID);
+      return this;
+    }
+
+    public HoodieAWSConfig.Builder withAssumeRoleSessionName(String 
assumeRoleSessionName) {
+      awsConfig.setValue(AWS_ASSUME_ROLE_SESSION_NAME, assumeRoleSessionName);
+      return this;
+    }
+
     public Builder withDynamoDBTable(String dynamoDbTableName) {
       awsConfig.setValue(DYNAMODB_LOCK_TABLE_NAME, dynamoDbTableName);
       return this;

Reply via email to