Skip to content

Commit 0ad7269

Browse files
committed
Revert "Improve availability of instance profile credentials provider during outages. (#2989)"
This reverts commit 3f67bf7.
1 parent a01b0f7 commit 0ad7269

File tree

14 files changed

+394
-723
lines changed

14 files changed

+394
-723
lines changed

.idea/inspectionProfiles/AWS_Java_SDK_2_0.xml

Lines changed: 6 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 36 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,25 @@
1515

1616
package software.amazon.awssdk.auth.credentials;
1717

18+
import static java.util.Collections.singletonMap;
1819
import static java.util.Collections.unmodifiableSet;
1920

2021
import java.io.IOException;
2122
import java.net.URI;
22-
import java.time.Instant;
23-
import java.time.temporal.ChronoUnit;
2423
import java.util.Arrays;
25-
import java.util.HashMap;
24+
import java.util.Collections;
2625
import java.util.HashSet;
2726
import java.util.Map;
2827
import java.util.Set;
2928
import software.amazon.awssdk.annotations.SdkPublicApi;
29+
import software.amazon.awssdk.annotations.SdkTestInternalApi;
3030
import software.amazon.awssdk.auth.credentials.internal.ContainerCredentialsRetryPolicy;
31-
import software.amazon.awssdk.auth.credentials.internal.HttpCredentialsLoader;
32-
import software.amazon.awssdk.auth.credentials.internal.HttpCredentialsLoader.LoadedCredentials;
3331
import software.amazon.awssdk.core.SdkSystemSetting;
3432
import software.amazon.awssdk.core.exception.SdkClientException;
35-
import software.amazon.awssdk.core.util.SdkUserAgent;
3633
import software.amazon.awssdk.regions.util.ResourcesEndpointProvider;
3734
import software.amazon.awssdk.regions.util.ResourcesEndpointRetryPolicy;
38-
import software.amazon.awssdk.utils.ComparableUtils;
3935
import software.amazon.awssdk.utils.StringUtils;
4036
import software.amazon.awssdk.utils.ToString;
41-
import software.amazon.awssdk.utils.Validate;
42-
import software.amazon.awssdk.utils.cache.CachedSupplier;
43-
import software.amazon.awssdk.utils.cache.NonBlocking;
44-
import software.amazon.awssdk.utils.cache.RefreshResult;
4537

