Mengintegrasikan produk kontainer Anda dengan AWS Marketplace Metering Service menggunakan AWS SDK for Java - AWS Marketplace

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengintegrasikan produk kontainer Anda dengan AWS Marketplace Metering Service menggunakan AWS SDK for Java

Anda dapat menggunakan AWS SDK for Java untuk mengintegrasikan dengan AWS Marketplace Metering Service. Pengukuran berkelanjutan untuk penggunaan perangkat lunak secara otomatis ditangani oleh AWS Marketplace Metering Control Plane. Perangkat lunak Anda tidak diperlukan untuk melakukan tindakan khusus pengukuran apa pun kecuali menelepon RegisterUsage sekali untuk pengukuran penggunaan perangkat lunak untuk memulai. Topik ini memberikan contoh implementasi menggunakan AWS SDK for Java untuk mengintegrasikan dengan RegisterUsage tindakan Layanan AWS Marketplace Pengukuran.

RegisterUsageharus segera dipanggil pada saat meluncurkan wadah. Jika Anda tidak mendaftarkan kontainer dalam 6 jam pertama peluncuran kontainer, AWS Marketplace Metering Service tidak memberikan jaminan pengukuran apa pun untuk bulan-bulan sebelumnya. Namun, pengukuran akan berlanjut untuk bulan berjalan ke depan sampai wadah berakhir.

Untuk kode sumber lengkap, lihatRegisterUsage Contoh Java. Banyak dari langkah-langkah ini berlaku terlepas dari AWS SDK bahasa.

Contoh langkah untuk integrasi AWS Marketplace Metering Service
  1. Masuk ke Portal Manajemen AWS Marketplace.

  2. DariAsetPilihKontaineruntuk mulai membuat produk kontainer baru. Membuat produk menghasilkan kode produk untuk produk untuk mengintegrasikan dengan citra kontainer Anda. Untuk informasi tentang menyetel IAM izin, lihatAWS Marketplace izin API pengukuran dan hak.

  3. Unduh AWSJava publikSDK.

    penting

    Untuk memanggil metering APIs dari AmazonEKS, Anda harus menggunakan yang didukung AWS SDK dan dijalankan di EKS klaster Amazon yang menjalankan Kubernetes 1.13 atau yang lebih baru.

  4. (Opsional) Jika Anda mengintegrasikan dengan RegisterUsage tindakan dan ingin melakukan verifikasi tanda tangan digital, Anda perlu mengonfigurasi pustaka verifikasi BouncyCastletanda tangan di classpath aplikasi Anda.

    Jika Anda ingin menggunakan JSON Web Token (JWT), Anda juga harus menyertakan pustaka JWTJava di classpath aplikasi Anda. Menggunakan JWT menyediakan pendekatan yang lebih sederhana untuk verifikasi tanda tangan tetapi tidak diperlukan, dan Anda dapat menggunakan mandiri BouncyCastle sebagai gantinya. Baik Anda menggunakan JWT atau BouncyCastle, Anda perlu menggunakan sistem build seperti Maven untuk menyertakan dependensi transitif BouncyCastle atau JWT di classpath aplikasi Anda.

    // Required for signature verification using code sample <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.60</version> </dependency> // This one is only required for JWT <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>6.0</version> </dependency>
  5. PanggilanRegisterUsagedari setiap citra kontainer berbayar dalam penawaran produk Anda.ProductCodedanPublicKeyVersiondiperlukan parameter, dan semua input lainnya adalah opsional. Berikut ini adalah contoh muatan untukRegisterUsage.

    { "ProductCode" : "string", // (required) "PublicKeyVersion": 1, // (required) "Nonce": "string", // (optional) to scope down the registration // to a specific running software // instance and guard against // replay attacks }
    catatan

    Hal ini dimungkinkan untuk melihat masalah sementara dalam menghubungkan ke AWS Marketplace Metering Service. AWS Marketplace sangat merekomendasikan untuk menerapkan percobaan ulang hingga 30 menit, dengan mundur eksponensial, untuk menghindari pemadaman jangka pendek atau masalah jaringan.

  6. RegisterUsagemenghasilkan tanda RSA tangan PSS digital menggunakan SHA -256 yang dapat Anda gunakan untuk memverifikasi keaslian permintaan. Tanda tangan meliputi kolom-kolom berikut:ProductCode,PublicKeyVersion, danNonce. Untuk memverifikasi tanda tangan digital, Anda harus mempertahankan bidang ini dari permintaan. Kode berikut adalah contoh responss terhadapRegisterUsagePanggilan.

    { "Signature": "<<JWT Token>>" } // Where the JWT Token is composed of 3 dot-separated, // base-64 URL Encoded sections. // e.g. eyJhbGcVCJ9.eyJzdWIMzkwMjJ9.rrO9Qw0SXRWTe // Section 1: Header/Algorithm { "alg": "PS256", "typ": "JWT" } // Section 2: Payload { "ProductCode" : "string", "PublicKeyVersion": 1, "Nonce": "string", "iat": date // JWT issued at claim } // Section 3: RSA-PSS SHA256 signature "rrO9Q4FEi3gweH3X4lrt2okf5zwIatUUwERlw016wTy_21Nv8S..."
  7. Buat kembali versi baru gambar penampung Anda yang menyertakan RegisterUsage panggilan, beri tag penampung, dan dorong ke registri kontainer apa pun yang kompatibel dengan Amazon ECS atau AmazonEKS, seperti Amazon ECR atau Amazon ECR Public. Jika Anda menggunakan AmazonECR, pastikan akun yang meluncurkan ECS tugas Amazon atau EKS pod Amazon memiliki izin di ECR repositori Amazon. Jika tidak, peluncuran gagal.

  8. Buat IAMperan yang memberikan izin untuk penampung Anda untuk dipanggilRegisterUsage, seperti yang didefinisikan dalam kode berikut. Anda harus menyediakan IAM peran ini dalam parameter Peran Tugas ECS tugas tugas Amazon atau definisi EKS pod Amazon.

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "aws-marketplace:RegisterUsage" ], "Effect": "Allow", "Resource": "*" } ] }
  9. Buat ECS tugas Amazon atau definisi EKS pod Amazon yang mereferensikan wadah yang telah terintegrasi AWS Marketplace dan mereferensikan IAM peran yang Anda buat di langkah 7. Anda harus mengaktifkan AWS CloudTrail logging dalam definisi tugas jika Anda ingin melihat logging.

  10. Buat EKS klaster Amazon ECS atau Amazon untuk menjalankan tugas atau pod Anda. Untuk informasi selengkapnya tentang membuat ECS klaster Amazon, lihat Membuat Cluster di Panduan Pengembang Layanan Kontainer Elastis Amazon. Untuk informasi selengkapnya tentang membuat EKS klaster Amazon (menggunakan Kubernetes versi 1.1.3.x atau yang lebih baru), lihat Membuat Cluster Amazon. EKS

  11. Konfigurasikan EKS klaster Amazon ECS atau Amazon dan luncurkan definisi ECS tugas Amazon atau EKS pod Amazon yang Anda buat, di us-east-1 Wilayah AWS. Hanya selama proses pengujian ini, sebelum produk ditayangkan, Anda harus menggunakan wilayah ini.

  12. Saat Anda mendapatkan responss yang valid kembali dariRegisterUsage, Anda dapat mulai membuat produk kontainer Anda. Untuk pertanyaan, hubungiAWS Marketplace Operasi PenjualTim.

