AWS জাভা এসডিকে ভি 2 ব্যবহার করে এডাব্লুএস ইকেএস থেকে প্রমাণীকরণের টোকেন পান Get


11

আমি কীভাবে 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;
        }
    }

এডাব্লুএস জাভা এসডিকে ভি 1 ইস্যুতে নির্দেশিত হিসাবে, বাস্তবায়নটি খুব দীর্ঘ মেয়াদোত্তীর্ণের তারিখ নির্দিষ্ট করার জন্য সংবেদনশীল। আমি মেয়াদোত্তীর্ণের তারিখটি কিছুটা নিয়ে খেললাম, তবে এটি সমস্যার সমাধান করেনি।
এনএস ডু টুইট

টোকেন পেতে আপনি কি অ্যাউস-আইএএম-প্রমাণীকরণকারী ইউটিলিটিটি ব্যবহার করার চেষ্টা করেছিলেন
উমেশ কুমার

আমি এর আগে অ্যাউস-আইএএম-প্রমাণীকরণকারী ব্যবহার করেছি, তবে জাভা উত্স কোড থেকে কোনও কিছু ইনস্টল না করেই টোকেন তৈরি করতে সক্ষম হওয়া দরকার। এবং আমি এই জিনিসটি এডাব্লুএস জাভা এসডিকে ভি 1 এর সাথে কাজ করার জন্য অর্জন করেছি, কেবল এসডিকে ভি 2 নিয়েই সমস্যা আছে।
এনএস ডু টয়েট

টোকেনটি তৈরি করার জন্য আমি বর্তমানে এডাব্লুএস জাভা এসডিকে ভি 1 ব্যবহার করছি - তবে এখন আমার ক্লাসপথে এটি থাকতে হবে :( আমি এটি বের করার সাথে সাথে আমি রিফ্যাক্টর করতে পারি এবং এসডিকে এর ভি 1 আমার নির্ভরতা থেকে অপসারণ করতে পারি :)
এনএস ডু টোইট

আপনি কি কুবারনেটসের সংস্করণটি চালাচ্ছেন? এই অ্যাপ্লিকেশনটি কোথায় চালানো বোঝায় (গুচ্ছের বাইরে, এর অভ্যন্তরে)?
মেওয়া

উত্তর:


2

ঠিক আছে, আমি অবশেষে এটি কাজ করে।

এডাব্লুএস জাভা এসডিকে ভি 2 সংস্করণ:

public static String getAuthenticationToken(AwsCredentialsProvider awsAuth, Region awsRegion, String clusterName) {
    try {    
        SdkHttpFullRequest requestToSign = SdkHttpFullRequest
                .builder()
                .method(SdkHttpMethod.GET)
                .uri(StsUtil.getStsRegionalEndpointUri(awsRegion))
                .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())
                .signingRegion(awsRegion)
                .signingName("sts")
                .signingClockOverride(Clock.systemUTC())
                .expirationTime(expirationDate.toInstant())
                .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 authentication token for cluster: " + clusterName;
        logger.error(errorMessage, e);
        throw new RuntimeException(errorMessage, e);
    }
}

সমস্যাটি আমার এসটিএস শেষ পয়েন্ট উরিতে ছিল:

public static URI getStsRegionalEndpointUri(Region awsRegion) {
    try {
        return new URI("https", String.format("sts.%s.amazonaws.com", awsRegion.id()), "/", null);
    } catch (URISyntaxException shouldNotHappen) {
        String errorMessage = "An error occurred creating the STS regional endpoint Uri";
        logger.error(errorMessage, shouldNotHappen);
        throw new RuntimeException(errorMessage, shouldNotHappen);
    }
}

উল্লেখ্য /মধ্যে pathজন্য (তৃতীয়) যুক্তি URIঅবজেক্ট। এডাব্লুএস জাভা এসডিকে ভি 1 সংস্করণটি ইউআরআই তৈরি করে নি তবে /অন্য কোথাও নির্দিষ্ট করেছে । আমি যদি এখন URIস্ট্রিংটি পাই তবে তা মুদ্রণ করি https://sts.eu-west-1.amazonaws.com/, যখন প্রশ্নের মূল সংস্করণটি সবেমাত্র ফিরে এসেছেhttps://sts.eu-west-1.amazonaws.com

যথেষ্ট আকর্ষণীয় - মূল সংস্করণটিও একটি টোকেন উত্পন্ন করেছিল, তবে টোকেনটি কুবারনেটস প্রত্যাখ্যান করেছিল। কোনও ব্যক্তির অনুরূপ আচরণের আশা করা উচিত যদি মেয়াদ শেষ হওয়ার তারিখটি ভবিষ্যতের খুব বেশি দূরে থাকে - আপনি একটি টোকেন পাবেন তবে এটি Unauthorizedকুবেরনেটস পরিষেবা থেকে প্রতিক্রিয়া দেখাবে।

এসটিএস এন্ডপয়েন্টটি পরিবর্তন করার পরে সবকিছু কাজ করেছিল তবে আমি আরও একটি পরিবর্তন করেছি:

আমি আমার সাথে নিম্নলিখিত লাইনটি যুক্ত করেছি Aws4PresignerParams:

.signingClockOverride(Clock.systemUTC())

এটি প্রয়োজন ছিল না, তবে আসল এডাব্লুএস জাভা এসডিকে ভি 1 এটি নির্দিষ্ট করার সময় একটি ঘড়ি দিয়ে কিছু করেছিল SdkClock.STANDARDএবং ZonedDateTimeআমি যে ডাব্লুএসএস জাভা এসডিকে ভি 2 সংস্করণে ব্যবহার করি তা ইউটিসি টাইমজোন ব্যবহার করে না।


হ্যাঁ, আমি এটি কাজ করেছিলাম, তবে এর পিছনে যুক্তি সম্পর্কে আমার খুব বেশি অন্তর্দৃষ্টি নেই। এমনকি /আমি ছাড়াও আমি একটি টোকেন পেয়েছি, তবে যেমনটি আমি কুবারনেটসের সাথে সংহত করতে শুরু করেছি তখন এটি কার্যকর হয়নি didn't
এনএস ডু টোইট

আর একটি আকর্ষণীয় বিষয় বাদ দিয়ে - মূল এডাব্লুএস জাভা এসডিকে ভি 1 ইস্যুটি ইঙ্গিত দেয় যে টোকেনটি খুব স্বল্পস্থায়ী। যত তাড়াতাড়ি আমি সমাপ্তির তারিখটি 60 সেকেন্ডেরও বেশি সেট করার চেষ্টা করি একই জিনিসটি ঘটে - আমি একটি টোকেন পাই, তবে এটি Unauthorizedপ্রতিক্রিয়া বাড়ে ।
এনএস ডু টয়েট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.