Skip to content

Commit 4dc20af

Browse files
committed
Support prefetch & stale time for S3 web identity provider
1 parent 6c738c5 commit 4dc20af

File tree

4 files changed

+62
-6
lines changed

4 files changed

+62
-6
lines changed

docs/src/main/sphinx/object-storage/file-system-s3.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,21 @@ support:
110110
Trino on Amazon EKS and using [IAM roles for service accounts
111111
(IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html)
112112
Defaults to `false`.
113+
* - `s3.web-identity-token-credentials-prefetch-time`
114+
- Configure the amount of time, relative to STS token expiration, that the
115+
cached credentials are considered close to stale and should be updated.
116+
Prefetch updates will occur between the specified time and the stale time
117+
of the provider. Prefetch updates are asynchronous.
118+
By default, [AWS SDK v2
119+
defaults](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html)
120+
are used.
121+
* - `s3.web-identity-token-credentials-stale-time`
122+
- Configure the amount of time, relative to STS token expiration, that the
123+
cached credentials are considered stale and must be updated. All threads
124+
using S3 client will block until the value is updated.
125+
By default, [AWS SDK v2
126+
defaults](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.BaseBuilder.html)
127+
are used.
113128
* - `s3.application-id`
114129
- Specify the application identifier appended to the `User-Agent` header
115130
for all requests sent to S3. Defaults to `Trino`.

lib/trino-filesystem-s3/src/main/java/io/trino/filesystem/s3/S3FileSystemConfig.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ public static RetryStrategy getRetryStrategy(RetryMode retryMode)
159159
private String sseKmsKeyId;
160160
private String sseCustomerKey;
161161
private boolean useWebIdentityTokenCredentialsProvider;
162+
private Duration webIdentityTokenCredentialsPrefetchTime;
163+
private Duration webIdentityTokenCredentialsStaleTime;
162164
private SignerType signerType;
163165
private DataSize streamingPartSize = DataSize.of(32, MEGABYTE);
164166
private boolean requesterPays;
@@ -397,6 +399,32 @@ public S3FileSystemConfig setUseWebIdentityTokenCredentialsProvider(boolean useW
397399
return this;
398400
}
399401

402+
public Optional<Duration> getWebIdentityTokenCredentialsPrefetchTime()
403+
{
404+
return Optional.ofNullable(webIdentityTokenCredentialsPrefetchTime);
405+
}
406+
407+
@Config("s3.web-identity-token-credentials-prefetch-time")
408+
@ConfigDescription("Configure the amount of time, relative to STS token expiration, that the cached credentials are considered close to stale and should be updated. Prefetch updates will occur between the specified time and the stale time of the provider. Prefetch updates are asynchronous.")
409+
public S3FileSystemConfig setWebIdentityTokenCredentialsPrefetchTime(Duration webIdentityTokenCredentialsPrefetchTime)
410+
{
411+
this.webIdentityTokenCredentialsPrefetchTime = webIdentityTokenCredentialsPrefetchTime;
412+
return this;
413+
}
414+
415+
public Optional<Duration> getWebIdentityTokenCredentialsStaleTime()
416+
{
417+
return Optional.ofNullable(webIdentityTokenCredentialsStaleTime);
418+
}
419+
420+
@Config("s3.web-identity-token-credentials-stale-time")
421+
@ConfigDescription("Configure the amount of time, relative to STS token expiration, that the cached credentials are considered stale and must be updated. All threads using S3 client will block until the value is updated.")
422+
public S3FileSystemConfig setWebIdentityTokenCredentialsStaleTime(Duration webIdentityTokenCredentialsStaleTime)
423+
{
424+
this.webIdentityTokenCredentialsStaleTime = webIdentityTokenCredentialsStaleTime;
425+
return this;
426+
}
427+
400428
public String getSseCustomerKey()
401429
{
402430
return sseCustomerKey;

lib/trino-filesystem-s3/src/main/java/io/trino/filesystem/s3/S3FileSystemLoader.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
package io.trino.filesystem.s3;
1515

1616
import com.google.inject.Inject;
17+
import io.airlift.units.Duration;
1718
import io.opentelemetry.api.OpenTelemetry;
1819
import io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkTelemetry;
1920
import io.trino.filesystem.Location;
@@ -162,6 +163,8 @@ private static S3ClientFactory s3ClientFactory(SdkHttpClient httpClient, OpenTel
162163
Optional<String> staticEndpoint = Optional.ofNullable(config.getEndpoint());
163164
boolean pathStyleAccess = config.isPathStyleAccess();
164165
boolean useWebIdentityTokenCredentialsProvider = config.isUseWebIdentityTokenCredentialsProvider();
166+
Optional<Duration> webIdentityTokenCredentialsPrefetchTime = config.getWebIdentityTokenCredentialsPrefetchTime();
167+
Optional<Duration> webIdentityTokenCredentialsStaleTime = config.getWebIdentityTokenCredentialsStaleTime();
165168
Optional<String> staticIamRole = Optional.ofNullable(config.getIamRole());
166169
String staticRoleSessionName = config.getRoleSessionName();
167170
String externalId = config.getExternalId();
@@ -190,9 +193,10 @@ private static S3ClientFactory s3ClientFactory(SdkHttpClient httpClient, OpenTel
190193
s3.forcePathStyle(pathStyleAccess);
191194

192195
if (useWebIdentityTokenCredentialsProvider) {
193-
s3.credentialsProvider(WebIdentityTokenFileCredentialsProvider.builder()
194-
.asyncCredentialUpdateEnabled(true)
195-
.build());
196+
WebIdentityTokenFileCredentialsProvider.Builder builder = WebIdentityTokenFileCredentialsProvider.builder().asyncCredentialUpdateEnabled(true);
197+
webIdentityTokenCredentialsPrefetchTime.ifPresent(duration -> builder.prefetchTime(duration.toJavaTime()));
198+
webIdentityTokenCredentialsStaleTime.ifPresent(duration -> builder.staleTime(duration.toJavaTime()));
199+
s3.credentialsProvider(builder.build());
196200
}
197201
else if (iamRole.isPresent()) {
198202
s3.credentialsProvider(StsAssumeRoleCredentialsProvider.builder()
@@ -219,6 +223,8 @@ private static S3Presigner s3PreSigner(SdkHttpClient httpClient, OpenTelemetry o
219223
Optional<String> staticEndpoint = Optional.ofNullable(config.getEndpoint());
220224
boolean pathStyleAccess = config.isPathStyleAccess();
221225
boolean useWebIdentityTokenCredentialsProvider = config.isUseWebIdentityTokenCredentialsProvider();
226+
Optional<Duration> webIdentityTokenCredentialsPrefetchTime = config.getWebIdentityTokenCredentialsPrefetchTime();
227+
Optional<Duration> webIdentityTokenCredentialsStaleTime = config.getWebIdentityTokenCredentialsStaleTime();
222228
Optional<String> staticIamRole = Optional.ofNullable(config.getIamRole());
223229
String staticRoleSessionName = config.getRoleSessionName();
224230
String externalId = config.getExternalId();
@@ -234,9 +240,10 @@ private static S3Presigner s3PreSigner(SdkHttpClient httpClient, OpenTelemetry o
234240
.build());
235241

236242
if (useWebIdentityTokenCredentialsProvider) {
237-
s3.credentialsProvider(WebIdentityTokenFileCredentialsProvider.builder()
238-
.asyncCredentialUpdateEnabled(true)
239-
.build());
243+
WebIdentityTokenFileCredentialsProvider.Builder builder = WebIdentityTokenFileCredentialsProvider.builder().asyncCredentialUpdateEnabled(true);
244+
webIdentityTokenCredentialsPrefetchTime.ifPresent(duration -> builder.prefetchTime(duration.toJavaTime()));
245+
webIdentityTokenCredentialsStaleTime.ifPresent(duration -> builder.staleTime(duration.toJavaTime()));
246+
s3.credentialsProvider(builder.build());
240247
}
241248
else if (staticIamRole.isPresent()) {
242249
s3.credentialsProvider(StsAssumeRoleCredentialsProvider.builder()

lib/trino-filesystem-s3/src/test/java/io/trino/filesystem/s3/TestS3FileSystemConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ public void testDefaults()
6060
.setMaxErrorRetries(20)
6161
.setSseKmsKeyId(null)
6262
.setUseWebIdentityTokenCredentialsProvider(false)
63+
.setWebIdentityTokenCredentialsPrefetchTime(null)
64+
.setWebIdentityTokenCredentialsStaleTime(null)
6365
.setSseCustomerKey(null)
6466
.setStreamingPartSize(DataSize.of(32, MEGABYTE))
6567
.setRequesterPays(false)
@@ -102,6 +104,8 @@ public void testExplicitPropertyMappings()
102104
.put("s3.sse.kms-key-id", "mykey")
103105
.put("s3.sse.customer-key", "customerKey")
104106
.put("s3.use-web-identity-token-credentials-provider", "true")
107+
.put("s3.web-identity-token-credentials-prefetch-time", "10m")
108+
.put("s3.web-identity-token-credentials-stale-time", "5m")
105109
.put("s3.streaming.part-size", "42MB")
106110
.put("s3.requester-pays", "true")
107111
.put("s3.max-connections", "42")
@@ -140,6 +144,8 @@ public void testExplicitPropertyMappings()
140144
.setSseType(S3SseType.KMS)
141145
.setSseKmsKeyId("mykey")
142146
.setUseWebIdentityTokenCredentialsProvider(true)
147+
.setWebIdentityTokenCredentialsPrefetchTime(new Duration(10, MINUTES))
148+
.setWebIdentityTokenCredentialsStaleTime(new Duration(5, MINUTES))
143149
.setSseCustomerKey("customerKey")
144150
.setRequesterPays(true)
145151
.setMaxConnections(42)

0 commit comments

Comments
 (0)