RegisterUsage Contoh Java

Contoh berikut menggunakan AWS SDK for Java dan AWS Marketplace Metering Service untuk memanggil RegisterUsage operasi. Verifikasi tanda tangan bersifat opsional, tetapi jika Anda ingin melakukan verifikasi tanda tangan, Anda harus menyertakan pustaka verifikasi tanda tangan digital yang diperlukan. Contoh ini hanya untuk tujuan ilustrasi.

import com.amazonaws.auth.PEM; import com.amazonaws.services.marketplacemetering.AWSMarketplaceMetering; import com.amazonaws.services.marketplacemetering.AWSMarketplaceMeteringClientBuilder; import com.amazonaws.services.marketplacemetering.model.RegisterUsageRequest; import com.amazonaws.services.marketplacemetering.model.RegisterUsageResult; import com.amazonaws.util.json.Jackson; import com.fasterxml.jackson.databind.JsonNode; import com.nimbusds.jose.JWSObject; import com.nimbusds.jose.JWSVerifier; import com.nimbusds.jose.crypto.RSASSAVerifier; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.security.PublicKey; import java.security.Security; import java.security.Signature; import java.security.interfaces.RSAPublicKey; import java.util.Base64; import java.util.Optional; import java.util.UUID; import org.bouncycastle.jce.provider.BouncyCastleProvider; /** * Class for making calls out to AWS Marketplace Metering Service. */ class RegisterUsage { private static final String PRODUCT_CODE = "......."; private final AWSMarketplaceMetering registerUsageClient; private final SignatureVerifier signatureVerifier; private final int publicKeyVersion; public RegisterUsage(final SignatureVerifier signatureVerifier) { this.signatureVerifier = signatureVerifier; this.publicKeyVersion = PublicKeyProvider.PUBLIC_KEY_VERSION; this.registerUsageClient = AWSMarketplaceMeteringClientBuilder.standard().build(); } /** * Shows how to call RegisterUsage client and verify digital signature. */ public void callRegisterUsage() { RegisterUsageRequest request = new RegisterUsageRequest() .withProductCode(PRODUCT_CODE) .withPublicKeyVersion(publicKeyVersion) .withNonce(UUID.randomUUID().toString()); // Execute call to RegisterUsage (only need to call once at container startup) RegisterUsageResult result = this.registerUsageClient.registerUsage(request); // Verify Digital Signature w/o JWT boolean isSignatureValid = this.signatureVerifier.verify(request, result); if (!isSignatureValid) { throw new RuntimeException("Revoke entitlement, digital signature invalid."); } } } /** * Signature verification class with both a JWT-library based verification * and a non-library based implementation. */ class SignatureVerifier { private static BouncyCastleProvider BC = new BouncyCastleProvider(); private static final String SIGNATURE_ALGORITHM = "SHA256withRSA/PSS"; private final PublicKey publicKey; public SignatureVerifier(PublicKeyProvider publicKeyProvider) { this.publicKey = publicKeyProvider.getPublicKey().orElse(null); Security.addProvider(BC); } /** * Example signature verification using the NimbusJOSEJWT library to verify the JWT Token. * * @param request RegisterUsage Request. * @param result RegisterUsage Result. * @return true if the token matches. */ public boolean verifyUsingNimbusJOSEJWT(final RegisterUsageRequest request, final RegisterUsageResult result) { if (!getPublicKey().isPresent()) { return false; } try { JWSVerifier verifier = new RSASSAVerifier((RSAPublicKey) getPublicKey().get()); JWSObject jwsObject = JWSObject.parse(result.getSignature()); return jwsObject.verify(verifier) && validatePayload(jwsObject.getPayload().toString(), request, result); } catch (Exception e) { // log error return false; } } /** * Example signature verification without any JWT library support. * * @param request RegisterUsage Request. * @param result RegisterUsage Result. * @return true if the token matches. */ public boolean verify(final RegisterUsageRequest request, final RegisterUsageResult result) { if (!getPublicKey().isPresent()) { return false; } try { String[] jwtParts = result.getSignature().split("\\."); String header = jwtParts[0]; String payload = jwtParts[1]; String payloadSignature = jwtParts[2]; Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM, BC); signature.initVerify(getPublicKey().get()); signature.update(String.format("%s.%s", header, payload).getBytes(StandardCharsets.UTF_8)); boolean verified = signature.verify(Base64.getUrlDecoder() .decode(payloadSignature.getBytes(StandardCharsets.UTF_8))); String decodedPayload = new String(Base64.getUrlDecoder().decode(payload)); return verified && validatePayload(decodedPayload, request, result); } catch (Exception e) { // log error return false; } } /** * Validate each value in the returned payload matches values originally * supplied in the request to RegisterUsage. TimeToLiveInMillis and * PublicKeyExpirationTimestamp will have the values in the payload compared * to values in the signature */ private boolean validatePayload(final String payload, final RegisterUsageRequest request, final RegisterUsageResult result) { try { JsonNode payloadJson = Jackson.getObjectMapper().readTree(payload); boolean matches = payloadJson.get("productCode") .asText() .equals(request.getProductCode()); matches = matches && payloadJson.get("nonce") .asText() .equals(request.getNonce()); return matches = matches && payloadJson.get("publicKeyVersion") .asText() .equals(String.valueOf(request.getPublicKeyVersion())); } catch (Exception ex) { // log error return false; } } private Optional<PublicKey> getPublicKey() { return Optional.ofNullable(this.publicKey); } } /** * Public key provider taking advantage of the AWS PEM Utility. */ class PublicKeyProvider { // Replace with your public key. Ensure there are new-lines ("\n") in the // string after "-----BEGIN PUBLIC KEY-----\n" and before "\n-----END PUBLIC KEY-----". private static final String PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\n" + "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdlatRjRjogo3WojgGHFHYLugd\n" + "UWAY9iR3fy4arWNA1KoS8kVw33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQs\n" + "HUfQrSDv+MuSUMAe8jzKE4qW+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5D\n" + "o2kQ+X5xK9cipRgEKwIDAQAB\n" + "-----END PUBLIC KEY-----"; public static final int PUBLIC_KEY_VERSION = 1; public Optional<PublicKey> getPublicKey() { try { return Optional.of(PEM.readPublicKey(new ByteArrayInputStream( PUBLIC_KEY.getBytes(StandardCharsets.UTF_8)))); } catch (Exception e) { // log error return Optional.empty(); } } }