Skip to content

Commit 58278f6

Browse files
Auth: Respect async credentials update flag from DefaultCredentialsProvider for WebIdentityTokenFileCredentialProvider (#3899)
Enable async credential update for WebIdentityTokenFileCredentialProvider
1 parent 8a6af9f commit 58278f6

File tree

5 files changed

+50
-1
lines changed

5 files changed

+50
-1
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "feature",
3+
"category": "AWS SDK for Java v2, AWS STS",
4+
"contributor": "paulolieuthier",
5+
"description": "Respect async credentials update flag from DefaultCredentialsProvider for WebIdentityTokenFileCredentialProvider, potentially avoiding latency spikes on credentials expiration"
6+
}

core/auth/src/main/java/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ private static LazyAwsCredentialsProvider createChain(Builder builder) {
9292
AwsCredentialsProvider[] credentialsProviders = new AwsCredentialsProvider[] {
9393
SystemPropertyCredentialsProvider.create(),
9494
EnvironmentVariableCredentialsProvider.create(),
95-
WebIdentityTokenFileCredentialsProvider.create(),
95+
WebIdentityTokenFileCredentialsProvider.builder()
96+
.asyncCredentialUpdateEnabled(asyncCredentialUpdateEnabled)
97+
.build(),
9698
ProfileCredentialsProvider.builder()
9799
.profileFile(builder.profileFile)
98100
.profileName(builder.profileName)

core/auth/src/main/java/software/amazon/awssdk/auth/credentials/WebIdentityTokenFileCredentialsProvider.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,15 @@ public class WebIdentityTokenFileCredentialsProvider
5858

5959
private final Path webIdentityTokenFile;
6060

61+
private final Boolean asyncCredentialUpdateEnabled;
62+
6163
private WebIdentityTokenFileCredentialsProvider(BuilderImpl builder) {
6264
AwsCredentialsProvider credentialsProvider = null;
6365
RuntimeException loadException = null;
6466
String roleArn = null;
6567
String roleSessionName = null;
6668
Path webIdentityTokenFile = null;
69+
Boolean asyncCredentialUpdateEnabled = null;
6770

6871
try {
6972
webIdentityTokenFile =
@@ -78,11 +81,15 @@ private WebIdentityTokenFileCredentialsProvider(BuilderImpl builder) {
7881
builder.roleSessionName != null ? builder.roleSessionName
7982
: SdkSystemSetting.AWS_ROLE_SESSION_NAME.getStringValue().orElse(null);
8083

84+
asyncCredentialUpdateEnabled =
85+
builder.asyncCredentialUpdateEnabled != null ? builder.asyncCredentialUpdateEnabled : false;
86+
8187
WebIdentityTokenCredentialProperties credentialProperties =
8288
WebIdentityTokenCredentialProperties.builder()
8389
.roleArn(roleArn)
8490
.roleSessionName(roleSessionName)
8591
.webIdentityTokenFile(webIdentityTokenFile)
92+
.asyncCredentialUpdateEnabled(asyncCredentialUpdateEnabled)
8693
.build();
8794

8895
credentialsProvider = WebIdentityCredentialsUtils.factory().create(credentialProperties);
@@ -98,6 +105,7 @@ private WebIdentityTokenFileCredentialsProvider(BuilderImpl builder) {
98105
this.roleArn = roleArn;
99106
this.roleSessionName = roleSessionName;
100107
this.webIdentityTokenFile = webIdentityTokenFile;
108+
this.asyncCredentialUpdateEnabled = asyncCredentialUpdateEnabled;
101109
}
102110

103111
public static WebIdentityTokenFileCredentialsProvider create() {
@@ -152,6 +160,12 @@ public interface Builder extends CopyableBuilder<Builder, WebIdentityTokenFileCr
152160
*/
153161
Builder webIdentityTokenFile(Path webIdentityTokenFile);
154162

163+
/**
164+
* Define whether the provider should fetch credentials asynchronously in the background.
165+
*/
166+
167+
Builder asyncCredentialUpdateEnabled(Boolean asyncCredentialUpdateEnabled);
168+
155169
/**
156170
* Create a {@link WebIdentityTokenFileCredentialsProvider} using the configuration applied to this builder.
157171
*/
@@ -162,6 +176,7 @@ static final class BuilderImpl implements Builder {
162176
private String roleArn;
163177
private String roleSessionName;
164178
private Path webIdentityTokenFile;
179+
private Boolean asyncCredentialUpdateEnabled;
165180

166181
BuilderImpl() {
167182
}
@@ -170,6 +185,7 @@ private BuilderImpl(WebIdentityTokenFileCredentialsProvider provider) {
170185
this.roleArn = provider.roleArn;
171186
this.roleSessionName = provider.roleSessionName;
172187
this.webIdentityTokenFile = provider.webIdentityTokenFile;
188+
this.asyncCredentialUpdateEnabled = provider.asyncCredentialUpdateEnabled;
173189
}
174190

175191
@Override
@@ -202,6 +218,16 @@ public void setWebIdentityTokenFile(Path webIdentityTokenFile) {
202218
webIdentityTokenFile(webIdentityTokenFile);
203219
}
204220

221+
@Override
222+
public Builder asyncCredentialUpdateEnabled(Boolean asyncCredentialUpdateEnabled) {
223+
this.asyncCredentialUpdateEnabled = asyncCredentialUpdateEnabled;
224+
return this;
225+
}
226+
227+
public void setAsyncCredentialUpdateEnabled(Boolean asyncCredentialUpdateEnabled) {
228+
asyncCredentialUpdateEnabled(asyncCredentialUpdateEnabled);
229+
}
230+
205231
@Override
206232
public WebIdentityTokenFileCredentialsProvider build() {
207233
return new WebIdentityTokenFileCredentialsProvider(this);

core/auth/src/main/java/software/amazon/awssdk/auth/credentials/internal/WebIdentityTokenCredentialProperties.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ public class WebIdentityTokenCredentialProperties {
2727
private final String roleArn;
2828
private final String roleSessionName;
2929
private final Path webIdentityTokenFile;
30+
private final Boolean asyncCredentialUpdateEnabled;
3031

3132
private WebIdentityTokenCredentialProperties(Builder builder) {
3233
this.roleArn = builder.roleArn;
3334
this.roleSessionName = builder.roleSessionName;
3435
this.webIdentityTokenFile = builder.webIdentityTokenFile;
36+
this.asyncCredentialUpdateEnabled = builder.asyncCredentialUpdateEnabled;
3537
}
3638

3739
public String roleArn() {
@@ -46,6 +48,10 @@ public Path webIdentityTokenFile() {
4648
return webIdentityTokenFile;
4749
}
4850

51+
public Boolean asyncCredentialUpdateEnabled() {
52+
return asyncCredentialUpdateEnabled;
53+
}
54+
4955
public static Builder builder() {
5056
return new Builder();
5157
}
@@ -54,6 +60,7 @@ public static final class Builder {
5460
private String roleArn;
5561
private String roleSessionName;
5662
private Path webIdentityTokenFile;
63+
private Boolean asyncCredentialUpdateEnabled;
5764

5865
public Builder roleArn(String roleArn) {
5966
this.roleArn = roleArn;
@@ -70,6 +77,11 @@ public Builder webIdentityTokenFile(Path webIdentityTokenFile) {
7077
return this;
7178
}
7279

80+
public Builder asyncCredentialUpdateEnabled(Boolean asyncCredentialUpdateEnabled) {
81+
this.asyncCredentialUpdateEnabled = asyncCredentialUpdateEnabled;
82+
return this;
83+
}
84+
7385
public WebIdentityTokenCredentialProperties build() {
7486
return new WebIdentityTokenCredentialProperties(this);
7587
}

services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsWebIdentityCredentialsProviderFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ private static final class StsWebIdentityCredentialsProvider implements AwsCrede
5959
private StsWebIdentityCredentialsProvider(WebIdentityTokenCredentialProperties credentialProperties) {
6060
String roleSessionName = credentialProperties.roleSessionName();
6161
String sessionName = roleSessionName != null ? roleSessionName : "aws-sdk-java-" + System.currentTimeMillis();
62+
Boolean asyncCredentialUpdateEnabled = credentialProperties.asyncCredentialUpdateEnabled() != null ?
63+
credentialProperties.asyncCredentialUpdateEnabled() : false;
6264

6365
OrRetryCondition retryCondition =
6466
OrRetryCondition.create(context -> context.exception() instanceof IdpCommunicationErrorException,
@@ -83,6 +85,7 @@ private StsWebIdentityCredentialsProvider(WebIdentityTokenCredentialProperties c
8385

8486
this.credentialsProvider =
8587
StsAssumeRoleWithWebIdentityCredentialsProvider.builder()
88+
.asyncCredentialUpdateEnabled(asyncCredentialUpdateEnabled)
8689
.stsClient(stsClient)
8790
.refreshRequest(supplier)
8891
.build();

0 commit comments

Comments
 (0)