Wie kann ich mit dem AWS Java SDK v2 ein Kubernetes-Authentifizierungstoken von AWS EKS erhalten? Ein Authentifizierungstoken, mit dem Sie sich mithilfe eines Kubernetes SDK bei Kubernetes authentifizieren können. Mit anderen Worten, ich möchte ein Authentifizierungstoken von EKS erhalten, das für die Authentifizierung mit Kubernetes verwendet werden soll, damit ich keine "Kube-Konfiguration" erstellen muss.
Ich habe tatsächlich eine Lösung mit AWS Java SDK v1 (nicht v2) erhalten, die sich die Codebeispiele in der folgenden offenen Ausgabe ansieht . Es gibt hier auch ein Python-Codebeispiel , ABER ich habe keinen Erfolg mit AWS Java SDK v2. Mein Versuch, dies mit AWS Java SDK v2 zu tun:
public static String getAuthenticationToken(AwsCredentialsProvider awsAuth, Region awsRegion, String clusterName) {
try {
SdkHttpFullRequest requestToSign = SdkHttpFullRequest
.builder()
.method(SdkHttpMethod.GET)
.uri(new URI("https", String.format("sts.%s.amazonaws.com", awsRegion.id()), null, null))
.appendHeader("x-k8s-aws-id", clusterName)
.appendRawQueryParameter("Action", "GetCallerIdentity")
.appendRawQueryParameter("Version", "2011-06-15")
.build();
ZonedDateTime expirationDate = DateUtil.addSeconds(DateUtil.now(), 60);
Aws4PresignerParams presignerParams = Aws4PresignerParams.builder()
.awsCredentials(awsAuth.resolveCredentials())
.expirationTime(expirationDate.toInstant())
.signingName("sts")
.signingRegion(awsRegion)
.build();
SdkHttpFullRequest signedRequest = Aws4Signer.create().presign(requestToSign, presignerParams);
String encodedUrl = Base64.getUrlEncoder().withoutPadding().encodeToString(signedRequest.getUri().toString().getBytes(CharSet.UTF_8.getCharset()));
return ("k8s-aws-v1." + encodedUrl);
} catch (Exception e) {
String errorMessage = "A problem occurred generating an Eks token";
logger.error(errorMessage, e);
throw new RuntimeException(errorMessage, e);
}
}
Es wird ein Token generiert, aber wenn ich das Token in meinem Kubernetes-Client (dem offiziellen Java Kubernetes SDK) verwende, erhalte ich eine "nicht autorisierte" Antwort zurück - daher fehlt mir etwas, auf das ich keinen Finger legen kann ...
Die AWS Java SDK v1-Version sieht ungefähr so aus: (Aus dem zuvor erwähnten offenen Problem )
Ich habe es zum Laufen gebracht, aber ich habe Probleme, etwas Ähnliches in AWS Java SDK v2 zum Laufen zu bringen.
private String generateToken(String clusterName,
Date expirationDate,
String serviceName,
String region,
AWSSecurityTokenServiceClient awsSecurityTokenServiceClient,
AWSCredentialsProvider credentialsProvider,
String scheme,
String host) throws URISyntaxException {
try {
DefaultRequest<GetCallerIdentityRequest> callerIdentityRequestDefaultRequest = new DefaultRequest<>(new GetCallerIdentityRequest(), serviceName);
URI uri = new URI(scheme, host, null, null);
callerIdentityRequestDefaultRequest.setResourcePath("/");
callerIdentityRequestDefaultRequest.setEndpoint(uri);
callerIdentityRequestDefaultRequest.setHttpMethod(HttpMethodName.GET);
callerIdentityRequestDefaultRequest.addParameter("Action", "GetCallerIdentity");
callerIdentityRequestDefaultRequest.addParameter("Version", "2011-06-15");
callerIdentityRequestDefaultRequest.addHeader("x-k8s-aws-id", clusterName);
Signer signer = SignerFactory.createSigner(SignerFactory.VERSION_FOUR_SIGNER, new SignerParams(serviceName, region));
SignerProvider signerProvider = new DefaultSignerProvider(awsSecurityTokenServiceClient, signer);
PresignerParams presignerParams = new PresignerParams(uri,
credentialsProvider,
signerProvider,
SdkClock.STANDARD);
PresignerFacade presignerFacade = new PresignerFacade(presignerParams);
URL url = presignerFacade.presign(callerIdentityRequestDefaultRequest, expirationDate);
String encodedUrl = Base64.getUrlEncoder().withoutPadding().encodeToString(url.toString().getBytes());
log.info("Token [{}]", encodedUrl);
return "k8s-aws-v1." + encodedUrl;
} catch (URISyntaxException e) {
log.error("could not generate token", e);
throw e;
}
}