4638
/**
4739
* {@link AwsCredentialsProvider} implementation that loads credentials from a local metadata service.
@@ -60,28 +52,15 @@
6052
* Service (ECS)</a>
6153
*/
6254
@SdkPublicApi
63-
public final class ContainerCredentialsProvider implements HttpCredentialsProvider {
64-
private static final Set<String> ALLOWED_HOSTS = unmodifiableSet(new HashSet<>(Arrays.asList("localhost", "127.0.0.1")));
65-
66-
private final String endpoint;
67-
private final HttpCredentialsLoader httpCredentialsLoader;
68-
private final CachedSupplier<AwsCredentials> credentialsCache;
55+
public final class ContainerCredentialsProvider extends HttpCredentialsProvider {
56+
private final ResourcesEndpointProvider credentialsEndpointProvider;
6957

7058
/**
7159
* @see #builder()
7260
*/
7361
private ContainerCredentialsProvider(BuilderImpl builder) {
74-
this.endpoint = builder.endpoint;
75-
this.httpCredentialsLoader = HttpCredentialsLoader.create();
76-
77-
if (Boolean.TRUE.equals(builder.asyncCredentialUpdateEnabled)) {
78-
Validate.paramNotBlank(builder.asyncThreadName, "asyncThreadName");
79-
this.credentialsCache = CachedSupplier.builder(this::refreshCredentials)
80-
.prefetchStrategy(new NonBlocking(builder.asyncThreadName))
81-
.build();
82-
} else {
83-
this.credentialsCache = CachedSupplier.builder(this::refreshCredentials).build();
84-
}
62+
super(builder);
63+
this.credentialsEndpointProvider = builder.credentialsEndpointProvider;
8564
}
8665

8766
/**
@@ -92,60 +71,21 @@ public static Builder builder() {
9271
}
9372

9473
@Override
95-
public String toString() {
96-
return ToString.create("ContainerCredentialsProvider");
97-
}
98-
99-
private RefreshResult<AwsCredentials> refreshCredentials() {
100-
LoadedCredentials loadedCredentials =
101-
httpCredentialsLoader.loadCredentials(new ContainerCredentialsEndpointProvider(endpoint));
102-
Instant expiration = loadedCredentials.getExpiration().orElse(null);
103-
104-
return RefreshResult.builder(loadedCredentials.getAwsCredentials())
105-
.staleTime(staleTime(expiration))
106-
.prefetchTime(prefetchTime(expiration))
107-
.build();
108-
}
109-
110-
private Instant staleTime(Instant expiration) {
111-
if (expiration == null) {
112-
return null;
113-
}
114-
115-
return expiration.minus(1, ChronoUnit.MINUTES);
116-
}
117-
118-
private Instant prefetchTime(Instant expiration) {
119-
Instant oneHourFromNow = Instant.now().plus(1, ChronoUnit.HOURS);
120-
121-
if (expiration == null) {
122-
return oneHourFromNow;
123-
}
124-
125-
Instant fifteenMinutesBeforeExpiration = expiration.minus(15, ChronoUnit.MINUTES);
126-
127-
return ComparableUtils.minimum(oneHourFromNow, fifteenMinutesBeforeExpiration);
128-
}
129-
130-
@Override
131-
public AwsCredentials resolveCredentials() {
132-
return credentialsCache.get();
74+
protected ResourcesEndpointProvider getCredentialsEndpointProvider() {
75+
return credentialsEndpointProvider;
13376
}
13477

13578
@Override
136-
public void close() {
137-
credentialsCache.close();
79+
public String toString() {
80+
return ToString.create("ContainerCredentialsProvider");
13881
}
13982

14083
static final class ContainerCredentialsEndpointProvider implements ResourcesEndpointProvider {
141-
private final String endpoint;
142-
143-
ContainerCredentialsEndpointProvider(String endpoint) {
144-
this.endpoint = endpoint;
145-
}
84+
private static final Set<String> ALLOWED_HOSTS = unmodifiableSet(new HashSet<>(Arrays.asList("localhost", "127.0.0.1")));
14685

14786
@Override
14887
public URI endpoint() throws IOException {
88+
14989
if (!SdkSystemSetting.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI.getStringValue().isPresent() &&
15090
!SdkSystemSetting.AWS_CONTAINER_CREDENTIALS_FULL_URI.getStringValue().isPresent()) {
15191
throw SdkClientException.builder()
@@ -177,28 +117,26 @@ public ResourcesEndpointRetryPolicy retryPolicy() {
177117

178118
@Override
179119
public Map<String, String> headers() {
180-
Map<String, String> requestHeaders = new HashMap<>();
181-
requestHeaders.put("User-Agent", SdkUserAgent.create().userAgent());
182-
SdkSystemSetting.AWS_CONTAINER_AUTHORIZATION_TOKEN.getStringValue()
183-
.filter(StringUtils::isNotBlank)
184-
.ifPresent(t -> requestHeaders.put("Authorization", t));
185-
return requestHeaders;
120+
return SdkSystemSetting.AWS_CONTAINER_AUTHORIZATION_TOKEN.getStringValue()
121+
.filter(StringUtils::isNotBlank)
122+
.map(t -> singletonMap("Authorization", t))
123+
.orElseGet(Collections::emptyMap);
186124
}
187125

188126
private URI createUri(String relativeUri) {
189-
String host = endpoint != null ? endpoint : SdkSystemSetting.AWS_CONTAINER_SERVICE_ENDPOINT.getStringValueOrThrow();
190-
return URI.create(host + relativeUri);
127+
return URI.create(SdkSystemSetting.AWS_CONTAINER_SERVICE_ENDPOINT.getStringValueOrThrow() + relativeUri);
191128
}
192129

193130
private URI createGenericContainerUrl() {
194131
URI uri = URI.create(SdkSystemSetting.AWS_CONTAINER_CREDENTIALS_FULL_URI.getStringValueOrThrow());
195132
if (!ALLOWED_HOSTS.contains(uri.getHost())) {
196-
String envVarName = SdkSystemSetting.AWS_CONTAINER_CREDENTIALS_FULL_URI.environmentVariable();
133+
197134
throw SdkClientException.builder()
198135
.message(String.format("The full URI (%s) contained within environment " +
199-
"variable %s has an invalid host. Host can only be one of [%s].",
200-
uri,
201-
envVarName,
136+
"variable %s has an invalid host. Host can only be one of [%s].",
137+
uri,
138+
SdkSystemSetting.AWS_CONTAINER_CREDENTIALS_FULL_URI
139+
.environmentVariable(),
202140
String.join(",", ALLOWED_HOSTS)))
203141
.build();
204142
}
@@ -210,47 +148,29 @@ private URI createGenericContainerUrl() {
210148
* A builder for creating a custom a {@link ContainerCredentialsProvider}.
211149
*/
212150
public interface Builder extends HttpCredentialsProvider.Builder<ContainerCredentialsProvider, Builder> {
213-
}
214-
215-
private static final class BuilderImpl implements Builder {
216-
private String endpoint;
217-
private Boolean asyncCredentialUpdateEnabled;
218-
private String asyncThreadName;
219-
220-
BuilderImpl() {
221-
asyncThreadName("container-credentials-provider");
222-
}
223151

152+
/**
153+
* Build a {@link ContainerCredentialsProvider} from the provided configuration.
154+
*/
224155
@Override
225-
public Builder endpoint(String endpoint) {
226-
this.endpoint = endpoint;
227-
return this;
228-
}
156+
ContainerCredentialsProvider build();
157+
}
229158

230-
public void setEndpoint(String endpoint) {
231-
endpoint(endpoint);
232-
}
159+
static final class BuilderImpl extends HttpCredentialsProvider.BuilderImpl<ContainerCredentialsProvider, Builder>
160+
implements Builder {
233161

234-
@Override
235-
public Builder asyncCredentialUpdateEnabled(Boolean asyncCredentialUpdateEnabled) {
236-
this.asyncCredentialUpdateEnabled = asyncCredentialUpdateEnabled;
237-
return this;
238-
}
162+
private ResourcesEndpointProvider credentialsEndpointProvider = new ContainerCredentialsEndpointProvider();
239163

240-
public void setAsyncCredentialUpdateEnabled(boolean asyncCredentialUpdateEnabled) {
241-
asyncCredentialUpdateEnabled(asyncCredentialUpdateEnabled);
164+
BuilderImpl() {
165+
super.asyncThreadName("container-credentials-provider");
242166
}
243167

244-
@Override
245-
public Builder asyncThreadName(String asyncThreadName) {
246-
this.asyncThreadName = asyncThreadName;
168+
@SdkTestInternalApi
169+
Builder credentialsEndpointProvider(ResourcesEndpointProvider credentialsEndpointProvider) {
170+
this.credentialsEndpointProvider = credentialsEndpointProvider;
247171
return this;
248172
}
249173

250-
public void setAsyncThreadName(String asyncThreadName) {
251-
asyncThreadName(asyncThreadName);
252-
}
253-
254174
@Override
255175
public ContainerCredentialsProvider build() {
256176
return new ContainerCredentialsProvider(this);

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,6 @@ private static LazyAwsCredentialsProvider createChain(Builder builder) {
8383
.build(),
8484
InstanceProfileCredentialsProvider.builder()
8585
.asyncCredentialUpdateEnabled(asyncCredentialUpdateEnabled)
86-
.profileFile(builder.profileFile)
87-
.profileName(builder.profileName)
8886
.build()
8987
};
9088

0 commit comments

Comments
 (0)