

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

# Integrasi penagihan, pengukuran, dan lisensi produk kontainer
<a name="container-products-billing-integration"></a>

AWS Marketplace terintegrasi dengan yang lain Layanan AWS untuk memberikan pengukuran dan harga berbasis kontrak untuk produk kontainer Anda. Untuk produk berbasis kontainer dengan harga penggunaan, Anda dapat menggunakan [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html)untuk memeriksa hak untuk menggunakan produk Anda dan penggunaan pengukuran untuk penagihan. Untuk produk berbasis kontainer dengan harga kontrak, Anda dapat menggunakan lisensi AWS License Manager untuk mengaitkan lisensi dengan produk Anda. Bagian berikut memberikan informasi lebih lanjut tentang pengukuran per jam dan kustom dengan AWS Marketplace Metering Service dan harga kontrak dengan. AWS License Manager

**Topics**
+ [Pengukuran per jam dan kustom dengan AWS Marketplace Metering Service](#entitlement-and-metering-for-paid-products)
+ [Harga kontrak dengan AWS License Manager](#container-products-contracts-license-manager)
+ [Mengkonfigurasi pengukuran per jam dengan AWS Marketplace Metering Service](container-metering-registerusage.md)
+ [Mengkonfigurasi pengukuran khusus untuk produk kontainer dengan AWS Marketplace Metering Service](container-metering-meterusage.md)
+ [Harga kontrak untuk produk kontainer dengan AWS License Manager](container-license-manager-integration.md)

## Pengukuran per jam dan kustom dengan AWS Marketplace Metering Service
<a name="entitlement-and-metering-for-paid-products"></a>

[Untuk memeriksa hak untuk menggunakan produk Anda dan untuk mengukur penggunaan untuk penagihan, gunakan Layanan Pengukuran AWS Marketplace .](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) Jika Anda ingin menentukan unit harga Anda sendiri dan meteran penggunaannya kepada kami untuk penagihan, integrasikan dengan menggunakan operasi [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. Jika Anda ingin menentukan harga produk berdasarkan jumlah tugas atau pod yang digunakan dan memiliki AWS pengukur penggunaan secara otomatis, integrasikan dengan menggunakan operasi [RegisterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_RegisterUsage.html)API. Untuk kedua jenis harga, Anda dapat menambahkan harga kontrak jangka panjang tanpa mengubah cara Anda berintegrasi dengan AWS Marketplace Metering Service.

Ketika Anda membuat produk kontainer baru di Portal Manajemen AWS Marketplace, kami menyediakan satu set pengidentifikasi produk (kode produk dan kunci publik) yang digunakan untuk mengintegrasikan produk Anda dengan. AWS Marketplace Metering Service

### Penetapan
<a name="seller-container-entitlement"></a>

Mengintegrasikan dengan AWS Marketplace Metering Service memungkinkan Anda untuk memverifikasi bahwa pelanggan yang menjalankan perangkat lunak berbayar Anda berlangganan produk Anda AWS Marketplace, melindungi Anda dari penggunaan yang tidak sah saat startup kontainer. Untuk memverifikasi hak, gunakan operasi [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)atau [RegisterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_RegisterUsage.html)API, tergantung pada model harga Anda. Untuk model harga bulanan per jam dan tetap, gunakan operasi `RegisterUsage` API. Untuk model harga pengukuran kustom, gunakan operasi `MeterUsage` API.

Jika pembeli tidak berhak atas produk Anda, operasi API ini mengembalikan `CustomerNotEntitledException` pengecualian.

**catatan**  
Jika pembeli berhenti berlangganan dari produk Anda saat menjalankannya, mereka berhak untuk terus menjalankannya. Namun, mereka tidak dapat meluncurkan kontainer tambahan untuk produk Anda.

### Pedoman integrasi
<a name="integration-guidelines"></a>

Saat Anda membuat dan memublikasikan produk kontainer dan menggunakan operasi `MeterUsage` atau `RegisterUsage` API untuk hak dan pengukuran, ingatlah pedoman berikut:
+ Jangan mengonfigurasi AWS kredensi dalam perangkat lunak Anda atau gambar kontainer Docker. AWS kredensi untuk pembeli diperoleh secara otomatis saat runtime saat image container Anda berjalan dalam tugas Amazon ECS atau pod Amazon EKS.
+  Untuk memanggil operasi `MeterUsage` atau `RegisterUsage` API dari Amazon EKS, Anda harus [menggunakan AWS SDK yang didukung](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html). Untuk menguji`MeterUsage`atau`RegisterUsage`integrasi Amazon EKS, Anda harus menjalankan cluster Amazon EKS menjalankan Kubernetes 1.13.x atau lebih besar. Kubernetes 1.13 diperlukan untuk peran AWS Identity and Access Management (IAM) untuk dukungan pod. Peran IAM diperlukan untuk pod yang sedang berjalan untuk mendapatkan AWS kredensional yang diperlukan untuk menjalankan tindakan ini di Amazon EKS. 
+ Anda dapat melakukan pengembangan lokal, tetapi Anda akan mendapatkan`PlatformNotSupportedException`pengecualian. Pengecualian ini tidak akan terjadi saat Anda meluncurkan penampung pada layanan AWS kontainer (Amazon ECS, Amazon EKS, dan Fargate).

### Didukung Wilayah AWS
<a name="supported-regions-metering"></a>

Untuk daftar semua yang AWS Marketplace didukung Wilayah AWS, lihat [Tabel Wilayah](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/) di situs web Infrastruktur Global.

#### Memperoleh Wilayah AWS untuk pengukuran
<a name="metering-aws-region-configuration"></a>

Saat mengintegrasikan penampung Anda untuk pengukuran dengan operasi `MeterUsage` atau `RegisterUsage` API, jangan mengonfigurasi AWS SDK untuk menggunakan yang spesifik. Wilayah AWS Wilayah harus diperoleh secara dinamis saat runtime. 

**Example**  
Misalnya, pelanggan meluncurkan tugas Amazon ECS atau pod Amazon EKS. Operasi `RegisterUsage` API dipanggil di Wilayah yang berbeda dari Wilayah tempat tugas Amazon ECS atau pod Amazon EKS diluncurkan. Oleh karena itu, operasi `RegisterUsage` API menimbulkan `InvalidRegionException` kesalahan.



AWS Bahasa SDK tidak menentukan `AWS_REGION` secara konsisten. Jika SDK Anda tidak secara otomatis mengambil`AWS_REGION`, perangkat lunak perlu ditulis secara manual untuk menentukan`AWS_Region`. Misalnya, AWS SDK untuk Java secara otomatis menggunakan [metadata instans Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) (khususnya,`ec2InstanceMetadata`) untuk mendapatkan Wilayah saat variabel lingkungan atau konfigurasi lain tidak ada. Dalam hal ini, hanya panggilan`ec2InstanceMetadata`jika`AWS_REGION`variabel lingkungan tidak ada.

Untuk informasi tentang cara mendapatkan Wilayah AWS saat runtime secara dinamis, lihat [Panduan Pengembang AWS SDK](https://aws.amazon.com/tools) untuk bahasa pemrograman Anda.

### Mencegah modifikasi pengukuran
<a name="prevent-metering-modification"></a>

Memperkenalkan cara bagi pembeli untuk mengubah atau mengganti panggilan ke`RegisterUsage`atau`MeterUsage`dapat mengakibatkan masalah penagihan dan pembayaran yang tidak diinginkan. Kami sangat menyarankan Anda mengintegrasikan logika pengukuran dan hak.

Saat merekayasa produk Anda untuk mencegah modifikasi pengukuran, ingatlah hal berikut:
+ Jika pembeli dapat menyisipkan lapisan gambar baru yang berisi `CMD` atau `ENTRYPOINT` instruksi, langsung `MeterUsage` integrasikan `RegisterUsage` atau ke dalam perangkat lunak yang dijalankan pembeli melalui gambar kontainer Anda. Jika tidak, panggilan ke `RegisterUsage` atau `MeterUsage` dieksekusi melalui `CMD` atau `ENTRYPOINT` dari gambar dasar kemungkinan akan diganti oleh pembeli.
+ Kami menyarankan Anda mengelola kode AWS Marketplace produk yang digunakan perangkat lunak Anda sebagai masukan `RegisterUsage` atau dengan `MeterUsage` cara yang tidak dapat dimodifikasi oleh pembeli. *Namun, jika produk Anda mengelola kode produk dengan cara yang dapat ditimpa pelanggan, seperti bagan Helm AWS CloudFormation, atau manifes Kubernetes, Anda harus mempertahankan daftar kode produk tepercaya.* AWS Marketplace Ini untuk memastikan bahwa kode produk yang dilewati perangkat lunak Anda sebagai input `RegisterUsage` atau `MeterUsage` valid.
+  Jika salah satu kode produk tepercaya Anda adalah produk gratis, pastikan kode produk tersebut tidak dapat digunakan sebagai pengganti kode produk berbayar.

## Harga kontrak dengan AWS License Manager
<a name="container-products-contracts-license-manager"></a>

Untuk produk berbasis kontainer dengan harga kontrak, Anda gunakan AWS License Manager untuk mengaitkan lisensi dengan produk Anda. 

AWS License Manager adalah alat manajemen lisensi yang memungkinkan aplikasi Anda untuk melacak dan memperbarui lisensi (juga dikenal sebagai hak) yang telah dibeli oleh pelanggan. Bagian ini memberikan informasi tentang cara mengintegrasikan produk Anda AWS License Manager. Setelah integrasi selesai, Anda dapat mempublikasikan daftar produk Anda AWS Marketplace.

Untuk informasi selengkapnya AWS License Manager, lihat [Panduan AWS License Manager Pengguna](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) dan [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)bagian *Referensi AWS CLI Perintah*.

**catatan**  
Pelanggan tidak dapat meluncurkan instance baru dari kontainer setelah masa berakhirnya kontrak. Namun, selama durasi kontrak, mereka dapat meluncurkan sejumlah instance. Lisensi ini tidak terikat pada node atau instance tertentu. Perangkat lunak apa pun yang berjalan pada wadah apa pun pada node apa pun dapat memeriksa lisensi selama memiliki AWS kredensialnya yang ditetapkan.
**Pembuatan Penawaran Pribadi** — Penjual dapat menghasilkan penawaran pribadi untuk produk menggunakan alat pembuatan penawaran Pribadi di Portal Manajemen AWS Marketplace.
**Pelaporan** — Anda dapat mengatur umpan data dengan menyiapkan bucket Amazon S3 di bagian Laporan **di** bagian. Portal Manajemen AWS Marketplace Untuk informasi selengkapnya, lihat [Laporan penjual, umpan data, dan dasbor di AWS Marketplace](reports-and-data-feed.md).

### Alur kerja integrasi
<a name="container-LM-LM-workflow"></a>

Langkah-langkah berikut menunjukkan alur kerja untuk mengintegrasikan produk kontainer Anda dengan: AWS License Manager

1. Penjual menciptakan produk dengan AWS License Manager integrasi.

1. Penjual mencantumkan produk di AWS Marketplace.

1. Pembeli menemukan produk AWS Marketplace dan membelinya.

1. Lisensi dikirim ke pembeli di dalamnya Akun AWS.

1. Pembeli menggunakan perangkat lunak dengan meluncurkan instans Amazon EC2, tugas Amazon ECS, atau perangkat lunak pod Amazon EKS. Pelanggan menyebarkan menggunakan peran IAM.

1. Perangkat lunak membaca lisensi di AWS License Manager akun pembeli, menemukan hak yang dibeli, dan menyediakan fitur yang sesuai. 
**catatan**  
License Manager tidak melakukan pelacakan atau pembaruan apa pun; ini dilakukan oleh aplikasi penjual.

# Mengkonfigurasi pengukuran per jam dengan AWS Marketplace Metering Service
<a name="container-metering-registerusage"></a>

**catatan**  
 Untuk penerapan Amazon EKS, perangkat lunak Anda harus menggunakan [peran IAM untuk akun layanan (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) untuk menandatangani panggilan API untuk operasi API. [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html) Menggunakan [EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), peran node, atau kunci akses jangka panjang tidak didukung.  
Untuk penerapan Amazon ECS, perangkat lunak Anda harus menggunakan peran [IAM tugas Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) untuk menandatangani panggilan API untuk operasi API. [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html) Menggunakan peran node atau kunci akses jangka panjang tidak didukung.

Jika produk kontainer Anda menggunakan harga per jam per tugas atau per-pod alih-alih dimensi harga terukur khusus, Anda tidak perlu menentukan dimensi pengukuran khusus. Anda dapat menggunakan AWS Marketplace Metering Service untuk pengukuran per jam dengan produk kontainer. AWS Marketplace Bagian berikut menunjukkan cara mengonfigurasi pengukuran per jam dengan AWS Marketplace Metering Service.

Perangkat lunak pengukur operasi `RegisterUsage` API digunakan per tugas Amazon Elastic Container Service (Amazon ECS) atau per pod Amazon Elastic Kubernetes Service (Amazon EKS), per jam, dengan penggunaan prorata ke yang kedua. Penggunaan minimal 1 menit berlaku untuk tugas atau pod yang berumur pendek. 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.

`RegisterUsage`harus 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.

Mereka AWS Marketplace Metering Control Plane terus menagih pelanggan untuk menjalankan tugas Amazon ECS dan pod Amazon EKS, terlepas dari status langganan pelanggan. Ini menghilangkan kebutuhan perangkat lunak Anda untuk melakukan pemeriksaan hak setelah peluncuran tugas atau pod awal yang berhasil. 

*Untuk informasi selengkapnya tentang mengintegrasikan AWS Marketplace Metering Service API dengan produk kontainer dengan harga per jam, lihat lab [Integrasikan dengan pengukuran per jam](https://catalog.workshops.aws/mpseller/en-US/container/integrate-hourly) di bengkel penjual.AWS Marketplace * 

**Topics**
+ [Prasyarat pengukuran per jam](#hourly-metering-prereqs)
+ [Integrasi pengujian untuk `RegisterUsage`](#testing-integration-for-registerusage)
+ [Penanganan kesalahan untuk `RegisterUsage`](#hourly-metering-entitlement-error-handling)
+ [Mengintegrasikan produk container Anda dengan AWS Marketplace Metering Service menggunakan AWS SDK untuk Java](java-integration-example-registerusage.md)

## Prasyarat pengukuran per jam
<a name="hourly-metering-prereqs"></a>

Sebelum menerbitkan produk, Anda harus melakukan hal berikut:

1. Buat produk kontainer baru di Portal Manajemen AWS Marketplace, dan catat kode produknya.

   Untuk informasi selengkapnya, lihat [Ikhtisar: Buat produk kontainer](container-product-getting-started.md#create-container-product).

1. Gunakan peran AWS Identity and Access Management (IAM) untuk tugas atau pod yang menjalankan aplikasi Anda dengan izin IAM yang diperlukan untuk memanggil. `RegisterUsage` Kebijakan terkelola `AWSMarketplaceMeteringRegisterUsage` meliputi izin-izin ini. Untuk informasi selengkapnya tentang kebijakan, lihat [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)di *Referensi Kebijakan AWS Terkelola*.

1. (Opsional) Jika Anda ingin melihat logging, kami sarankan Anda mengaktifkan AWS CloudTrail logging dalam tugas atau definisi pod.

1. Lakukan panggilan uji ke operasi `RegisterUsage` API dengan catatan untuk semua dimensi harga yang Anda tetapkan.

## Integrasi pengujian untuk `RegisterUsage`
<a name="testing-integration-for-registerusage"></a>

Gunakan operasi `RegisterUsage` API untuk menguji integrasi Anda sebelum mengirimkan gambar Anda AWS Marketplace untuk dipublikasikan.

Panggil `RegisterUsage` dari gambar kontainer dengan menjalankan produk Anda di Amazon ECS atau Amazon EKS. Gunakan AWS akun yang Anda gunakan untuk membuat daftar produk AWS Marketplace. Integrasi pengukuran Anda harus secara dinamis mengatur Wilayah AWS, bukan hardcoding itu. Namun, saat menguji, luncurkan setidaknya satu tugas Amazon ECS atau pod Amazon EKS yang berisi kontainer berbayar Anda di Wilayah AS Timur (Virginia Utara). Dengan melakukan ini, tim AWS Marketplace operasi dapat memverifikasi pekerjaan Anda dengan log di Wilayah tersebut.

**catatan**  
Jika produk Anda mendukung Amazon ECS dan Amazon EKS, Anda hanya perlu meluncurkan di Amazon EKS bagi kami untuk memvalidasi integrasi Anda.

Anda tidak dapat sepenuhnya menguji integrasi sampai produk Anda dipublikasikan dengan semua metadata dan informasi harga yang diperlukan. Jika diminta, tim operasi AWS Marketplace katalog dapat memverifikasi penerimaan catatan pengukuran Anda.

## Penanganan kesalahan untuk `RegisterUsage`
<a name="hourly-metering-entitlement-error-handling"></a>

Jika image container Anda terintegrasi dengan AWS Marketplace Metering Service dan menerima pengecualian selain `ThrottlingException` saat startup container, Anda harus menghentikan container untuk mencegah penggunaan yang tidak sah.

Pengecualian selain `ThrottlingException` dilemparkan hanya pada panggilan awal ke operasi `RegisterUsage` API. Panggilan berikutnya dari tugas Amazon ECS yang sama atau pod Amazon EKS tidak dibuang `CustomerNotSubscribedException` meskipun pelanggan berhenti berlangganan saat tugas atau pod masih berjalan. Pelanggan ini masih dikenakan biaya untuk menjalankan kontainer setelah mereka berhenti berlangganan, dan penggunaannya dilacak.

Tabel berikut menjelaskan kesalahan yang mungkin ditimbulkan oleh operasi `RegisterUsage` API. Setiap bahasa pemrograman AWS SDK memiliki seperangkat pedoman penanganan kesalahan yang dapat Anda rujuk untuk informasi tambahan. 


|  **Kesalahan**  |  **Deskripsi**  | 
| --- | --- | 
|  InternalServiceErrorException  |  RegisterUsagetidak tersedia.  | 
|  CustomerNotEntitledException  |  Pelanggan tidak memiliki langganan yang valid untuk produk tersebut.  | 
|  InvalidProductCodeException  |  ParameterProductCodenilai yang dilewatkan sebagai bagian dari permintaan tidak ada.  | 
|  InvalidPublicKeyException  |  ParameterPublicKeyVersionnilai yang dilewatkan sebagai bagian dari permintaan tidak ada.  | 
|  PlatformNotSupportedException  |  AWS Marketplace tidak mendukung penggunaan pengukuran dari platform yang mendasarinya. Hanya Amazon ECS, Amazon EKS, dan AWS Fargate yang didukung.  | 
|  ThrottlingException  |  Panggilan keRegisterUsagediperlambat.  | 
|  InvalidRegionException  |  RegisterUsageharus dipanggil sama Wilayah AWS dengan tugas Amazon ECS atau pod Amazon EKS diluncurkan. Hal ini mencegah kontainer dari memilih Wilayah (misalnya,withRegion(“us-east-1”)) saat memanggilRegisterUsage.  | 

# Mengintegrasikan produk container Anda dengan AWS Marketplace Metering Service menggunakan AWS SDK untuk Java
<a name="java-integration-example-registerusage"></a>

Anda dapat menggunakan AWS SDK untuk Java untuk berintegrasi 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 untuk Java untuk mengintegrasikan dengan `RegisterUsage` tindakan [Layanan AWS Marketplace Pengukuran](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html). 

`RegisterUsage`harus 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, lihat[RegisterUsage Contoh Java](#registerusage-java-example). Banyak dari langkah-langkah ini berlaku terlepas dari bahasa AWS SDK. 



**Contoh langkah untuk integrasi AWS Marketplace Metering Service**

1. Masuk ke [Portal Manajemen AWS Marketplace](https://aws.amazon.com/marketplace/management/tour).

1. Dari**Aset**Pilih**Kontainer**untuk mulai membuat produk kontainer baru. Membuat produk menghasilkan kode produk untuk produk untuk mengintegrasikan dengan citra kontainer Anda. Untuk informasi tentang izin IAM yang diperlukan, lihat [AWS Marketplace izin API pengukuran dan hak](iam-user-policy-for-aws-marketplace-actions.md).

1.  Unduh [AWS Java SDK](https://aws.amazon.com/sdk-for-java/) publik. 
**penting**  
 Untuk memanggil metering APIs dari Amazon EKS, Anda harus [menggunakan AWS SDK yang didukung](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) dan berjalan di klaster Amazon EKS yang menjalankan Kubernetes 1.13 atau yang lebih baru. 

1.  (Opsional) Jika Anda mengintegrasikan dengan `RegisterUsage` tindakan dan ingin melakukan verifikasi tanda tangan digital, Anda perlu mengonfigurasi pustaka verifikasi [BouncyCastle](https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on)tanda tangan di classpath aplikasi Anda.

   Jika Anda ingin menggunakan JSON Web Token (JWT), Anda juga harus menyertakan[Java JWT](https://jwt.io/)perpustakaan di classpath aplikasi Anda. Menggunakan JWT memberikan pendekatan yang lebih sederhana untuk verifikasi tanda tangan tetapi tidak diperlukan, dan Anda dapat menggunakan mandiri sebagai BouncyCastle gantinya. Baik Anda menggunakan JWT atau BouncyCastle, Anda perlu menggunakan sistem build seperti Maven untuk menyertakan dependensi transitif atau JWT di classpath aplikasi Anda. BouncyCastle 

   ```
   // 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>
   ```

1.  Panggilan`RegisterUsage`dari setiap citra kontainer berbayar dalam penawaran produk Anda.`ProductCode`dan`PublicKeyVersion`diperlukan parameter, dan semua input lainnya adalah opsional. Berikut ini adalah contoh muatan untuk`RegisterUsage`. 

   ```
   {
       "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**  
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.

1.  `RegisterUsage`menghasilkan tanda tangan digital RSA-PSS menggunakan SHA-256 yang dapat Anda gunakan untuk memverifikasi keaslian permintaan. Tanda tangan meliputi kolom-kolom berikut:`ProductCode`,`PublicKeyVersion`, dan`Nonce`. Untuk memverifikasi tanda tangan digital, Anda harus mempertahankan bidang ini dari permintaan. Kode berikut adalah contoh responss terhadap`RegisterUsage`Panggilan. 

   ```
   {
   "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..."
   ```

1. 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 Amazon EKS, seperti Amazon ECR atau Amazon ECR Public. Jika Anda menggunakan Amazon ECR, memastikan bahwa akun meluncurkan tugas Amazon ECS atau Amazon EKS pod memiliki izin pada repositori Amazon ECR. Jika tidak, peluncuran gagal.

1.  Buat[IAM](https://aws.amazon.com/iam/)peran yang memberikan izin untuk kontainer Anda untuk menelepon`RegisterUsage`, seperti yang didefinisikan dalam kode berikut. Anda harus menyediakan IAM role ini di parameter [Peran tugas](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) Amazon ECS atau definisi pod Amazon EKS.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": [
                   "aws-marketplace:RegisterUsage"
                   ],
                   "Effect": "Allow",
                   "Resource": "*"
           }
       ]
   }
   ```

------

1. Buat tugas Amazon ECS atau definisi pod Amazon EKS yang mereferensikan wadah yang telah terintegrasi AWS Marketplace dan mereferensikan peran IAM yang Anda buat di langkah 7. Anda harus mengaktifkan AWS CloudTrail logging dalam definisi tugas jika Anda ingin melihat logging. 

1. Buat Amazon ECS atau Amazon EKS cluster untuk melaksanakan tugas Anda atau pod. Untuk informasi selengkapnya tentang cara membuat Amazon ECS cluster, lihat[Membuat Gugus](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html)di*Panduan Pengembang Layanan Elastic kontainer*. Untuk informasi selengkapnya tentang membuat cluster Amazon EKS (menggunakan Kubernetes versi 1.1.3.x atau yang lebih baru), lihat[Membuat klaster EKS Amazon](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html).

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

1. Saat Anda mendapatkan responss yang valid kembali dari`RegisterUsage`, Anda dapat mulai membuat produk kontainer Anda. Untuk pertanyaan, hubungi[AWS Marketplace Operasi Penjual](https://aws.amazon.com/marketplace/management/contact-us/)Tim. 

## RegisterUsage Contoh Java
<a name="registerusage-java-example"></a>

Contoh berikut menggunakan AWS SDK untuk 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 &MKT; 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();
        }
    }
}
```

# Mengkonfigurasi pengukuran khusus untuk produk kontainer dengan AWS Marketplace Metering Service
<a name="container-metering-meterusage"></a>

**catatan**  
 Untuk penerapan Amazon EKS, perangkat lunak Anda harus menggunakan [peran IAM untuk akun layanan (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) untuk menandatangani panggilan API untuk operasi API. [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html) Menggunakan [EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), peran node, atau kunci akses jangka panjang tidak didukung.  
Untuk penerapan Amazon ECS, perangkat lunak Anda harus menggunakan peran [IAM tugas Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) untuk menandatangani panggilan API untuk operasi API. [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html) Menggunakan peran node atau kunci akses jangka panjang tidak didukung.  
Untuk penerapan Amazon Bedrock AgentCore Runtime, perangkat lunak Anda harus menggunakan [peran eksekusi AgentCore Runtime](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html#runtime-permissions-execution) untuk menandatangani panggilan API untuk operasi API. [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html) Kunci akses jangka panjang tidak didukung.

AWS Marketplace produk kontainer dapat memiliki pengukuran khusus hingga 24 dimensi harga yang berbeda per produk. Setiap dimensi dapat memiliki harga kontrak jangka panjang yang terkait dengannya. Untuk mengaktifkan pengukuran khusus, integrasikan produk container Anda dengan AWS Marketplace Metering Service. Anda dapat menentukan unit harga Anda sendiri dan pengukuran kustom untuk penggunaan tersebut AWS untuk penagihan menggunakan operasi [https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. Bagian berikut menunjukkan cara mengonfigurasi pengukuran khusus untuk produk kontainer Anda.

Dimensi harga didefinisikan di dua lokasi, sekali saat membuat produk Anda di Portal Manajemen AWS Marketplace (portal penjual) dan sekali di perangkat lunak Anda untuk melakukan `MeterUsage` operasi. Metode dua faktor ini memastikan bahwa penawaran berikutnya bekerja sebagaimana dimaksud sebelum dibuat tersedia untuk umum.

Untuk mengatur pengukuran khusus, Anda harus memilih kategori penggunaan, tipe unit, dan dimensi harga: 
+ **Kategori penggunaan**— Kategori penggunaan membantu pembeli memahami produk Anda dan cara menggunakannya. 
+ **Tipe unit**— Tipe unit mendefinisikan satuan ukuran untuk penagihan. Misalnya, bandwidth diukur dalam GBps atau MBps, jumlah host, atau data yang diukur dalam MB, GB, atau TB.
+ **Dimensi harga** — Dimensi harga mewakili fitur atau layanan yang telah Anda tetapkan harga per unit (misalnya, pengguna, pemindaian, vCPUs, atau agen yang digunakan). Dimensi harga bersifat publik. Namun, Anda masih dapat menentukan penawaran pribadi dan Bring Your Own License (BYOL) untuk produk publik. Jangan mengirim harga dalam catatan pengukuran. Anda mengukur jumlah unit, dan kami menggunakannya bersama dengan harga yang Anda tentukan saat membuat produk Anda untuk menghitung tagihan pembeli. 

  Jika harga produk Anda tidak sesuai dengan kategori atau tipe unit yang telah ditentukan sebelumnya, Anda dapat memilih kategori **Unit** generik. Kemudian, gunakan deskripsi dimensi untuk menggambarkan apa unitnya.

Opsional, Anda dapat mendistribusikan penggunaan ke alokasi oleh properti yang Anda melacak. Alokasi direpresentasikan sebagai tag kepada pembeli. Tag ini memungkinkan pembeli untuk melihat biaya mereka dibagi menjadi penggunaan berdasarkan nilai tag. Sebagai contoh, jika Anda mengisi oleh pengguna, dan pengguna memiliki properti “Departemen”, Anda dapat membuat alokasi penggunaan dengan tag yang memiliki kunci “Departemen”, dan satu alokasi per nilai. Ini tidak mengubah harga, dimensi, atau total penggunaan yang Anda laporkan, tetapi memungkinkan pelanggan Anda untuk melihat biaya mereka berdasarkan kategori yang sesuai dengan produk Anda.

Kami menyarankan Anda mengirim catatan pengukuran setiap jam. Namun, Anda dapat menggabungkan penggunaan selama periode harian atau bulanan juga. Jika Anda mengalami pemadaman, Anda dapat menggabungkan penggunaan perangkat lunak pembeli dan mengirimkannya dalam pengukuran jam berikutnya. Anda tidak dapat mengirim lebih dari satu catatan per jam.

*Untuk informasi selengkapnya tentang mengintegrasikan AWS Marketplace Metering Service API untuk produk kontainer dengan harga pengukuran khusus, lihat lab [Integrasikan dengan pengukuran khusus](https://catalog.workshops.aws/mpseller/en-US/container/integrate-custom) bengkel penjual.AWS Marketplace *

**penting**  
Percobaan gratis dan hak prabayar dilacak pada tingkat per jam. Akibatnya, mengirim catatan ini secara terpisah dapat menyebabkan pembeli menjadi kelebihan biaya.

**Topics**
+ [Prasyarat pengukuran](#custom-metering-prereqs)
+ [`MeterUsage`Integrasi pengujian untuk ECS dan EKS](#testing-meterusage-integration)
+ [MeterUsage Integrasi pengujian untuk AgentCore](#testing-agentcore-metering)
+ [Penanganan kesalahan untuk `MeterUsage`](#custom-metering-entitlement-error-handling)
+ [(Opsional) Penandaan terukur vendor](#container-vendor-metered-tagging)
+ [Contoh kode](#container-meter-code-example)
+ [Mengintegrasikan produk kontainer Anda menggunakan pengukuran khusus dengan dan AWS Marketplace Metering Service AWS SDK untuk Java](java-integration-example-meterusage.md)

## Prasyarat pengukuran
<a name="custom-metering-prereqs"></a>

Sebelum menerbitkan produk, Anda harus melakukan hal berikut:

1. Buat produk kontainer baru di Portal Manajemen AWS Marketplace, dan catat kode produknya.

1. Gunakan peran AWS Identity and Access Management (IAM) untuk tugas, pod, atau titik akhir AgentCore Runtime yang menjalankan aplikasi Anda dengan izin IAM yang diperlukan untuk memanggil. `MeterUsage` Kebijakan terkelola `AWSMarketplaceMeteringRegisterUsage` meliputi izin-izin ini. Untuk informasi selengkapnya tentang kebijakan, lihat [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)di *Referensi Kebijakan AWS Terkelola*.

1. (Opsional) Kami menyarankan Anda mengaktifkan AWS CloudTrail logging dalam tugas atau definisi pod jika Anda ingin melihat logging.

1. Lakukan panggilan uji ke operasi `MeterUsage` API dengan catatan untuk semua dimensi harga yang Anda tetapkan.

## `MeterUsage`Integrasi pengujian untuk ECS dan EKS
<a name="testing-meterusage-integration"></a>

Gunakan `MeterUsage` operasi untuk menguji integrasi Anda sebelum mengirimkan gambar Anda AWS Marketplace untuk dipublikasikan.

Panggilan `MeterUsage` dari gambar kontainer dengan menjalankan produk Anda di Amazon Elastic Container Service (Amazon ECS) Service (Amazon ECS) atau Amazon Elastic Kubernetes Service (Amazon EKS Akun AWS ) dengan yang Anda gunakan untuk membuat daftar produk. AWS Marketplace Integrasi pengukuran Anda harus secara dinamis mengatur Wilayah AWS, bukan hard coding itu. Namun, saat menguji, luncurkan setidaknya satu tugas Amazon ECS atau pod Amazon EKS yang berisi kontainer berbayar Anda di Wilayah AS Timur (Virginia Utara) sehingga tim AWS Marketplace operasi dapat memverifikasi pekerjaan Anda dengan log di Wilayah tersebut.

**catatan**  
Jika produk Anda mendukung Amazon ECS dan Amazon EKS, Anda hanya perlu meluncurkan di Amazon EKS bagi kami untuk memvalidasi integrasi Anda.
Uji setiap dimensi sebelum meluncurkan produk Anda ke publik dan setelah menambahkan dimensi baru. Jika Anda tidak mengirim catatan pengukuran untuk setiap dimensi yang terkait dengan produk kontainer, itu akan mengakibatkan kesalahan dengan permintaan yang gagal.

Anda tidak dapat sepenuhnya menguji integrasi sampai produk Anda dipublikasikan dengan semua metadata dan informasi harga yang diperlukan. Jika diminta, tim operasi AWS Marketplace katalog dapat memverifikasi penerimaan catatan pengukuran Anda.

## MeterUsage Integrasi pengujian untuk AgentCore
<a name="testing-agentcore-metering"></a>

Gunakan `MeterUsage` operasi untuk menguji integrasi Anda sebelum mengirimkan gambar Anda AWS Marketplace untuk dipublikasikan.

Panggil `MeterUsage` dari gambar kontainer dengan menjalankan produk Anda di Amazon Bedrock AgentCore dengan AWS akun yang Anda gunakan untuk membuat daftar AWS Marketplace produk. Integrasi pengukuran Anda harus secara dinamis mengatur AWS Wilayah, daripada mengkodekannya dengan keras. Namun, saat menguji, luncurkan setidaknya satu AgentCore agen Amazon Bedrock yang berisi kontainer berbayar Anda di Wilayah AS Timur (Virginia N.) sehingga tim AWS Marketplace operasi dapat memverifikasi pekerjaan Anda dengan log di Wilayah tersebut. 

 Anda tidak perlu menggabungkan catatan penggunaan per jam. Panggil `MeterUsage` setiap pemanggilan agen dengan penggunaan untuk pemanggilan itu.

Anda harus menggunakan AWS SDK versi terbaru yang dirilis untuk bahasa Anda. Ini secara otomatis mengisi `ClientToken` parameter dengan nilai yang dihasilkan secara otomatis untuk membantu idempotensi. Rilis SDK sebelumnya yang tidak mengisi bidang ini tidak akan berfungsi untuk `MeterUsage` panggilan dari dalam Amazon Bedrock. AgentCore Karena masalah jaringan, Anda harus menggunakan kembali permintaan yang sama persis saat mencoba lagi. Melakukan hal itu memastikan bahwa permintaan diperlakukan secara idempoten.

Karena perbedaan perilaku pengukuran yang diharapkan antara Amazon Bedrock AgentCore dan produk kontainer lainnya, kami tidak menyarankan berbagi gambar kontainer yang sama untuk digunakan di Amazon Bedrock dan AgentCore di Amazon ECS atau EKS.

## Penanganan kesalahan untuk `MeterUsage`
<a name="custom-metering-entitlement-error-handling"></a>

Panggil `MeterUsage` pengaturan `DryRun` parameter ke true saat startup kontainer untuk memvalidasi bahwa integrasi pengukuran berfungsi. Jika citra kontainer Anda terintegrasi dengan`MeterUsage`operasi dan menerima pengecualian selain`ThrottlingException`pada startup kontainer, Anda harus mengakhiri kontainer untuk mencegah penggunaan yang tidak sah.

Pengecualian selain`ThrottlingException`dilemparkan hanya pada panggilan awal untuk`MeterUsage`. Panggilan berikutnya dari tugas Amazon ECS yang sama atau pod Amazon EKS atau titik akhir AgentCore Runtime tidak dibuang`CustomerNotSubscribedException`, meskipun pelanggan berhenti berlangganan saat tugas atau pod masih berjalan. Pelanggan tersebut masih dikenakan biaya untuk menjalankan kontainer setelah mereka berhenti berlangganan, dan penggunaannya dilacak.

Lihat [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)di *Referensi AWS Marketplace Metering Service API* untuk deskripsi rinci tentang kesalahan umum untuk`MeterUsage`. Setiap bahasa pemrograman AWS SDK memiliki seperangkat pedoman penanganan kesalahan yang dapat Anda rujuk untuk informasi tambahan. 

## (Opsional) Penandaan terukur vendor
<a name="container-vendor-metered-tagging"></a>

Penandaan yang diukur vendor membantu Vendor Perangkat Lunak Independen (ISVs) memberi pembeli wawasan yang lebih terperinci tentang penggunaan perangkat lunak mereka dan dapat membantu mereka melakukan alokasi biaya.

**catatan**  
Penandaan yang diukur vendor tidak didukung untuk permintaan pengukuran untuk produk Amazon Bedrock. AgentCore 

Anda memiliki beberapa cara untuk menandai penggunaan perangkat lunak pembeli. Salah satunya adalah pertama-tama bertanya kepada pembeli Anda apa yang ingin mereka lihat dalam alokasi biaya mereka. Kemudian Anda dapat membagi penggunaan di seluruh properti yang Anda lacak untuk akun pembeli. Contoh properti termasuk`AccountId`,, `Business Unit``Cost Centers`, dan metadata relevan lainnya untuk produk Anda. Properti ini diekspos ke pembeli sebagai tag. Dengan menggunakan tag, pembeli dapat melihat biayanya dibagi menjadi penggunaan berdasarkan nilai tag di Konsol AWS Penagihan ([https://console.aws.amazon.com/costmanagement/](https://console.aws.amazon.com/costmanagement/)). Penandaan yang diukur vendor tidak mengubah harga, dimensi, atau total penggunaan yang Anda laporkan. Hal ini memungkinkan pelanggan Anda untuk melihat biaya mereka berdasarkan kategori yang sesuai dengan produk Anda.

Dalam kasus penggunaan umum, pembeli berlangganan produk Anda dengan satu Akun AWS. Pembeli juga memiliki banyak pengguna yang terkait dengan langganan produk yang sama. Anda dapat membuat alokasi penggunaan dengan tag yang memiliki kunci`AccountId`, dan kemudian mengalokasikan penggunaan untuk setiap pengguna. Dalam hal ini, pembeli dapat mengaktifkan `AccountId` tag di konsol Billing and Cost Management mereka dan menganalisis penggunaan pengguna individu.

### Pengalaman penjual
<a name="container-vendor-metered-tag-seller"></a>

Penjual dapat menggabungkan catatan pengukuran untuk sumber daya dengan kumpulan tag yang sama alih-alih menggabungkan penggunaan untuk semua sumber daya. Misalnya, penjual dapat membuat catatan pengukuran yang mencakup ember yang berbeda`UsageAllocations`. Setiap bucket mewakili `UsageQuantity` untuk satu set tag, seperti `AccountId` dan`BusinessUnit`. 

Dalam diagram berikut, **Resource 1** memiliki satu set `AccountId` dan `BusinessUnit` tag yang unik, dan muncul di **Rekaman Pengukuran** sebagai entri tunggal. 

**Resource 2** dan **Resource 3** keduanya memiliki `AccountId` tag yang sama`2222`,, dan `BusinessUnit` tag yang sama,`Operations`. Akibatnya, mereka digabungkan menjadi satu `UsageAllocations` entri dalam **Rekaman Pengukuran**.

![\[Diagram yang menunjukkan bagaimana tag metering vendor menggabungkan data penggunaan. Tiga sumber daya (Sumber Daya 1, 2, dan 3) dengan berbeda AccountIds dan BusinessUnits dikonsolidasikan ke dalam Rekaman Pengukuran tunggal dengan UsageAllocations dikelompokkan oleh AccountId dan BusinessUnit sebelum dikirim ke AWS Marketplace Metering Service.\]](http://docs.aws.amazon.com/id_id/marketplace/latest/userguide/images/seller-vendor-meter-tag.png)


Penjual juga dapat menggabungkan sumber daya tanpa tag menjadi satu `UsageAllocation` dengan jumlah penggunaan yang dialokasikan dan mengirimkannya sebagai salah satu entri di. `UsageAllocations`

Batasan meliputi:
+ Jumlah tag — 5
+ Ukuran `UsageAllocations` (kardinalitas) — 2.500

Validasi meliputi:
+ Karakter diperbolehkan untuk kunci tag dan nilai — a-zA-Z 0-9\$1 -= . \$1:\$1 /@
+ Tag maksimum di seluruh `UsageAllocation` daftar - 5
+ Dua tidak `UsageAllocations` dapat memiliki tag yang sama (yaitu, kombinasi yang sama dari kunci tag dan nilai). Jika itu masalahnya, mereka harus menggunakan hal yang sama`UsageAllocation`.
+ Jumlah `AllocatedUsageQuantity` dari `UsageAllocation` harus sama dengan`UsageQuantity`, yang merupakan penggunaan agregat.

### Pengalaman pembeli
<a name="container-vendor-metered-tag-buyer"></a>

Tabel berikut menunjukkan contoh pengalaman pembeli setelah pembeli mengaktifkan tag `AccountId` dan `BusinessUnit` vendor. 

Dalam contoh ini, pembeli dapat melihat penggunaan yang dialokasikan dalam **Laporan Penggunaan Biaya** mereka. Tag yang diukur vendor menggunakan awalan. `“aws:marketplace:isv”` Pembeli dapat mengaktifkannya di Billing and Cost Management, **di bawah Tag Alokasi Biaya AWS, tag alokasi** **biaya yang dihasilkan**.

Baris pertama dan terakhir dari **Laporan Penggunaan Biaya** relevan dengan apa yang dikirim Penjual ke Layanan Pengukuran (seperti yang ditunjukkan dalam [Pengalaman penjual](#container-vendor-metered-tag-seller) contoh).


**Laporan Penggunaan Biaya (Sederhana)**  

| ProductCode  | Pembeli | UsageDimension | UsageQuantity | `aws:marketplace:isv:AccountId ` | `aws:marketplace:isv:BusinessUnit` | 
| --- | --- | --- | --- | --- | --- | 
| xyz | 111122223333 | Jaringan: per (GB) diperiksa  | 70 | 2222 | Operasi | 
| xyz | 111122223333 | Jaringan: per (GB) diperiksa  | 30 | 3333 | Keuangan | 
| xyz | 111122223333 | Jaringan: per (GB) diperiksa  | 20 | 4444 | IA | 
| xyz | 111122223333 | Jaringan: per (GB) diperiksa  | 20 | 5555 | Pemasaran | 
| xyz | 111122223333 | Jaringan: per (GB) diperiksa  | 30 | 1111 | Pemasaran | 

Untuk contoh kode, lihat [`MeterUsage`contoh kode dengan penandaan alokasi penggunaan (Opsional)](#container-meterusage-code-example).

## Contoh kode
<a name="container-meter-code-example"></a>

Contoh kode berikut disediakan untuk membantu Anda mengintegrasikan produk kontainer Anda dengan yang AWS Marketplace APIs diperlukan untuk menerbitkan dan memelihara produk Anda.

### `MeterUsage`contoh kode dengan penandaan alokasi penggunaan (Opsional)
<a name="container-meterusage-code-example"></a>

Contoh kode berikut relevan untuk produk kontainer dengan model harga konsumsi. Contoh Python mengirimkan catatan pengukuran dengan tag alokasi penggunaan yang sesuai untuk membebankan biaya AWS Marketplace kepada pelanggan Anda. pay-as-you-go

```
# NOTE: Your application will need to aggregate usage for the 
#       customer for the hour and set the quantity as seen below. 
# AWS Marketplace can only accept records for up to an hour in the past. 
#
# productCode is supplied after the AWS Marketplace Ops team has 
# published the product to limited

# Import AWS Python SDK
import boto3
import time

usageRecord = [
    { 
        "AllocatedUsageQuantity": 2, 
        "Tags": 
            [ 
                { "Key": "BusinessUnit", "Value": "IT" },
                { "Key": "AccountId", "Value": "123456789" },
            ]

    },
    { 
        "AllocatedUsageQuantity": 1, 
        "Tags": 
            [ 
                { "Key": "BusinessUnit", "Value": "Finance" },
                { "Key": "AccountId", "Value": "987654321" },
            ]

    }
]

marketplaceClient = boto3.client("meteringmarketplace")

response = marketplaceClient.meter_usage(
    ProductCode="testProduct",
    Timestamp=int(time.time()),
    UsageDimension="Dimension1",
    UsageQuantity=3,
    DryRun=False,
    UsageAllocations=usageRecord 
)
```

Untuk informasi selengkapnya`MeterUsage`, lihat [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)di *Referensi AWS Marketplace Metering Service API*.

### Contoh tanggapan
<a name="container-meterusage-code-response"></a>

```
{ "MeteringRecordId": "string" }
```

# Mengintegrasikan produk kontainer Anda menggunakan pengukuran khusus dengan dan AWS Marketplace Metering Service AWS SDK untuk Java
<a name="java-integration-example-meterusage"></a>

AWS Marketplace produk kontainer dapat memiliki pengukuran khusus hingga 24 dimensi harga yang berbeda per produk. Untuk mengaktifkan pengukuran khusus, Anda mengintegrasikan produk container Anda dengan AWS Marketplace Metering Service. Anda dapat menentukan unit harga Anda sendiri dan pengukuran kustom untuk penggunaan tersebut AWS untuk penagihan menggunakan operasi [https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. Contoh berikut menguraikan implementasi yang menggunakan AWS SDK untuk Java untuk mengintegrasikan dengan operasi [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html)`MeterUsage`. 

Untuk detail lengkap, lihat[`MeterUsage`Contoh Java](#meterusage-java-example). Banyak langkah-langkah berikut berlaku terlepas dari bahasa. 

**Contoh: Integrasi Layanan AWS Marketplace Metering**

1. Masuk ke [Portal Manajemen AWS Marketplace](https://aws.amazon.com/marketplace/management/tour).

1. Dari**Aset**, pilih**Kontainer**untuk mulai membuat produk kontainer baru. Membuat produk menghasilkan kode produk untuk produk untuk mengintegrasikan dengan citra kontainer Anda. Untuk informasi tentang izin pengaturan AWS Identity and Access Management (IAM), lihat. [AWS Marketplace izin API pengukuran dan hak](iam-user-policy-for-aws-marketplace-actions.md)

1.  Unduh [AWS Java SDK](https://aws.amazon.com/sdk-for-java/) publik. 
**penting**  
 Untuk memanggil operasi metering API dari Amazon Elastic Kubernetes Service (Amazon EKS)[, Anda harus AWS menggunakan](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) SDK yang didukung dan berjalan di klaster Amazon EKS yang menjalankan Kubernetes 1.13 atau yang lebih baru. 

1. Panggil `MeterUsage` operasi dari tugas atau pod setiap jam sekali untuk setiap penggunaan dimensi. Operasi API menerima satu catatan pengukuran untuk kombinasi unik`Dimension`,`Resource`, dan`Hour`. Sumber daya adalah salah satu Amazon Elastic kontainer Service (Amazon ECS) tugas atau pod Amazon EKS.

   ```
   {
       "ProductCode" : "string", // (required)
       "UsageDimension" : "string", // (required)
       "UsageQuantity":  int, // (optional) Default is 0. Acceptable value from [0, 2147483647 (INT_MAX)]
       "Timestamp": Date, // (required) Timestamp in UTC. Value can be one hour in the past.
       "UsageAllocations": List<UsageAllocation> // (optional) UsageAllocations across 1 or more tags.
   }
   ```
**catatan**  
Dimungkinkan untuk melihat masalah sementara dalam menghubungkan ke. AWS Marketplace Metering Service AWS Marketplace sangat merekomendasikan menerapkan percobaan ulang hingga 30 menit, dengan mundur eksponensial, untuk menghindari pemadaman jangka pendek atau masalah jaringan.

1. Buat kembali versi baru gambar kontainer Anda yang menyertakan `MeterUsage` panggilan, beri tag penampung, dan dorong ke registri Docker apa pun yang kompatibel dengan Amazon ECS atau Amazon EKS, seperti Amazon Elastic Container Registry (Amazon ECR). Jika Anda menggunakan Amazon ECR, memastikan bahwa akun meluncurkan tugas Amazon ECS atau Amazon EKS pod memiliki izin pada repositori Amazon ECR. Jika tidak, operasi gagal.

1. Buat [IAM](https://aws.amazon.com/iam/) role yang memberikan izin untuk kontainer Anda untuk dipanggil`MeterUsage`, seperti yang didefinisikan dalam contoh kode berikut. Anda harus menyediakan peran ini AWS Identity and Access Management (IAM) dalam parameter [Peran Tugas tugas tugas](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) Amazon ECS atau definisi pod Amazon EKS.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": [
                   "aws-marketplace:MeterUsage"
                   ],
                   "Effect": "Allow",
                   "Resource": "*"
           }
       ]
   }
   ```

------

1. Buat tugas Amazon ECS atau definisi pod Amazon EKS yang mereferensikan wadah yang telah terintegrasi AWS Marketplace dan mereferensikan peran IAM yang Anda buat di langkah 6. Jika Anda ingin melihat logging, aktifkan AWS CloudTrail logging dalam definisi tugas. 

1. Buat Amazon ECS atau Amazon EKS cluster untuk menjalankan tugas Anda atau pod. Untuk informasi selengkapnya tentang membuat klaster Amazon ECS, lihat [Membuat klaster](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html) di *Panduan Pengembang Layanan Kontainer Elastis Amazon*. Untuk informasi selengkapnya tentang membuat cluster Amazon EKS (menggunakan Kubernetes versi 1.1.3.x atau yang lebih baru), lihat[Membuat klaster EKS Amazon](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html).

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

1. Saat Anda mendapatkan respons yang valid dari`MeterUsage`untuk masing-masing dimensi yang diterbitkan untuk produk, Anda dapat mulai membuat produk kontainer Anda. Untuk pertanyaan, hubungi[AWS Marketplace Operasi Penjual](https://aws.amazon.com/marketplace/management/contact-us/)Tim. 

## `MeterUsage`Contoh Java
<a name="meterusage-java-example"></a>

Contoh kode berikut menggunakan AWS Marketplace Metering Service AWS SDK untuk Java dan AWS untuk memanggil `MeterUsage` operasi.

Contoh kode berikut panggilan`MeterUsage`operasi tanpa`UsageAllocations`.

```
import com.amazonaws.services.marketplacemetering.AWSMarketplaceMetering;
import com.amazonaws.services.marketplacemetering.AWSMarketplaceMeteringClientBuilder;
import com.amazonaws.services.marketplacemetering.model.MeterUsageRequest;
import com.amazonaws.services.marketplacemetering.model.MeterUsageResult;

import java.util.Date;

public class MeterUsage {
    private static final String PRODUCT_CODE = ".......";
    private final AWSMarketplaceMetering awsMarketplaceMetering;

    public MeterUsage() {
        awsMarketplaceMetering = AWSMarketplaceMeteringClientBuilder.standard().build();
    }

    /**
     * Submits metering record for a FCP Dimension. The API accepts 1 metering record per dimension
     * for a given buyer's resource for a given timestamp hour. Ex. If a buyer is running 10 tasks,
     * the API will accepts 1 call to MeterUsage in an hour for a given dimension for each running task.
     *
     * @param dimension - FCP dimension name provided during the publishing of the product.
     * @param quantity - FCP dimension consumption value for the hour.
     * @param timestamp - Timestamp, in UTC, for which the usage is being reported.
     *                  Timestamp cant be more than 1 hour in the past.
     *                  Make sure the timestamp value is not before the start of the software usage.
     */
    public void callMeterUsage(String dimension, int quantity, Date timestamp) {
        MeterUsageRequest meterUsageRequest = new MeterUsageRequest()
                .withProductCode(PRODUCT_CODE)
                .withUsageDimension(dimension)
                .withUsageQuantity(quantity)
                .withTimestamp(timestamp);
        MeterUsageResult meterUsageResult = awsMarketplaceMetering.meterUsage(meterUsageRequest);
    }
}
```

Contoh kode berikut panggilan`MeterUsage`Operasi dengan`UsageAllocations`.

```
private static String callMeterUsageWithAllocationsByTag(AWSMarketplaceMetering marketplaceMetering) {
        // Tag Keys for the product
        String tagKey1 = "Key1";
        String tagKey2 = "Key2";
        String tagKey3 = "Key3";

        // 1st Usage Allocation bucket which has two Tags [{Key1, Key1Value1},{Key2, Key2Value1}]
        List<Tag> tagsForUsageAllocation1 = Arrays.asList(new Tag().withKey(tagKey1).withValue("Key1Value1"),
                new Tag().withKey(tagKey2).withValue("Key2Value1"));
        UsageAllocation usageAllocation1 = new UsageAllocation()
                .withTags(tagsForUsageAllocation1)
                .withAllocatedUsageQuantity(20);

        // 2nd Usage Allocation bucket which has two Tags [{Key1, Key1Value2},{Key2, Key2Value1}]
        List<Tag> tagsForUsageAllocation2 = Arrays.asList(new Tag().withKey(tagKey1).withValue("Key1Value2"),
                new Tag().withKey(tagKey2).withValue("Key2Value1"));
        UsageAllocation usageAllocation2 = new UsageAllocation()
                .withTags(tagsForUsageAllocation2)
                .withAllocatedUsageQuantity(20);

        // 3rd Usage Allocation bucket which has two Tags [{Key1, Key1Value2},{Key2, Key2Value2},{Key3, Key3Value1}]
        List<Tag> tagsForUsageAllocation3 = Arrays.asList(new Tag().withKey(tagKey1).withValue("Key1Value2"),
                new Tag().withKey(tagKey2).withValue("Key2Value2"),
                new Tag().withKey(tagKey3).withValue("Key3Value1"));
        UsageAllocation usageAllocation3 = new UsageAllocation()
                .withTags(tagsForUsageAllocation3)
                .withAllocatedUsageQuantity(15);

        // 4th Usage Allocation bucket with no tags
        UsageAllocation usageAllocation4 = new UsageAllocation()
                .withAllocatedUsageQuantity(15);

        List<UsageAllocation> usageAllocationList = Arrays.asList(usageAllocation1,
                usageAllocation2,
                usageAllocation3,
                usageAllocation4);

        MeterUsageRequest meterUsageRequest = new MeterUsageRequest()
                .withProductCode("TestProductCode")
                .withUsageDimension("Dimension1")
                .withTimestamp(new Date())
                //UsageQuantity value must match with sum of all AllocatedUsageQuantity
                .withUsageQuantity(70)
                .withUsageAllocations(usageAllocationList);

        MeterUsageResult meterUsageResult;
        try {
            meterUsageResult = marketplaceMetering.meterUsage(meterUsageRequest);
        } catch (Exception e) {
            // Log Error
            throw e;
        }

        return meterUsageResult.getMeteringRecordId();
    }
```

# Harga kontrak untuk produk kontainer dengan AWS License Manager
<a name="container-license-manager-integration"></a>

Untuk produk berbasis kontainer dengan harga kontrak, Anda dapat menggunakan AWS License Manager untuk mengaitkan lisensi dengan produk Anda. AWS License Manager adalah alat manajemen lisensi yang memungkinkan aplikasi Anda untuk melacak dan memperbarui lisensi (juga dikenal sebagai hak) yang telah dibeli oleh pelanggan. Bagian ini memberikan informasi tentang cara mengintegrasikan produk Anda AWS License Manager. Setelah integrasi selesai, Anda dapat mempublikasikan daftar produk Anda AWS Marketplace.

Jika Anda mengintegrasikan License Manager dengan produk AWS Marketplace for Containers Anywhere untuk Amazon EKS Anywhere, Amazon ECS Anywhere, Amazon Elastic Compute Cloud (Amazon EC2), atau infrastruktur lokal, ikuti petunjuknya. [Mengintegrasikan AWS Marketplace untuk Kontainer Di Mana Saja dengan License Manager](container-anywhere-license-manager-integration.md)

Untuk informasi selengkapnya AWS License Manager, lihat [Panduan AWS License Manager Pengguna](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) dan [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)bagian *Referensi AWS CLI Perintah*.

Untuk informasi selengkapnya tentang integrasi AWS License Manager dengan produk kontainer dengan harga kontrak, lihat lab [Integrasikan dengan pembayaran di muka](https://catalog.workshops.aws/mpseller/en-US/container/integrate-contract) bengkel *AWS Marketplace penjual*.

**Topics**
+ [Harga kontrak untuk produk kontainer](#container-contracts)
+ [Model lisensi](#container-LM-license-models)
+ [AWS License Manager prasyarat integrasi](#container-LM-prereqs)
+ [Mengintegrasikan produk kontainer dengan License Manager](#container-integrate-with-LM)
+ [Operasi API License Manager](#container-LM-API-calls)
+ [Perpanjangan dan peningkatan lisensi](#container-LM-lic-renew-upgrade)
+ [Mengintegrasikan AWS Marketplace untuk Kontainer Di Mana Saja dengan License Manager](container-anywhere-license-manager-integration.md)

## Harga kontrak untuk produk kontainer
<a name="container-contracts"></a>

Untuk produk berbasis kontainer dengan harga kontrak, AWS Marketplace menagih pelanggan Anda di muka atau dengan jadwal pembayaran yang Anda tentukan, berdasarkan kontrak antara Anda dan pelanggan Anda. Setelah itu, mereka berhak menggunakan sumber daya tersebut. 

Untuk menetapkan harga Anda, pilih satu atau lebih durasi kontrak yang Anda tawarkan kepada pelanggan. Anda dapat memasukkan harga yang berbeda untuk setiap durasi kontrak. Pilihan Anda adalah durasi 1 bulan, 12 bulan, 24 bulan, dan 36 bulan. Untuk penawaran pribadi, Anda dapat menentukan durasi khusus dalam beberapa bulan (hingga 60 bulan). 

Pilih kategori yang paling menggambarkan harga produk Anda. Kategori harga muncul untuk pelanggan di situs AWS Marketplace web. Anda dapat memilih dari **Bandwidth** (GB/s, MB/s), **Data** (GB, MB, TB), **Host**, **Requests**, **Tiers**, atau **Users**. Jika tidak ada kategori standar yang sesuai dengan kebutuhan Anda, Anda dapat memilih kategori **Unit** yang lebih umum. 

Penawaran ini memungkinkan hingga 24 dimensi untuk ditambahkan ke dalamnya.


**Contoh: Aplikasi penyimpanan data**  

|   | Harga 1 bulan | Harga 12 bulan  | Harga 24 bulan  | Harga P36 bulan  | 
| --- | --- | --- | --- | --- | 
|  Data tidak terenkripsi (GB)  |  \$11,50/GB  |  \$116,00/GB  |  \$130.00/GB  |  \$160.00/GB  | 
|  Data terenkripsi (GB)  |  \$11,55/GB  |  \$116,60/GB  |  \$131.20/GB  |  \$161.20/GB  | 


**Contoh: Produk pemantauan log**  

|   | Harga 1 bulan | Harga 12 bulan  | Harga 24 bulan | Harga 36 bulan | 
| --- | --- | --- | --- | --- | 
|  Dasar (10 host dipantau, 5 kontainer dipantau)  |  \$1100  |  \$11000  | \$12000  | \$14000 | 
|  Standar (20 host dipantau, 10 kontainer dipantau)  |  \$1200  |  \$12000  | \$14000  | \$18000 | 
|  Pro (40 host dipantau, 20 kontainer dipantau)  |  \$1400  |  \$14000  | \$18000  | \$116.000 | 
|  Host tambahan dipantau per jam  | \$110  | \$1100  |  \$1200 | \$1400 | 
|  Kontainer tambahan dipantau per jam  | \$110  | \$1100  |  \$1200 | \$1400 | 

**catatan**  
Harga bisa untuk jangka waktu berikut: 1 bulan, 12 bulan, 24 bulan, atau 36 bulan. Anda dapat memilih untuk menawarkan satu atau lebih opsi ini untuk produk Anda. Durasi harus sama di setiap dimensi.   

**Example**  
Misalnya, dalam kasus di mana Anda memiliki `ReadOnlyUsers` dan `AdminUsers` dimensi, jika Anda menawarkan harga tahunan untuk ReadOnlyUsers, Anda harus menawarkan harga tahunan juga. `AdminUsers`


### Perpanjangan otomatis
<a name="ami-contracts-automatic-renewals"></a>

 Ketika pelanggan membeli produk Anda melalui AWS Marketplace menggunakan kontrak kontainer, mereka dapat setuju untuk memperbarui persyaratan kontrak secara otomatis. Pelanggan terus membayar hak setiap bulan atau selama 1, 2, atau 3 tahun. 

Pelanggan dapat mengubah pengaturan perpanjangan mereka kapan saja. Untuk informasi selengkapnya, lihat [Memodifikasi kontrak yang ada](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-container-contracts.html#modify-existing-contract) di *Panduan AWS Marketplace Pembeli*.

## Model lisensi
<a name="container-LM-license-models"></a>

AWS Marketplace integrasi dengan AWS License Manager mendukung dua model lisensi:
+ [Model lisensi yang dapat dikonfigurasi](#container-LM-config-lic-model)
+ [Model lisensi berjenjang](#container-LM-tiered-lic-model)

### Model lisensi yang dapat dikonfigurasi
<a name="container-LM-config-lic-model"></a>

Model lisensi yang dapat dikonfigurasi (juga dikenal sebagai model lisensi yang dapat diukur) memberikan hak kepada pembeli untuk sejumlah sumber daya tertentu setelah pembeli memperoleh lisensi. 

Anda menetapkan dimensi harga dan harga per unit. Kemudian, pembeli dapat memilih jumlah sumber daya yang ingin mereka beli.

**Example dimensi harga dan harga per unit**  
Anda dapat menetapkan dimensi harga (seperti cadangan data) dan harga per unit (seperti \$130/unit).  
Pembeli dapat memilih untuk membeli 5, 10, atau 20 unit.   
Produk Anda melacak dan penggunaan meter untuk mengukur jumlah sumber daya yang dikonsumsi.

Dengan model konfigurasi, hak dihitung dalam salah satu dari dua cara:
+ [Lisensi drawdown](#container-floating-lic)
+ [Lisensi mengambang](#container-floating-lic) 

#### Lisensi drawdown
<a name="container-drawndown-lic"></a>

 Lisensi diambil dari kumpulan jumlah lisensi yang diizinkan saat digunakan. Hak tersebut diperiksa secara permanen dan tidak dapat dikembalikan ke kumpulan lisensi.

**Example Memproses data dalam jumlah terbatas**  
Seorang pengguna berhak untuk memproses 500 GB data. Ketika mereka terus memproses data, kuantitas diambil dari kumpulan 500 GB hingga semua lisensi 500 GB dikonsumsi.

Untuk lisensi drawdown, Anda dapat menggunakan operasi `CheckoutLicense` API untuk memeriksa unit lisensi (hak) yang digunakan. 

**Example cadangan ke Amazon S3 untuk sejumlah unit/tahun**  
Anda memiliki produk penyimpanan yang memungkinkan pencadangan ke Amazon Simple Storage Service hingga 1.024 unit untuk data selama satu tahun. Aplikasi Anda dapat diluncurkan dengan menggunakan beberapa instans Amazon EC2. Aplikasi Anda memiliki mekanisme untuk melacak dan mengumpulkan data. Perangkat lunak Anda memanggil operasi `CheckoutLicense` API dengan ID Produk pada setiap cadangan atau pada interval tetap untuk memperbarui jumlah yang dikonsumsi.   
Dalam contoh ini, perangkat lunak Anda memanggil operasi `CheckoutLicense` API untuk memeriksa 10 unit data. Ketika total kapasitas mencapai batas cadangan yang telah dibeli pelanggan, panggilan API gagal.

**Permintaan**

```
linux-machine ~]$ aws license-manager checkout-license\
--product-sku "2205b290-19e6-4c76-9eea-377d6bf7la47" \
--checkout-type "PERPETUAL" \
--key-fingerprint "aws:294406891311:AWS/Marketplace:issuer-fingerprint" \
--entitlements "Name=DataConsumption, Value=l0, Unit=Count" \
--client-token "AKIAIOSFODNN7EXAMPLE"
```

**Respons**

```
{"CheckoutType": "PERPETUAL",
"EntitlementsAllowed": [{
"Name": "IntermediateTier",
"Units": "None"
}],
"Expiration": "2021-04-22Tl9:02:36",
"IssuedAt": "2021-04-22Tl8:02:36",
"LicenseArn": "arn:aws:license-manager::294406891311:license:l-16bf01b...",
"LicenseConsumptionToken": "AKIAIOSFODNN7EXAMPLE"
}
```

#### Lisensi mengambang
<a name="container-floating-lic"></a>

 Lisensi dikembalikan ke kumpulan jumlah lisensi yang diizinkan setelah digunakan.

Untuk lisensi mengambang, aplikasi memeriksa hak dari kumpulan hak menggunakan operasi `CheckoutLicense` API saat sumber daya digunakan. Respons operasi `CheckoutLicense` API mencakup token konsumsi lisensi yang merupakan pengenal unik untuk checkout. Token konsumsi lisensi dapat digunakan untuk melakukan tindakan tambahan pada hak yang diperiksa, seperti memeriksanya kembali ke lisensi atau memperpanjang checkout.

Untuk memeriksa kembali hak ke kumpulan, gunakan operasi `CheckInLicense` API saat sumber daya tidak lagi digunakan.

```
aws license-manager check-in-license --license-consumption-token "f1603b3c1f574b7284db84..."
```

Jika terjadi kegagalan untuk memeriksa hak (jika aplikasi macet), hak akan memeriksa kembali ke kumpulan secara otomatis setelah 60 menit. Jika sumber daya digunakan lebih dari 60 menit, itu adalah praktik terbaik untuk menjaga hak diperiksa dari kumpulan dengan menggunakan operasi `ExtendLicenseConsumption` API selama sumber daya digunakan.

```
aws license-manager extend-license-consumption --license-consumption-token "f1603b3c1f574b7284..."
```

**Example jumlah pengguna dari batas atas tetap**  
Seorang pengguna berhak atas 500 pengguna simultan pada aplikasi. Saat pengguna masuk dan keluar, pengguna ditarik dan dikembalikan ke kumpulan 500 pengguna. Namun, aplikasi tidak dapat menarik lebih dari 500 pengguna dari pool karena 500 pengguna simultan adalah batas atas tetap.

Untuk hak mengambang, Anda dapat menggunakan operasi `CheckInLicense` API untuk mengembalikan unit lisensi ke kumpulan hak. 

**Example jumlah pengguna bersamaan selama satu tahun**  
Produk Anda diberi harga berdasarkan jumlah pengguna bersamaan. Pelanggan membeli lisensi untuk 10 pengguna selama satu tahun. Pelanggan meluncurkan perangkat lunak dengan memberikan izin AWS Identity and Access Management (IAM). Ketika pengguna log in, aplikasi Anda memanggil operasi `CheckoutLicense` API untuk mengurangi kuantitas sebesar 1. Saat pengguna log out, aplikasi mengembalikan lisensi tersebut ke pool dengan memanggil operasi `CheckInLicense` API. Jika Anda tidak menelepon`CheckInLicense`, unit lisensi akan secara otomatis diperiksa setelah 1 jam.

**catatan**  
Dalam Permintaan berikut, `key-fingerprint` bukan nilai placeholder tetapi nilai sebenarnya dari sidik jari yang dengannya semua lisensi akan dipublikasikan.

**Permintaan**

```
aws license-manager checkout-license\
--product-sku "2205b290-19e6-4c76-9eea-377d6bf7la47" \
--checkout-type "PROVISIONAL" \
--key-fingerprint "aws:294406891311:AWS/Marketplace:issuer-fingerprint" \
--entitlements "Name=ReadOnlyUSers, Value=l0, Unit=Count" \
--client-token "AKIAIOSFODNN7EXAMPLE"
```

**Respons**

```
{
  "CheckoutType": "PROVISIONAL",
  "EntitlementsAllowed": [
    {
      "Name": "ReadOnlyUsers", 
      "Count": 10,
      "Units": "Count",
      "Value": "Enabled"
    }
},
  "Expiration": "2021-04-22Tl9:02: 36",
  "IssuedAt": "2021-04-22Tl8:02:36",
  "LicenseArn": "arn:aws:license-manager::294406891311:license:l-16bf01b...",
  "LicenseConsumptionToken": "AKIAIOSFODNN7EXAMPLE"
}
```

### Model lisensi berjenjang
<a name="container-LM-tiered-lic-model"></a>

Model lisensi berjenjang memberikan hak kepada pembeli ke tingkat tertentu, atau tingkat, fitur aplikasi setelah pembeli memperoleh lisensi. 

Anda membuat tingkatan untuk produk Anda, seperti Basic, Intermediate, dan Premium. Pembeli kemudian memilih salah satu tingkatan yang telah ditentukan.

Aplikasi tidak perlu melacak atau mengukur penggunaan aplikasi.

Dengan model lisensi berjenjang, hak tidak dihitung melainkan menandakan tingkat layanan yang diperoleh oleh pelanggan. 

Jika Anda ingin menawarkan fitur yang dibundel bersama-sama, tingkatan lebih disukai. 

**Example Tingkat Dasar, Menengah, dan Premium**  
Pelanggan dapat menandatangani kontrak untuk salah satu dari tiga kemungkinan tingkatan perangkat lunak: Dasar, Menengah, atau Premium. Masing-masing tingkatan ini memiliki harga sendiri. Perangkat lunak Anda dapat mengidentifikasi tingkat yang telah didaftarkan pelanggan dengan menjalankan operasi `CheckoutLicense` API dan menentukan semua tingkatan yang mungkin dalam permintaan.   
Tanggapan permintaan berisi hak yang sesuai dengan tingkat yang telah diperoleh pelanggan. Berdasarkan informasi ini, perangkat lunak dapat memberikan pengalaman pelanggan yang sesuai.

#### Permintaan
<a name="container-LM-tiered-request"></a>

```
linux-machine  ~]$ aws  license-manager   checkout-license\
--product-sku  "2205b290-19e6-4c76-9eea-377d6bf7la47"  \
--checkout-type  "PROVISIONAL"  \
--key-fingerprint  "aws:294406891311:AWS/Marketplace:issuer-fingerprint" \
--entitlements  "Name=BasicTier,  Unit=None"   "Name=IntermediateTier,  Unit=None"	\ "Name=PremiumTier, Unit=None"
```

#### Respons
<a name="container-LM-tiered-response"></a>

```
{
  "CheckoutType": "PROVISIONAL",
  "EntitlementsAllowed": [
    {
      "Name": "IntermediateTier", 
      "Units": "None"
    }
},
  "Expiration": "2021-04-22Tl9:02:36",
  "IssuedAt": "2021-04-22Tl8:02:36",
  "LicenseArn": "arn:aws:license-manager::294406891311:license:l-16bf01b...",
  "LicenseConsumptionToken": "AKIAIOSFODNN7EXAMPLE"
}
```

## AWS License Manager prasyarat integrasi
<a name="container-LM-prereqs"></a>

Sebelum menerbitkan produk, Anda harus melakukan hal berikut:

1. Buat produk kontainer baru di Portal Manajemen AWS Marketplace, dan catat kode produknya.

   Untuk informasi selengkapnya, lihat [Ikhtisar: Buat produk kontainer](container-product-getting-started.md#create-container-product).

1. Gunakan peran IAM untuk tugas atau pod yang menjalankan aplikasi Anda dengan izin IAM yang diperlukan untuk memanggil operasi`CheckoutLicense`,`ExtendLicenseConsumption`, dan `CheckInLicense` API.

   Izin IAM yang diperlukan dirinci dalam kebijakan IAM berikut.

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Sid":"VisualEditorO",
            "Effect":"Allow",
            "Action":[
               "license-manager:CheckoutLicense",
               "license-manager:GetLicense",
               "license-manager:CheckInLicense",
               "license-manager:ExtendLicenseConsumption",
               "license-manager:ListReceivedLicenses"
            ],
            "Resource":"*"
         }
      ]
   }
   ```

------

1. Lakukan panggilan uji ke operasi `RegisterUsage` API dengan catatan untuk semua dimensi harga yang Anda tentukan.

## Mengintegrasikan produk kontainer dengan License Manager
<a name="container-integrate-with-LM"></a>

**Untuk mengintegrasikan produk berbasis kontainer Anda dengan License Manager**

1. Setel izin IAM untuk memanggil License Manager. Untuk informasi selengkapnya, lihat [AWS License Manager prasyarat integrasi](#container-LM-prereqs).

1. Unduh AWS SDK.
**catatan**  
Jangan mengkonfigurasi AWS kredensional dalam perangkat lunak Anda. AWS kredensil untuk pembeli diperoleh secara otomatis saat runtime saat container Anda berjalan dalam instans Amazon EC2, tugas Amazon ECS, atau pod Amazon EKS.

1. Tambahkan cek lisensi ke produk Anda.

   Produk Anda dapat memanggil operasi `CheckoutLicense` API di mana pun pemeriksaan lisensi harus dilakukan. Untuk memeriksa lisensi, produk Anda harus tahu:

   1. Penerbit lisensi tepercaya ()AWS Marketplace

   1. SKU Produk aplikasi (ID Produk)

   1. Hak untuk memeriksa aplikasi ini

   Panggilan API bervariasi berdasarkan jenis lisensi harga yang Anda siapkan.

1. Publikasikan daftar produk Anda di AWS Marketplace.

## Operasi API License Manager
<a name="container-LM-API-calls"></a>

Untuk mengelola lisensi yang disimpan di akun License Manager pelanggan, perangkat lunak Anda dapat menggunakan operasi API berikut:
+ `GetLicense`— API yang dapat ditanyakan oleh perangkat lunak. Ini mengambil status lisensi yang dibeli (yaitu kedaluwarsa atau segera kedaluwarsa) dan mengirimkan pemberitahuan status kepada pelanggan.
+ `CheckoutLicense`— Menemukan lisensi yang telah dibeli pengguna. Anda juga dapat menggunakan operasi `CheckoutLicense` API untuk memperbarui kuantitas lisensi ketika pengguna telah menggunakan sejumlah lisensi. Dengan`CheckoutLicense`, Anda dapat terus memeriksa jumlah lisensi yang digunakan oleh pelanggan. Ketika pelanggan kehabisan semua lisensi, panggilan ini mengembalikan kesalahan. Untuk informasi tentang irama yang disarankan untuk dijalankan`CheckoutLicense`, lihat[Perpanjangan dan peningkatan lisensi](#container-LM-lic-renew-upgrade).
+ `ExtendLicenseConsumption`— Dalam hal dimensi mengambang, ketika perangkat lunak memeriksa lisensi, lisensi akan kembali ke kolam secara otomatis setelah 60 menit. Jika Anda ingin memperpanjang waktu lisensi tetap diperiksa, gunakan operasi `ExtendLicenseConsumption` API untuk memperpanjang lisensi selama 60 menit lagi.
+ `CheckInLicense`— Dalam kasus dimensi mengambang, ketika Anda ingin mengembalikan lisensi ke kumpulan hak, gunakan operasi `CheckInLicense` API.
+ `ListReceivedLicenses`API - Daftar lisensi yang dibeli oleh pembeli.

## Perpanjangan dan peningkatan lisensi
<a name="container-LM-lic-renew-upgrade"></a>

Pelanggan dapat memperbarui atau meningkatkan lisensi mereka di. Portal Manajemen AWS Marketplace Setelah mereka melakukan pembelian tambahan AWS Marketplace , buat versi baru dari lisensi yang mencerminkan hak baru. Perangkat lunak Anda membaca hak baru dengan menggunakan operasi API yang sama. Anda tidak perlu melakukan sesuatu yang berbeda dalam hal integrasi License Manager untuk menangani pembaruan dan peningkatan.

Karena perpanjangan lisensi, peningkatan, pembatalan, dan sebagainya, kami menyarankan agar produk Anda memanggil operasi `CheckoutLicense` API dengan irama reguler saat produk sedang digunakan. Dengan menggunakan operasi `CheckoutLicense` API pada irama reguler, produk dapat mendeteksi perubahan hak seperti upgrade dan kedaluwarsa.

Kami menyarankan Anda melakukan panggilan `CheckoutLicense` API setiap 15 menit. 

# Mengintegrasikan AWS Marketplace untuk Kontainer Di Mana Saja dengan License Manager
<a name="container-anywhere-license-manager-integration"></a>

Sebagai AWS Marketplace penjual, Anda dapat berintegrasi AWS License Manager dengan produk AWS Marketplace for Containers Anywhere untuk Amazon EKS Anywhere, Amazon ECS Anywhere, Amazon EC2, atau infrastruktur lokal. Bagian berikut memberikan instruksi untuk integrasi ini.

Untuk informasi umum tentang integrasi License Manager dengan AWS Marketplace, termasuk model lisensi yang tersedia, lihat[Harga kontrak untuk produk kontainer dengan AWS License Manager](container-license-manager-integration.md). Untuk informasi selengkapnya AWS License Manager, lihat [Panduan AWS License Manager Pengguna](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) dan [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)bagian *Referensi AWS CLI Perintah*.

**Topics**
+ [Mengintegrasikan produk AWS Marketplace for Containers Anywhere dengan License Manager](#containers-anywhere-integrate-with-LM)
+ [Menguji integrasi License Manager secara lokal](#container-testing-LM-integration-locally)
+ [Menguji integrasi License Manager di Amazon EKS](#container-testing-LM-integration-EKS)
+ [Hak lisensi mengambang dengan License Manager](#container-LM-floating-license)
+ [Praktik terbaik untuk mengintegrasikan dengan License Manager untuk penerapan lokal](#container-LM-best-practices-on-prem)
+ [`LicenseManagerCredentialsProvider`- Implementasi Java](#container-license-manager-cred-provider-java)
+ [`LicenseManagerCredentialsProvider`- `Golang` implementasi](#container-license-manager-cred-provider-golang)

## Mengintegrasikan produk AWS Marketplace for Containers Anywhere dengan License Manager
<a name="containers-anywhere-integrate-with-LM"></a>

Gunakan petunjuk berikut untuk mengintegrasikan produk AWS Marketplace for Containers Anywhere Anda AWS License Manager.

**Untuk mengintegrasikan produk Containers Anywhere Anda AWS Marketplace dengan License Manager**

1. Buka browser web dan masuk ke file [Portal Manajemen AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Buat ID produk untuk produk kontainer Anda dengan melakukan langkah-langkah berikut. Anda akan menggunakan ID ini dalam gambar kontainer Anda untuk pemeriksaan lisensi di langkah selanjutnya.

   1. Dari bilah menu, perluas **Aset**, dan pilih **Kontainer**.

   1. **Masukkan nama yang menghadap pelanggan untuk produk Anda, dan pilih Buat.** Anda dapat mengubah nama ini nanti.

   1. Catat **ID Produk**. Anda akan menggunakannya saat membuat atau memperbarui detail harga produk.
**Tip**  
Jika Anda kehilangan ID produk Anda, Anda dapat menemukannya di Portal Manajemen AWS Marketplace dengan memilih **Container** dari menu **Assets**. Halaman **Kontainer** menampilkan daftar produk Anda dengan produk terkait mereka IDs.

1. Unduh AWS SDK publik terbaru dan kemudian instal di aplikasi penampung Anda. Anda dapat menemukan petunjuk penginstalan untuk AWS SDK pilihan Anda di [Tools to Build on AWS](https://aws.amazon.com/tools/).
**catatan**  
Untuk memanggil operasi License Manager API dari Amazon EKS Anywhere atau klaster Kubernetes yang tidak disediakan oleh AWS, Anda harus menggunakan SDK yang didukung. AWS Untuk melihat daftar yang didukung AWS SDKs, lihat [Menggunakan AWS SDK yang didukung](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html).

1. Buat AWS License Manager klien dengan penyedia kredensi khusus sehingga dapat memberikan kredensil ke aplikasi kontainer yang digunakan di AWS maupun lokal. Untuk kode sumber lengkap untuk penyedia kredensi kustom`LicenseCredentialProvider`, lihat bagian berikut:
   + [`LicenseManagerCredentialsProvider`- Implementasi Java](#container-license-manager-cred-provider-java)
   + [`LicenseManagerCredentialsProvider`- `Golang` implementasi](#container-license-manager-cred-provider-golang)

    `LicenseCredentialsProvider`memperluas rantai penyedia kredensi default AWS SDK untuk penggunaan lokal dengan menambahkan. `LicenseManagerTokenCredentialsProvider` Ini memberikan kredensil dengan menggunakan License Manager OIDC mengeluarkan token identitas di lingkungan lokal. Anda harus menyertakan kode sumber untuk `LicenseCredentialsProvider` di classpath aplikasi Anda.
**catatan**  
Memperluas aplikasi kontainer `DefaultCredentialsProvider` memungkinkan aplikasi kontainer yang sama untuk mendapatkan kredensil saat berjalan AWS dan saat berjalan di lingkungan lokal. Jika aplikasi kontainer sudah menggunakan rantai penyedia kredensi kustom alih-alih default, itu juga dapat diperpanjang dengan menambahkan `LicenseManagerTokenCredentialsProvider` ke rantai kustom.

   Cuplikan kode berikut adalah contoh membuat AWS License Manager klien menggunakan Java.

   ```
   LicenseManagerClientBuilder clientBuilder = LicenseManagerClient.builder().credentialsProvider(LicenseCredentialsProvider.create());
   ```

1. Panggil operasi `CheckoutLicense` API dengan menggunakan `aws license-manager checkout-license` perintah dari setiap image container berbayar dalam penawaran produk Anda. Ini memeriksa bahwa pembeli berhak menggunakan lisensi untuk aplikasi Anda. Jika pembeli berhak atas aplikasi, `CheckoutLicense` berhasil dan mengembalikan hak yang diminta dan nilainya. Jika pembeli tidak berhak atas aplikasi, `CheckoutLicense` melempar pengecualian.

   Parameter berikut diperlukan saat memanggil operasi `CheckoutLicense` API:
   + `CheckoutType`— Nilai yang valid adalah `PROVISIONAL` atau`PERPETUAL`:
     + Gunakan `PERPETUAL` ketika jumlah hak yang diperiksa akan habis dari kolam.

       Contoh: Pembeli berhak memproses 500 GB data. Ketika mereka terus memproses data, kuantitas ditarik ke bawah dan habis dari kumpulan 500 GB.
     + Gunakan `PROVISIONAL` untuk hak lisensi mengambang di mana hak diperiksa keluar dari kumpulan dan dikembalikan setelah digunakan.

       Contoh: Pengguna berhak atas 500 pengguna simultan pada aplikasi. Saat pengguna masuk atau keluar, pengguna ditarik atau dikembalikan ke kumpulan 500 pengguna. Untuk mempelajari lebih lanjut tentang hak lisensi mengambang, lihat. [Hak lisensi mengambang dengan License Manager](#container-LM-floating-license)
   + `ClientToken`— Pengidentifikasi unik dan peka huruf besar/kecil. Sebaiknya gunakan UUID acak untuk setiap permintaan unik.
   + `Entitlements`— Daftar hak yang akan diperiksa.
     + Untuk hak fitur, berikan `Name` dan `Unit` properti sebagai berikut.

       ```
       {
         "Name": "<Entitlement_Name>",
         "Unit": "None"
       }
       ```
     + Untuk hak yang dihitung, berikan, `Name``Unit`, dan `Count` properti sebagai berikut.

       ```
       {
         "Name": "<Entitlement_Name>",
         "Unit": "<Entitlement_Unit>",
         "Value": <Desired_Count>
       }
       ```
   + `KeyFingerprint`— Sidik jari kunci untuk lisensi yang dikeluarkan oleh AWS Marketplace adalah`aws:294406891311:AWS/Marketplace:issuer-fingerprint`. Menggunakan sidik jari kunci ini memastikan bahwa lisensi dikeluarkan oleh AWS Marketplace dan bukan oleh entitas yang tidak dapat diandalkan.
   + `ProductSKU`— ID Produk yang dihasilkan Portal Manajemen AWS Marketplace pada langkah sebelumnya.

   Cuplikan berikut adalah contoh panggilan menggunakan operasi `CheckoutLicense` API menggunakan. AWS CLI

   ```
   aws license-manager checkout-license \
   --product-sku "2205b290-19e6-4c76-9eea-377d6bf71a47" \
   --checkout-type "PROVISIONAL" \
   --client-token "79464194dca9429698cc774587a603a1" \
   --entitlements "Name=AWS::Marketplace::Usage/Drawdown/DataConsumption, Value=10, Unit=Gigabytes" \
   --key-fingerprint "aws:294406891311:AWS/Marketplace:issuer-fingerprint"
   ```
**catatan**  
Untuk memeriksa lisensi, aplikasi kontainer memerlukan akses jaringan keluar untuk menggunakan License Manager. Aplikasi yang digunakan di lokasi mungkin mengalami akses jaringan keluar yang tidak dapat diandalkan atau lambat. Aplikasi ini harus menyertakan percobaan ulang yang memadai saat memanggil License Manager. Untuk informasi selengkapnya, lihat [Praktik terbaik untuk mengintegrasikan dengan License Manager untuk penerapan lokal](#container-LM-best-practices-on-prem).

1. Hubungi operasi `CheckoutLicense` API dengan irama reguler untuk mengidentifikasi perubahan apa pun pada lisensi pelanggan karena perpanjangan, peningkatan, atau pembatalan yang dilakukan. AWS Marketplace Irama tergantung pada aplikasi. Kami merekomendasikan untuk memeriksa lisensi sekali sehari untuk mengambil perubahan secara otomatis tanpa campur tangan pembeli.

   Aplikasi yang digunakan di lokasi mungkin memiliki akses jaringan keluar yang tidak dapat diandalkan untuk memeriksa lisensi pada irama reguler. Dalam kasus seperti itu, aplikasi harus menggunakan lisensi cache untuk ketahanan yang memadai. Untuk informasi selengkapnya, lihat [Praktik terbaik untuk mengintegrasikan dengan License Manager untuk penerapan lokal](#container-LM-best-practices-on-prem).

1. Setelah Anda mengintegrasikan `CheckoutLicense` panggilan dengan aplikasi container Anda, buat versi baru image container Docker Anda dengan perubahan.

1. Perbarui bagan Helm aplikasi Anda untuk menerima rahasia Kubernetes sebagai input opsional yang berisi konfigurasi untuk mengakses lisensi menggunakan License Manager. APIs Rahasia konfigurasi akan berisi token identitas yang dikeluarkan oleh License Manager dan AWS Identity and Access Management peran yang akan digunakan oleh penyedia kredensi kustom yang dijelaskan sebelumnya untuk mendapatkan AWS kredensil untuk memanggil License Manager APIs saat aplikasi kontainer di-deploy di lokasi. Juga, tambahkan Wilayah AWS sebagai input dengan nilai default`us-east-1`.

   Pembeli yang menerapkan aplikasi kontainer di tempat dapat membuat rahasia Kubernetes melalui pengalaman AWS Marketplace pembeli untuk produk kontainer. Berikan nama rahasia Kubernetes sebagai input ke perintah. `helm install` Rahasia konfigurasi dikonfigurasi dalam format berikut.

   ```
   apiVersion: v1
   kind: Secret
   metadata:
     name: aws-marketplace-license-config
   type: Opaque
   stringData:
     license_token: <token_value> // License Manager issued JWT token
     iam_role: <role_arn> // AWS Identity and Access Management role to assume with license token
   ```

1. Perbarui template penerapan aplikasi di bagan Helm untuk gambar kontainer yang terintegrasi dengan menyertakan AWS License Manager yang berikut:
   + Akun layanan untuk pod - Akun layanan diperlukan untuk penerapan Helm di Amazon EKS. Ini digunakan untuk mendapatkan izin untuk memanggil operasi License Manager API dengan menyiapkan peran IAM untuk akun layanan pada image container. Untuk informasi selengkapnya tentang peran IAM untuk akun layanan, lihat [peran IAM untuk akun layanan](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html).
   + Akses lisensi untuk penerapan lokal — Rahasia konfigurasi lisensi diperlukan untuk menyediakan kredensil dan izin yang sesuai untuk memanggil operasi License Manager API untuk penerapan Helm di lingkungan lokal. Pembeli akan menghasilkan dan memberikan rahasia lisensi kepada Helm dari pengalaman AWS Marketplace pembeli.

   Cuplikan kode berikut adalah spesifikasi penyebaran sampel dengan akun layanan, konfigurasi lisensi, dan rahasia tarik gambar.

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: example-app
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: example-app
     template:
       metadata:
         labels:
           app: example-app
   spec:
         // Service account for pod
         serviceAccountName: {{ .Values.serviceAccountName }}
         containers:
           - name: example-app
             image: example-app
             ports:
               - containerPort: 8001
   // Add the following conditional attributes
   {{ - if .Values.awsmp.licenseConfigSecretName }}
             //Mount the license volume to the container image
             volumeMounts:
               - name: awsmp-product-license
                 mountPath: "/var/run/secrets/product-license"
             //Add following environment variable to container for credential
   provider
             env:
               - name: AWS_WEB_IDENTITY_REFRESH_TOKEN_FILE
                 value: "/var/run/secrets/product-license/license_token"
               - name: AWS_ROLE_ARN
                   valueFrom:
                       secretKeyRef:
                       name: {{ .Values.aws.licenseConfigSecretName }}
                       key: iam_role
         //Mount the license secret as a volume to the pod
         volumes:
           - name: awsmp-product-license
             secret:
               secretName: {{ .Values.aws.licenseConfigSecretName }}
               optional: true
   {{ - end }}
   ```
**catatan**  
Rahasia konfigurasi lisensi adalah opsional. Pembeli hanya menggunakan nilai untuk penerapan lokal. Untuk AWS penerapan, spesifikasi penyebaran harus menyertakan akun layanan untuk gambar terintegrasi License Manager.

1. Uji integrasi License Manager secara lokal dan di Amazon EKS dengan melakukan langkah-langkah di bagian berikut:

   1. [Menguji integrasi License Manager secara lokal](#container-testing-LM-integration-locally)

   1. [Menguji integrasi License Manager di Amazon EKS](#container-testing-LM-integration-EKS)

1. Setelah berhasil memverifikasi integrasi License Manager baik di dalam AWS maupun lokal, Anda dapat membuat daftar produk container dengan mengikuti langkah-langkah di dalamnya[Ikhtisar: Buat produk kontainer](container-product-getting-started.md#create-container-product).

## Menguji integrasi License Manager secara lokal
<a name="container-testing-LM-integration-locally"></a>

Anda dapat menggunakan minikube atau penyiapan lainnya untuk menguji integrasi License Manager pada klaster Kubernetes mana pun secara lokal. Pastikan bahwa klaster Kubernetes memiliki akses internet keluar untuk memanggil operasi License Manager API.

**Untuk menguji integrasi License Manager secara lokal**

1. Buat lisensi pengujian di akun penjual uji dengan hak yang diinginkan. Untuk menyiapkan lisensi pengujian, lihat [CreateLicense](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_CreateLicense.html)di *Referensi AWS License Manager API*. Atau, gunakan skrip berikut untuk membuat lisensi pengujian dan kemudian buat hibah lisensi ke akun pembeli uji untuk menggunakan lisensi. Skrip berikut menggunakan kredensil akun penjual uji.

   ```
   read -p 'AWS Account for test buyer: ' TEST_BUYER_ACCOUNT_ID
   read -p 'License entitlements: ' ENTITLEMENTS
   
   # TEST_SELLER_ACCOUNT_ID="109876543210"
   # ENTITLEMENTS="{\"Name\": \"ByData\",\"MaxCount\": 1000,\"Overage\":true,\"Unit\": \"Gigabits\",\"AllowCheckIn\": true}"
   
   # Create License
   
   NOW=$(date +"%Y-%m-%dT00:00:00+00:00")
   
   PRODUCT_NAME="My awesome product"
   PRODUCT_SKU="c97b7825-44c4-4f42-b025-12baa4c171e0"
   
   LICENSE_BENEFICIARY=" arn:aws:iam::$TEST_BUYER_ACCOUNT_ID:root "
   LICENSE_ISSUER_NAME="test-seller"
   LICENSE_NAME="test-seller-license"
   
   CLIENT_TOKEN="b3920968-a94f-4547-af07-3dd232319367"
   CONSUMPTION_TTL=180
   CONSUMPTION_RENEW_TYPE="None"
   
   HOME_REGION="us-east-1"
   
   LICENSE_ARN=$(aws license-manager create-license --license-name "$LICENSE_NAME" --product-name "$PRODUCT_NAME" --product-sku "$PRODUCT_SKU" --issuer Name="$LICENSE_ISSUER_NAME" --home-region "$HOME_REGION" --validity Begin="$NOW" --entitlements "$ENTITLEMENTS" --beneficiary "$LICENSE_BENEFICIARY" --consumption-configuration RenewType="$CONSUMPTION_RENEW_TYPE",ProvisionalConfiguration={MaxTimeToLiveInMinutes=$CONSUMPTION_TTL} --client-token "$CLIENT_TOKEN" | jq -r ".LicenseArn" )
   
   echo "License arn: $LICENSE_ARN"
   
   # Create Grant
   
   GRANT_TOKEN="e9a14140-4fca-4219-8230-57511a6ea6"
   GRANT_NAME="test-grant"
   
   GRANT_ARN=$(aws license-manager create-grant --grant-name "$GRANT_NAME" --license-arn "$LICENSE_ARN" --principals "$LICENSE_BENEFICIARY" --home-region "$HOME_REGION" --client-token "$GRANT_TOKEN" --allowed-operations "CheckoutLicense" "CheckInLicense" "ExtendConsumptionLicense" "CreateToken" | jq -r ".GrantArn")
   
   echo "Grant arn: $GRANT_ARN"
   ```

1. Buat rahasia Kubernetes dengan token lisensi dan peran IAM menggunakan format rahasia yang ditentukan sebelumnya. Gunakan operasi License Manager `CreateToken` API untuk menghasilkan token lisensi. Kemudian, gunakan operasi IAM `CreateRole` API untuk membuat peran IAM dengan izin dan kebijakan kepercayaan. Lihat contoh dalam skrip berikut. Skrip berikut menggunakan kredensil akun pembeli uji.

   ```
   read -p 'AWS Account for test license: ' TEST_ACCOUNT_ID
   read -p 'License Arn' LICENSE_ARN
   # Create IAM Role
   ROLE_NAME="AWSLicenseManagerConsumptionTestRole"
   ROLE_DESCRIPTION="Role to test AWS License Manager integration on-prem"
   ROLE_POLICY_ARN="arn:aws:iam::aws:policy/service-role/AWSLicenseManagerConsumptionPolicy"
   ROLE_TRUST_POLICY="{\"Version\": \"2012-10-17\",\"Statement\": [{ \"Effect\":\"Allow\", \"Principal\": { \"Federated\": \"openid-license-manager.amazonaws.com\" }, \"Action\": \"sts:AssumeRoleWithWebIdentity\",\"Condition\": { \"ForAnyValue:StringLike\": { \"openid-license-manager.amazonaws.com:amr\": \"aws:license-manager:token-issuer-account-id:${TEST_ACCOUNT_ID}\" }}}]}"
   ROLE_SESSION_DURATION=3600
   
   ROLE_ARN=$(aws iam create-role --role-name "$ROLE_NAME" --description "$ROLE_DESCRIPTION" --assume-role-policy-document "$ROLE_TRUST_POLICY" --max-session-duration $ROLE_SESSION_DURATION | jq ".Role" | jq -r ".Arn")
   
   aws iam attach-role-policy --role-name "$ROLE_NAME" --policy-arn "$ROLE_POLICY_ARN"
   
   echo "Role arn: $ROLE_ARN"
   
   # Create Token
   CLIENT_TOKEN="b3920968-a94f-4547-af07-3dd232319367"
   
   TOKEN=$(aws license-manager create-token --license-arn $LICENSE_ARN --role-arns $ROLE_ARN --client-token $CLIENT_TOKEN | jq '.Token')
   
   echo "License access token: $TOKEN"c
   ```

1. Siapkan klaster Kubernetes yang dihosting di luar. AWS Gunakan untuk menguji bahwa aplikasi kontainer dapat terhubung ke AWS License Manager API dari lingkungan selain AWS dan bahwa penyedia kredensi khusus terintegrasi dengan baik dalam aplikasi.

1. Menerapkan token lisensi dan peran IAM yang dihasilkan sebelumnya ke dalam klaster Kubernetes lokal.

   ```
   kubectl create secret generic "awsmp-license-access-config" \
   --from-literal=license_token=${TOKEN} \
   --from-literal=iam_role=${ROLE_ARN}
   ```

1. Terapkan aplikasi Anda melalui Helm dengan nama rahasia sebagai masukan dan verifikasi bahwa aplikasi dapat memanggil operasi License Manager API untuk melakukan pemeriksaan hak. Untuk perubahan spesifikasi Helm dan penerapan, lihat Langkah 9 di. [Mengintegrasikan produk AWS Marketplace for Containers Anywhere dengan License Manager](#containers-anywhere-integrate-with-LM)

## Menguji integrasi License Manager di Amazon EKS
<a name="container-testing-LM-integration-EKS"></a>

Anda juga dapat menguji integrasi License Manager di Amazon EKS. Uji untuk memastikan bahwa aplikasi dapat memanggil operasi License Manager API tanpa rahasia konfigurasi lisensi. Juga pastikan bahwa akun layanan dapat digunakan untuk mengatur Peran IAM untuk Akun Layanan (IRSA) dan memberikan kredensi yang relevan untuk aplikasi.

**Untuk menguji integrasi License Manager di Amazon EKS**

1. Buat lisensi pengujian di akun penjual uji dengan hak yang diinginkan. Lihat [referensi CreateLicense API](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_CreateLicense.html) untuk menyiapkan lisensi pengujian Anda atau gunakan skrip berikut untuk membuatnya dan membuat hibah lisensi ke akun pembeli pengujian untuk menggunakan lisensi. Skrip berikut menggunakan kredensil akun penjual uji.

   ```
   read -p 'AWS Account for test buyer: ' TEST_BUYER_ACCOUNT_ID
   read -p 'License entitlements: ' ENTITLEMENTS
   
   # TEST_SELLER_ACCOUNT_ID="109876543210"
   # ENTITLEMENTS="{\"Name\": \"ByData\",\"MaxCount\": 1000,\"Overage\": true,\"Unit\": \"Gigabits\",\"AllowCheckIn\": true}"
   
   # Create License
   
   NOW=$(date +"%Y-%m-%dT00:00:00+00:00")
   
   PRODUCT_NAME="My awesome product"
   PRODUCT_SKU="c97b7825-44c4-4f42-b025-12baa4c171e0"
   
   LICENSE_BENEFICIARY=" arn:aws:iam::$TEST_BUYER_ACCOUNT_ID:root "
   LICENSE_ISSUER_NAME="test-seller"
   LICENSE_NAME="test-seller-license"
   
   CLIENT_TOKEN="b3920968-a94f-4547-af07-3dd232319367"
   CONSUMPTION_TTL=180
   CONSUMPTION_RENEW_TYPE="None"
   
   HOME_REGION="us-east-1"
   
   LICENSE_ARN=$(aws license-manager create-license --license-name "$LICENSE_NAME" --product-name "$PRODUCT_NAME" --product-sku "$PRODUCT_SKU" --issuer Name="$LICENSE_ISSUER_NAME" --home-region "$HOME_REGION" --validity Begin="$NOW" --entitlements "$ENTITLEMENTS" --beneficiary "$LICENSE_BENEFICIARY" --consumption-configuration RenewType="$CONSUMPTION_RENEW_TYPE",ProvisionalConfiguration={MaxTimeToLiveInMinutes=$CONSUMPTION_TTL} --client-token "$CLIENT_TOKEN" | jq -r ".LicenseArn" )
   
   echo "License arn: $LICENSE_ARN"
   
   # Create Grant
   
   GRANT_TOKEN="e9a14140-4fca-4219-8230-57511a6ea6"
   GRANT_NAME="test-grant"
   
   GRANT_ARN=$(aws license-manager create-grant --grant-name "$GRANT_NAME" --license-arn "$LICENSE_ARN" --principals "$LICENSE_BENEFICIARY" --home-region "$HOME_REGION" --client-token "$GRANT_TOKEN" --allowed-operations "CheckoutLicense" "CheckInLicense" "ExtendConsumptionLicense" "CreateToken" | jq -r ".GrantArn")
   
   echo "Grant arn: $GRANT_ARN"
   ```

1. Buat cluster pengujian Amazon EKS dari konfigurasi yang diinginkan, atau jalankan perintah berikut untuk menggunakan konfigurasi default.

   ```
   aws ec2 create-key-pair --region us-west-2 --key-name eks-key-pair
   ```

   ```
   eksctl create cluster \
   --name awsmp-eks-test-example \
   --region us-west-2 \
   --with-oidc \
   --ssh-access \
   --ssh-public-key eks-key-pair
   ```

1. Buat akun layanan untuk klaster yang ada dan kaitkan dengan peran IAM. Perintah berikut menciptakan peran IAM dengan. `AWSLicenseManagerConsumptionPolicy` Kemudian, perintah melampirkannya ke akun `test_sa` layanan cluster Amazon EKS di mana gambar terintegrasi License Manager harus digunakan. Akibatnya, akun layanan bisa mendapatkan kredensi yang sesuai untuk memanggil operasi License Manager API.

   ```
   eksctl create iamserviceaccount \
   --name test_sa \
   --namespace test_namespace \
   --cluster awsmp-eks-test-example \
   --attach-policy-arn "arn:aws:iam::aws:policy/service-role/AWSLicenseManagerConsumptionPolicy" \
   --approve \
   --override-existing-serviceaccounts
   ```

1. Terapkan aplikasi melalui Helm di akun layanan tempat peran IAM dikaitkan dari perintah sebelumnya. Verifikasi bahwa aplikasi dapat memanggil operasi License Manager API untuk melakukan pemeriksaan hak.

## Hak lisensi mengambang dengan License Manager
<a name="container-LM-floating-license"></a>

Dengan lisensi mengambang, saat pengguna masuk ke aplikasi, lisensi diambil dari kumpulan lisensi yang tersedia. Saat pengguna keluar, lisensi ditambahkan kembali ke kumpulan lisensi yang tersedia.

Untuk lisensi mengambang, aplikasi menggunakan operasi `CheckoutLicense` API untuk memeriksa hak dari kumpulan hak saat sumber daya digunakan. Respons operasi `CheckoutLicense` API mencakup token konsumsi lisensi yang merupakan pengidentifikasi unik untuk checkout. Token konsumsi lisensi dapat melakukan tindakan tambahan pada hak yang diperiksa, seperti memeriksanya kembali ke kumpulan lisensi atau memperpanjang checkout.

Ketika sumber daya tidak lagi digunakan, aplikasi menggunakan operasi `CheckInLicense` API untuk memeriksa hak kembali ke kumpulan.

```
aws license-manager check-in-license \
--license-consumption-token "f1603b3c1f574b7284db84a9e771ee12"
```

Jika memeriksa lisensi kembali ke pool gagal, misalnya, jika aplikasi mogok selama operasi, hak akan diperiksa kembali ke kolam secara otomatis setelah 60 menit. Karena itu, jika sumber daya digunakan lebih dari 60 menit, itu adalah praktik terbaik untuk menjaga hak diperiksa dari kolam. Untuk melakukan ini, gunakan operasi `ExtendLicenseConsumption` API selama sumber daya digunakan.

```
aws license-manager extend-license-consumption \
--license-consumption-token "f1603b3c1f574b7284db84a9e771ee12"
```

## Praktik terbaik untuk mengintegrasikan dengan License Manager untuk penerapan lokal
<a name="container-LM-best-practices-on-prem"></a>

Penerapan aplikasi kontainer di lingkungan lokal mungkin mengalami akses jaringan keluar yang tidak dapat diandalkan. Gunakan praktik terbaik berikut untuk menambah ketahanan guna menghindari gangguan layanan kepada pembeli karena potensi masalah yang disebabkan oleh konektivitas internet yang buruk:
+ **Coba lagi yang memadai** - Masalah jaringan sementara dapat membuat aplikasi Anda tidak terhubung. AWS License Manager Terapkan percobaan ulang hingga 30 menit, dengan mundur eksponensial. Ini dapat membantu menghindari pemadaman jangka pendek atau masalah jaringan.
+ **Hindari batas keras** — Aplikasi yang digunakan dalam cluster yang terhubung dapat secara teratur memeriksa lisensi untuk mengidentifikasi perubahan apa pun karena peningkatan atau pembaruan. Dengan akses keluar yang tidak dapat diandalkan, aplikasi mungkin tidak dapat mengidentifikasi perubahan tersebut. Bila memungkinkan, aplikasi harus menghindari gangguan layanan kepada pembeli karena ketidakmampuan untuk memeriksa lisensi melalui License Manager. Aplikasi dapat kembali pada pengalaman uji coba gratis atau sumber terbuka ketika lisensi kedaluwarsa dan mereka tidak dapat memeriksa apakah lisensi valid.
+ **Beri tahu pelanggan** — Saat menggunakan lisensi yang di-cache, setiap perubahan pada lisensi (termasuk pembaruan atau peningkatan) tidak secara otomatis tercermin pada beban kerja yang sedang berjalan. Beri tahu pelanggan Anda (bahwa mereka harus mengizinkan akses keluar ke aplikasi lagi sementara sehingga aplikasi dapat memperbarui lisensi yang di-cache. Misalnya, beri tahu pelanggan melalui aplikasi itu sendiri atau melalui dokumentasinya. Demikian pula, ketika kembali ke serangkaian fungsi yang lebih rendah, beri tahu pelanggan bahwa hak mereka habis atau lisensi kedaluwarsa. Kemudian, mereka dapat memilih untuk meningkatkan atau memperbarui.

## `LicenseManagerCredentialsProvider`- Implementasi Java
<a name="container-license-manager-cred-provider-java"></a>

`LicenseCredentialsProvider`memperluas rantai penyedia kredensi default AWS SDK untuk penggunaan lokal dengan menambahkan. `LicenseManagerTokenCredentialsProvider` 

**`LicenseCredentialsProvider`**

```
package com.amazon.awsmp.license;

import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.auth.credentials.internal.LazyAwsCredentialsProvider;
import software.amazon.awssdk.utils.SdkAutoCloseable;

public class LicenseCredentialsProvider implements AwsCredentialsProvider, SdkAutoCloseable {
    private static final LicenseCredentialsProvider CREDENTIALS_PROVIDER = new LicenseCredentialsProvider();
    private final LazyAwsCredentialsProvider providerChain;

    private LicenseCredentialsProvider() {
        this.providerChain = createChain();
    }

    public static LicenseCredentialsProvider create() {
        return CREDENTIALS_PROVIDER;
    }

    @Override
    public AwsCredentials resolveCredentials() {
        return this.providerChain.resolveCredentials();
    }

    @Override
    public void close() {
        this.providerChain.close();
    }

    private LazyAwsCredentialsProvider createChain() {
        return LazyAwsCredentialsProvider.create(() -> {
            AwsCredentialsProvider[] credentialsProviders = new AwsCredentialsProvider[]{
                    DefaultCredentialsProvider.create(),
                    LicenseManagerTokenCredentialsProvider.create()};

            return AwsCredentialsProviderChain.builder().reuseLastProviderEnabled(true)
                    .credentialsProviders(credentialsProviders).build();
        });
    }
}
```

**`LicenseManagerTokenCredentialsProvider`**

`LicenseManagerTokenCredentialsProvider`menyediakan kredensil dengan menggunakan License Manager OIDC mengeluarkan token identitas di lingkungan lokal. Anda harus menyertakan kode sumber untuk `LicenseCredentialsProvider` di classpath aplikasi Anda.

```
package com.amazon.awsmp.license;

import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.core.SdkSystemSetting;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.core.retry.RetryPolicyContext;
import software.amazon.awssdk.core.retry.conditions.OrRetryCondition;
import software.amazon.awssdk.core.retry.conditions.RetryCondition;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain;
import software.amazon.awssdk.services.licensemanager.LicenseManagerClient;
import software.amazon.awssdk.services.licensemanager.model.GetAccessTokenRequest;
import software.amazon.awssdk.services.licensemanager.model.GetAccessTokenResponse;
import software.amazon.awssdk.services.sts.StsClient;
import software.amazon.awssdk.services.sts.auth.StsAssumeRoleWithWebIdentityCredentialsProvider;
import software.amazon.awssdk.services.sts.model.AssumeRoleWithWebIdentityRequest;
import software.amazon.awssdk.services.sts.model.IdpCommunicationErrorException;
import software.amazon.awssdk.utils.IoUtils;
import software.amazon.awssdk.utils.SdkAutoCloseable;
import software.amazon.awssdk.utils.StringUtils;
import software.amazon.awssdk.utils.SystemSetting;

import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import java.util.function.Supplier;

public class LicenseManagerTokenCredentialsProvider implements AwsCredentialsProvider, SdkAutoCloseable {

    private final StsAssumeRoleWithWebIdentityCredentialsProvider credentialsProvider;
    private final RuntimeException loadException;

    private Path licenseAccessTokenFile;
    private String roleArn;
    private String roleSessionName;
    private StsClient stsClient;
    private LicenseManagerClient lmClient;

    public static LicenseManagerTokenCredentialsProvider create() {
        return new Builder().build();
    }

    @Override
    public AwsCredentials resolveCredentials() {
        if (this.loadException != null) {
            throw this.loadException;
        }
        return this.credentialsProvider.resolveCredentials();
    }

    @Override
    public void close() {
        IoUtils.closeQuietly(this.credentialsProvider, null);
        IoUtils.closeQuietly(this.stsClient, null);
        IoUtils.closeIfCloseable(this.lmClient, null);
    }

    private LicenseManagerTokenCredentialsProvider(Builder builder) {
        StsAssumeRoleWithWebIdentityCredentialsProvider credentialsProvider = null;
        RuntimeException loadException = null;

        try {
            this.licenseAccessTokenFile = Paths.get(StringUtils.trim(LicenseSystemSetting.AWS_WEB_IDENTITY_REFRESH_TOKEN_FILE.getStringValueOrThrow()));
            this.roleArn = SdkSystemSetting.AWS_ROLE_ARN.getStringValueOrThrow();
            this.roleSessionName = SdkSystemSetting.AWS_ROLE_SESSION_NAME.getStringValue().orElse("aws-sdk-java-" + System.currentTimeMillis());
            this.stsClient = builder.stsClient != null ? builder.stsClient : StsClientFactory.create();
            this.lmClient = builder.lmClient != null ? builder.lmClient : LicenseManagerClientFactory.create();

            AssumeRoleWithWebIdentityRequest request = AssumeRoleWithWebIdentityRequest.builder()
                    .roleArn(this.roleArn).roleSessionName(this.roleSessionName).build();

            Supplier<AssumeRoleWithWebIdentityRequest> supplier = new AssumeRoleRequestSupplier(request,
                    this.licenseAccessTokenFile, this.lmClient);

            credentialsProvider = StsAssumeRoleWithWebIdentityCredentialsProvider.builder()
                    .stsClient(this.stsClient).refreshRequest(supplier).build();
        } catch (RuntimeException ex) {
            loadException = ex;
        }

        this.credentialsProvider = credentialsProvider;
        this.loadException = loadException;
    }

    public static final class Builder {
        private Path licenseAccessTokenFile;
        private String roleArn;
        private String roleSessionName;
        private StsClient stsClient;
        private LicenseManagerClient lmClient;

        public LicenseManagerTokenCredentialsProvider build() {
            return new LicenseManagerTokenCredentialsProvider(this);
        }

        public LicenseManagerTokenCredentialsProvider.Builder licenseAccessTokenFile(Path licenseAccessTokenFile) {
            this.licenseAccessTokenFile = licenseAccessTokenFile;
            return this;
        }

        public LicenseManagerTokenCredentialsProvider.Builder roleArn(String roleArn) {
            this.roleArn = roleArn;
            return this;
        }

        public LicenseManagerTokenCredentialsProvider.Builder roleSessionName(String roleSessionName) {
            this.roleSessionName = roleSessionName;
            return this;
        }

        public LicenseManagerTokenCredentialsProvider.Builder stsClient(StsClient stsClient) {
            this.stsClient = stsClient;
            return this;
        }

        public LicenseManagerTokenCredentialsProvider.Builder lmClient(LicenseManagerClient lmClient) {
            this.lmClient = lmClient;
            return this;
        }
    }

    private static final class AssumeRoleRequestSupplier implements Supplier {
        private final LicenseManagerClient lmClient;
        private final AssumeRoleWithWebIdentityRequest request;
        private final Path webIdentityRefreshTokenFile;

        AssumeRoleRequestSupplier(final AssumeRoleWithWebIdentityRequest request,
                                                 final Path webIdentityRefreshTokenFile,
                                                 final LicenseManagerClient lmClient) {
            this.lmClient = lmClient;
            this.request = request;
            this.webIdentityRefreshTokenFile = webIdentityRefreshTokenFile;
        }

        public AssumeRoleWithWebIdentityRequest get() {
            return this.request.toBuilder()
                    .webIdentityToken(getIdentityToken())
                    .build();
        }

        private String getIdentityToken() {
            return refreshIdToken(readRefreshToken(this.webIdentityRefreshTokenFile));
        }

        private String readRefreshToken(Path file) {
            try (InputStream webIdentityRefreshTokenStream = Files.newInputStream(file)) {
                return IoUtils.toUtf8String(webIdentityRefreshTokenStream);
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }

        private String refreshIdToken(String licenseRefreshToken) {
            final GetAccessTokenRequest request = GetAccessTokenRequest.builder()
                    .token(licenseRefreshToken)
                    .build();

            GetAccessTokenResponse response = this.lmClient.getAccessToken(request);
            return response.accessToken();
        }
    }

    private static final class LicenseManagerClientFactory {
        private static final Duration DEFAULT_API_TIMEOUT = Duration.ofSeconds(30);
        private static final Duration DEFAULT_API_ATTEMPT_TIMEOUT = Duration.ofSeconds(10);

        public static LicenseManagerClient create() {
            return getLicenseManagerClient();
        }

        private static LicenseManagerClient getLicenseManagerClient() {
            ClientOverrideConfiguration configuration = ClientOverrideConfiguration.builder()
                    .apiCallTimeout(DEFAULT_API_TIMEOUT)
                    .apiCallAttemptTimeout(DEFAULT_API_ATTEMPT_TIMEOUT)
                    .build();

            LicenseManagerClient client = LicenseManagerClient.builder()
                    .region(configureLicenseManagerRegion())
                    .credentialsProvider(AnonymousCredentialsProvider.create())
                    .overrideConfiguration(configuration).build();
            return client;
        }

        private static Region configureLicenseManagerRegion() {
            Region defaultRegion = Region.US_EAST_1;

            Region region;
            try {
                region = (new DefaultAwsRegionProviderChain()).getRegion();
            } catch (RuntimeException ex) {
                region = defaultRegion;
            }
            return region;
        }
    }

    private static final class StsClientFactory {
        private static final Duration DEFAULT_API_TIMEOUT = Duration.ofSeconds(30);
        private static final Duration DEFAULT_API_ATTEMPT_TIMEOUT = Duration.ofSeconds(10);

        public static StsClient create() {
            return getStsClient();
        }

        private static StsClient getStsClient() {
            OrRetryCondition retryCondition = OrRetryCondition.create(new StsRetryCondition(),
                    RetryCondition.defaultRetryCondition());

            ClientOverrideConfiguration configuration = ClientOverrideConfiguration.builder()
                    .apiCallTimeout(DEFAULT_API_TIMEOUT)
                    .apiCallAttemptTimeout(DEFAULT_API_ATTEMPT_TIMEOUT)
                    .retryPolicy(r -> r.retryCondition(retryCondition))
                    .build();

            return StsClient.builder()
                    .region(configureStsRegion())
                    .credentialsProvider(AnonymousCredentialsProvider.create())
                    .overrideConfiguration(configuration).build();
        }

        private static Region configureStsRegion() {
            Region defaultRegion = Region.US_EAST_1;
            Region stsRegion;
            try {
                stsRegion = (new DefaultAwsRegionProviderChain()).getRegion();
            } catch (RuntimeException ex) {
                stsRegion = defaultRegion;
            }
            return stsRegion;
        }

        private static final class StsRetryCondition implements RetryCondition {
            public boolean shouldRetry(RetryPolicyContext context) {
                return context.exception() instanceof IdpCommunicationErrorException;
            }
        }
    }

    private enum LicenseSystemSetting implements SystemSetting {
        AWS_WEB_IDENTITY_REFRESH_TOKEN_FILE("aws.webIdentityRefreshTokenFile");

        private String systemProperty;
        private String defaultValue = null;

        LicenseSystemSetting(String systemProperty) {
            this.systemProperty = systemProperty;
        }

        @Override
        public String property() {
            return this.systemProperty;
        }

        @Override
        public String environmentVariable() {
            return this.name();
        }

        @Override
        public String defaultValue() {
            return this.defaultValue;
        }
    }
}
```

## `LicenseManagerCredentialsProvider`- `Golang` implementasi
<a name="container-license-manager-cred-provider-golang"></a>

**`LicenseCredentialsProvider`**

`LicenseCredentialsProvider`memperluas rantai penyedia kredensi default AWS SDK untuk penggunaan lokal dengan menambahkan. `LicenseManagerTokenCredentialsProvider` 

```
package lib

import (
	"context"
	"fmt"
	"sync"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
)

// LicenseCredentialsProvider is the custom credential provider that can retrieve valid temporary aws credentials
type LicenseCredentialsProvider struct {
	fallBackProvider   aws.CredentialsProvider
	mux                sync.RWMutex
	licenseCredentials aws.Credentials
	err                error
}

// NewLicenseCredentialsProvider method will create a LicenseCredentialProvider Object which contains valid temporary aws credentials
func NewLicenseCredentialsProvider() (*LicenseCredentialsProvider, error) {
	licenseCredentialProvider := &LicenseCredentialsProvider{}
	fallBackProvider, err := createCredentialProvider()
	if err != nil {
		return licenseCredentialProvider, fmt.Errorf("failed to create LicenseCredentialsProvider, %w", err)
	}
	licenseCredentialProvider.fallBackProvider = fallBackProvider
	return licenseCredentialProvider, nil
}

// Retrieve method will retrieve temporary aws credentials from the credential provider
func (l *LicenseCredentialsProvider) Retrieve(ctx context.Context) (aws.Credentials, error) {
	l.mux.RLock()
	defer l.mux.RUnlock()
	l.licenseCredentials, l.err = l.fallBackProvider.Retrieve(ctx)
	return l.licenseCredentials, l.err
}

func createCredentialProvider() (aws.CredentialsProvider, error) {
	// LoadDefaultConfig will examine all "default" credential providers
	ctx := context.TODO()
	cfg, err := config.LoadDefaultConfig(ctx)
	if err != nil {
		return nil, fmt.Errorf("failed to create FallBackProvider, %w", err)
	}

	var useFallbackProvider bool
	if cfg.Credentials != nil {
		if _, err := cfg.Credentials.Retrieve(ctx); err != nil {
			// If the "default" credentials provider cannot retrieve credentials, enable fallback to customCredentialsProvider.
			useFallbackProvider = true
		}
	} else {
		useFallbackProvider = true
	}

	if useFallbackProvider {
		customProvider, err := newLicenseManagerTokenCredentialsProvider()
		if err != nil {
			return cfg.Credentials, fmt.Errorf("failed to create fallBackProvider, %w", err)
		}
		// wrap up customProvider with CredentialsCache to enable caching
		cfg.Credentials = aws.NewCredentialsCache(customProvider)
	}
	return cfg.Credentials, nil
}
```

**`LicenseManagerTokenCredentialsProvider`**

`LicenseManagerTokenCredentialsProvider`menyediakan kredensil dengan menggunakan License Manager OIDC mengeluarkan token identitas di lingkungan lokal. Anda harus menyertakan kode sumber untuk `LicenseCredentialsProvider` di classpath aplikasi Anda.

```
package lib

import (
	"context"
	"fmt"
	"io/ioutil"
	"os"
	"sync"
	"time"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/sts"
)

const awsRefreshTokenFilePathEnvVar = "AWS_LICENSE_ACCESS_FILE"

// licenseManagerTokenCredentialsProvider defines and contains StsAssumeRoleWithWebIdentityProvider
type licenseManagerTokenCredentialsProvider struct {
	stsCredentialProvider *stsAssumeRoleWithWebIdentityProvider
	mux                   sync.RWMutex
	licenseCredentials    aws.Credentials
	err                   error
}

// Retrieve method will retrieve credentials from credential provider.
// Make this method public to make this provider satisfies CredentialProvider interface
func (a *licenseManagerTokenCredentialsProvider) Retrieve(ctx context.Context) (aws.Credentials, error) {
	a.mux.RLock()
	defer a.mux.RUnlock()
	a.licenseCredentials, a.err = a.stsCredentialProvider.Retrieve(ctx)
	return a.licenseCredentials, a.err
}

// newLicenseManagerTokenCredentialsProvider will create and return a LicenseManagerTokenCredentialsProvider Object which wraps up stsAssumeRoleWithWebIdentityProvider
func newLicenseManagerTokenCredentialsProvider() (*licenseManagerTokenCredentialsProvider, error) {
	// 1. Retrieve variables From yaml environment
	envConfig, err := config.NewEnvConfig()
	if err != nil {
		return &licenseManagerTokenCredentialsProvider{}, fmt.Errorf("failed to create LicenseManagerTokenCredentialsProvider, %w", err)
	}
	roleArn := envConfig.RoleARN
	var roleSessionName string
	if envConfig.RoleSessionName == "" {
		roleSessionName = fmt.Sprintf("aws-sdk-go-v2-%v", time.Now().UnixNano())
	} else {
		roleSessionName = envConfig.RoleSessionName
	}
	tokenFilePath := os.Getenv(awsRefreshTokenFilePathEnvVar)
	b, err := ioutil.ReadFile(tokenFilePath)
	if err != nil {
		return &licenseManagerTokenCredentialsProvider{}, fmt.Errorf("failed to create LicenseManagerTokenCredentialsProvider, %w", err)
	}
	refreshToken := aws.String(string(b))

	// 2. Create stsClient
	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		return &licenseManagerTokenCredentialsProvider{}, fmt.Errorf("failed to create LicenseManagerTokenCredentialsProvider, %w", err)
	}
	stsClient := sts.NewFromConfig(cfg, func(o *sts.Options) {
		o.Region = configureStsClientRegion(cfg.Region)
		o.Credentials = aws.AnonymousCredentials{}
	})

	// 3. Configure StsAssumeRoleWithWebIdentityProvider
	stsCredentialProvider := newStsAssumeRoleWithWebIdentityProvider(stsClient, roleArn, roleSessionName, refreshToken)

	// 4. Build and return
	return &licenseManagerTokenCredentialsProvider{
		stsCredentialProvider: stsCredentialProvider,
	}, nil
}

func configureStsClientRegion(configRegion string) string {
	defaultRegion := "us-east-1"
	if configRegion == "" {
		return defaultRegion
	} else {
		return configRegion
	}
}
```