আমি কীভাবে AWS জাভা এসডিকে ভি 2 ব্যবহার করে এডাব্লুএস ইকেএস থেকে কুবারনেস প্রমাণীকরণের টোকন পেতে পারি? একটি প্রমাণীকরণ টোকেন যা তারপরে কুবেরনেটস এসডিকে ব্যবহার করে কুবেরনেটসের সাথে প্রমাণীকরণ করতে ব্যবহার করা যেতে পারে। অন্য কথায় আমি কুবেরনেটসের সাথে প্রমাণীকরণের জন্য EKS থেকে একটি প্রমাণীকরণ টোকন পেতে চাই যাতে আমাকে "কিউব কনফিগারেশন" তৈরি করতে না হয়।
আমি নীচের ওপেন ইস্যুতে কোড উদাহরণগুলি দেখে এডাব্লুএস জাভা এসডিকে ভি 1 (ভি 2 নয়) এর সাথে কাজ করে একটি সমাধান পেয়েছি । এখানে একটা পাইথন কোড উদাহরণ এখানে কিন্তু আমি ডেস্কটপ AWS জাভা SDK এর v2 সঙ্গে কোনো সাফল্য না থাকার করছি না। এডাব্লুএস জাভা এসডিকে ভি 2 দিয়ে এটি করার আমার প্রচেষ্টা:
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);
}
}
এটি একটি টোকেন উত্পন্ন করে, তবে যখন আমি আমার কুবারনেটস ক্লায়েন্টে (অফিসিয়াল জাভা কুবেরনেটস এসডিকে) টোকেনটি ব্যবহার করি তখন আমি একটি "অননুমোদিত" প্রতিক্রিয়া ফিরে পাই - তাই আমি এমন কিছু অনুপস্থিত যা আমি নিজের আঙ্গুলটি রাখতে পারি না ...
এডাব্লুএস জাভা এসডিকে ভি 1 সংস্করণটি এর মতো দেখাচ্ছে: ( পূর্বে উল্লিখিত খোলা সমস্যা থেকে )
আমি এটি কাজ করেছিলাম, তবে আমি এডাব্লুএস জাভা এসডিকে ভি 2 তে কাজের অনুরূপ কিছু পাওয়ার জন্য লড়াই করছি।
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;
}
}