मुझे AWS जावा SDK v2 का उपयोग करके AWS EKS से कुबेरनेट प्रमाणीकरण कैसे प्राप्त हो सकता है? एक प्रमाणीकरण टोकन जिसे कुबेरनेट्स एसडीके का उपयोग करके कुबेरनेट्स के साथ प्रमाणित करने के लिए उपयोग किया जा सकता है। दूसरे शब्दों में, मैं कुबेरनेट्स के साथ प्रमाणीकरण के लिए उपयोग करने के लिए ईकेएस से एक प्रमाणीकरण टोकन प्राप्त करना चाहता हूं ताकि मुझे "क्यूब कॉन्फ़िगरेशन" बनाने की आवश्यकता न हो।
मुझे वास्तव में AWS जावा SDK v1 (v2 नहीं) के साथ काम करने का एक समाधान मिला, जो निम्नलिखित खुले मुद्दे में कोड उदाहरणों को देख रहा है । यहाँ एक पायथन कोड उदाहरण भी है, लेकिन मुझे AWS Java SDK v2 के साथ कोई सफलता नहीं मिल रही है। AWS Java SDK v2 के साथ इसे करने का मेरा प्रयास:
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);
}
}
यह एक टोकन उत्पन्न करता है, लेकिन जब मैं अपने कुबेरनेट्स क्लाइंट (आधिकारिक जावा कुबेरनेटेस एसडीके) में टोकन का उपयोग करता हूं तो मुझे "अनधिकृत" प्रतिक्रिया वापस मिलती है - इसलिए मुझे कुछ याद आ रहा है जो मैं अपनी उंगली नहीं डाल सकता ...
AWS Java SDK v1 संस्करण कुछ इस प्रकार है: ( पहले बताए गए खुले मुद्दे से )
मैं इसे काम कर रहा था, लेकिन मैं AWS जावा SDK v2 में काम करने के लिए कुछ समान पाने के लिए संघर्ष कर रहा हूं।
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;
}
}