

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Produits à base de conteneurs sur AWS Marketplace
<a name="container-based-products"></a>

**Important**  
Le 1er mars 2026, le lancement rapide pour les déploiements de cartes Helm sur Amazon EKS AWS Marketplace sera interrompu. Les déploiements existants continueront de fonctionner normalement. Vous pouvez toujours effectuer un déploiement à l'aide de commandes Helm standard ou d'images de conteneur sur Amazon ECS.

AWS Marketplace prend en charge les produits logiciels qui utilisent des conteneurs Docker. Les produits de conteneur se composent d'options de livraison qui sont un ensemble d'images de conteneurs et de modèles de déploiement qui vont de pair. Vous soumettez au moins une option de livraison pour votre produit, avec un maximum de quatre. Pour chaque option de livraison, vous fournissez un ensemble d'images de conteneur, des instructions d'utilisation et des liens vers des modèles de déploiement afin que les clients puissent lancer cette option de livraison. Cette rubrique fournit des informations sur les produits basés sur des conteneurs sur. AWS Marketplace

AWS Marketplace les acheteurs voient les options de livraison disponibles sur les pages détaillées des produits publiées qui leur sont proposées. Une fois qu'ils se sont abonnés au produit et qu'ils ont choisi leur option de livraison préférée, les acheteurs ont accès aux informations et aux instructions relatives au lancement et à l'utilisation du produit. Pour les options de livraison d'images de conteneur, les acheteurs peuvent consulter des liens vers les modèles de déploiement et les images de conteneur disponibles URLs. Ils reçoivent également des instructions sur la manière d'extraire les images individuelles des conteneurs. Pour les options de livraison du graphique Helm, les acheteurs verront step-by-step les instructions de lancement à l'aide de Helm.

Pour un aperçu de l'expérience d'achat, vous pouvez consulter cette vidéo : [Déploiement de AWS Marketplace conteneurs sur des clusters Amazon ECS](https://www.youtube.com/watch?v=XaiUAiQQJtk) (3:34).

Vous pouvez rechercher des applications Kubernetes tierces, vous y abonner et les déployer depuis AWS Marketplace n'importe quel cluster Kubernetes, quel que soit l'environnement. Vous pouvez déployer des applications Kubernetes tierces sur Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) et sur AWS Fargate site à l'aide d'Amazon EKS Anywhere (EKS Anywhere). Vous pouvez également les déployer sur des clusters Kubernetes autogérés sur site ou dans Amazon Elastic Compute Cloud (Amazon). EC2

Vous pouvez exécuter les produits de conteneur BYOL (Free and Bring Your Own License model) sur n'importe quel environnement d'exécution compatible avec Docker.

**Topics**
+ [Obtenir de l'aide](#container-help)
+ [Premiers pas avec les produits de conteneur](container-product-getting-started.md)
+ [Exigences relatives aux produits basées sur les conteneurs pour AWS Marketplace](container-product-policies.md)
+ [Tarification des produits en conteneur pour AWS Marketplace](pricing-container-products.md)
+ [Intégrations relatives à la facturation, au mesurage et aux licences des produits conteneurisés](container-products-billing-integration.md)
+ [Notifications Amazon SNS pour les produits en conteneur](container-notification.md)

## Obtenir de l'aide
<a name="container-help"></a>

Pour obtenir de l'aide concernant vos produits en conteneur, contactez votre partenaire de développement commercial AWS Marketplace ou l'équipe [des opérations des AWS Marketplace vendeurs](https://aws.amazon.com/marketplace/management/contact-us/).

# Premiers pas avec les produits de conteneur
<a name="container-product-getting-started"></a>

En tant que AWS Marketplace vendeur, vous pouvez créer des produits logiciels basés sur des conteneurs. Les produits de conteneur se composent d'options de livraison qui sont un ensemble d'images de conteneurs et de modèles de déploiement qui vont de pair. La rubrique suivante explique comment démarrer avec les produits en conteneur.
+ [Cycle de vie du produit](#container-product-lifecycle)
+ [Conditions préalables](#container-prereq)
+  [Étape 1 : Créez l'ID de produit et le code de produit pour votre produit en conteneur](#create-initial-container-product) 
+ [Étape 2 : Création d'une annonce initiale](#container-initial-listing)
+ [Étape 3 : Ajoutez une version initiale de votre produit](#container-add-version-gs)
+ [Étape 4 : (Pour les produits payants uniquement) Intégrez le comptage ou la tarification contractuelle](#getting-started-integrate-metering)
+ [Étapes suivantes](#getting-started-integrate-metering)
+ [Analyses des produits en conteneur pour détecter des problèmes de sécurité](#container-security)

## Cycle de vie du produit
<a name="container-product-lifecycle"></a>

Lorsque vous créez un produit dans AWS Marketplace, il est initialement publié avec une visibilité limitée afin que les comptes figurant sur la liste d'autorisation puissent le voir, y compris le compte qui a créé le produit. Lorsque vous êtes prêt, vous pouvez le publier dans le AWS Marketplace catalogue pour permettre aux acheteurs de s'abonner et d'acheter votre produit.

Sur la page [produit du serveur](https://aws.amazon.com/marketplace/management/products/server), vous pouvez consulter la liste de vos produits. Selon le stade auquel il se trouve, le produit aura l'un des statuts suivants.
+ **Mise en scène** : produit incomplet pour lequel vous ajoutez toujours des informations. Lorsque **vous enregistrez et quittez** l'expérience en libre-service pour la première fois, la demande de modification réussie crée un produit non publié contenant les informations relatives aux étapes terminées que vous avez soumises. À partir de ce statut, vous pouvez continuer à ajouter des informations au produit ou modifier des informations déjà soumises par le biais de demandes de modification.
+ **Limité** — Un produit est complet une fois qu'il a été soumis au système et qu'il a passé toutes les validations dans le système. Le produit passe ensuite au statut **Limité**. À ce stade, le produit possède une page détaillée qui n'est accessible qu'à votre compte et aux personnes que vous avez autorisées à inscrire sur la liste. Vous pouvez tester votre produit sur la page détaillée. Pour plus d'informations ou pour obtenir de l'aide, contactez l'équipe [des opérations des AWS Marketplace vendeurs](https://aws.amazon.com/marketplace/management/contact-us/).
+ **Public** : lorsque vous êtes prêt à publier le produit afin que les acheteurs puissent le consulter et s'y abonner, vous utilisez la demande de modification de **visibilité Update**. Cette demande lance un flux de travail permettant à l'équipe des opérations des AWS Marketplace vendeurs d'examiner et d'auditer votre produit par rapport aux AWS politiques. Une fois le produit approuvé et la demande de modification traitée, le produit passe du statut **Limité** au statut **Public**. Pour plus d'informations sur AWS les directives, voir[Exigences relatives aux produits basées sur les conteneurs pour AWS Marketplace](container-product-policies.md).
+ **Restreint** : si vous souhaitez empêcher les nouveaux utilisateurs de s'abonner à votre produit, vous pouvez restreindre le produit en utilisant la demande de modification de **visibilité de la mise à jour**. Un statut **restreint** signifie que les utilisateurs autorisés existants peuvent continuer à utiliser le produit. Cependant, le produit ne sera plus visible par le public ni disponible pour les nouveaux utilisateurs. 

## Conditions préalables
<a name="container-prereq"></a>

Remplissez les prérequis suivants avant de commencer :

1. Accédez au [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/) et utilisez-le. Il s'agit de l'outil que vous utilisez pour vous inscrire en tant que vendeur et gérer les produits que vous vendez AWS Marketplace. Pour de plus amples informations, veuillez consulter [Portail de gestion AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/user-guide-for-sellers.html#management-portal).

1. Inscrivez-vous en tant que vendeur et soumettez vos informations fiscales et bancaires. Pour de plus amples informations, veuillez consulter [Processus d'inscription](registration-process.md).

1. Créez au moins un conteneur dans Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) ou. AWS Fargate Assurez-vous d'avoir des liens vers les images associées.

1. Planifiez la manière dont vous allez créer et intégrer votre produit en conteneur AWS Marketplace.

   Nous vous recommandons de planifier votre stratégie de tarification, de droits et de mesure avant la publication de votre produit.
   + Pour plus d'informations sur les exigences relatives aux produits en conteneur, consultez. [Exigences relatives aux produits basées sur les conteneurs pour AWS Marketplace](container-product-policies.md)
   + Pour plus d'informations sur la définition du prix de votre produit, consultez[Tarification des produits en conteneur pour AWS Marketplace](pricing-container-products.md).
   + Pour plus d'informations sur le comptage personnalisé de votre produit payant basé sur un conteneur, consultez. [Comptage horaire et personnalisé avec AWS Marketplace Metering Service](container-products-billing-integration.md#entitlement-and-metering-for-paid-products)

## Vue d'ensemble : Création d'un produit en conteneur
<a name="create-container-product"></a>

La création d'un produit en conteneur implique les étapes suivantes :

1. [Étape 1 : Créez l'ID de produit et le code de produit pour votre produit en conteneur](#create-initial-container-product)

1. [Étape 2 : Création d'une annonce initiale](#container-initial-listing)

1. [Étape 3 : Ajoutez une version initiale de votre produit](#container-add-version-gs)

1. [Étape 4 : (Pour les produits payants uniquement) Intégrez le comptage ou la tarification contractuelle](#getting-started-integrate-metering)

1. [Mettre à jour la visibilité des produits](#container-product-visibility)

Pour plus d'informations sur le cycle de vie du produit, consultez[Cycle de vie du produit](#container-product-lifecycle).

## Étape 1 : Créez l'ID de produit et le code de produit pour votre produit en conteneur
<a name="create-initial-container-product"></a>

Pour commencer à utiliser un produit en conteneur, vous devez créer un identifiant de produit et un enregistrement de code de produit dans AWS Marketplace. L'identifiant du produit est utilisé pour suivre votre produit tout au long de son cycle de vie.

Utilisez la procédure suivante pour créer un nouveau produit conteneur dans le Portail de gestion AWS Marketplace et générer l'identifiant du produit.

**Note**  
Ce processus crée également une clé publique pour votre conteneur qui est associée à votre produit.

**Pour créer l'identifiant du produit du conteneur**

1. Ouvrez un navigateur Web et connectez-vous au [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Dans la barre de menu, sélectionnez **Produit**, puis **Serveur**.

1. Choisissez **Créer un produit serveur**, puis choisissez **Container**.

1. Générez un identifiant et un code de produit contenant.
**Note**  
(Facultatif) Vous pouvez étiqueter votre produit pour obtenir une autorisation basée sur des balises. Pour plus d’informations, veuillez consulter la rubrique [Balisage de vos AWS ressources](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html).

1. Choisissez **Continuer** pour continuer à créer votre produit.

## Étape 2 : Création d'une annonce initiale
<a name="container-initial-listing"></a>

Après avoir généré l'identifiant du produit, le code du produit et la clé publique, vous utiliserez un assistant pour créer une liste initiale.

1. Fournissez des informations sur le produit pour votre liste de produits.

1. Déterminez le modèle de tarification de votre produit.
**Note**  
Pour plus d'informations, consultez la section [Tarification des produits en conteneur](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-container-products.html).
**Note**  
Pour les produits payants, votre produit sera proposé au prix de départ à 0,01\$1 afin que vous et l'équipe des opérations des AWS Marketplace vendeurs puissiez tester le produit sans encourir de frais élevés. Vous fournirez le prix réel lors de votre entrée en bourse.

1. Fournissez des informations supplémentaires sur l'offre, notamment une politique de remboursement, un EULA et la disponibilité de l'offre.

1. Ajoutez un référentiel initial pour votre produit en conteneur.

1. Choisissez **Soumettre** à la dernière étape pour faire passer le produit en visibilité limitée.
**Note**  
Votre produit conteneur est initialement créé avec une version fictive. Vous ajouterez la version finale lorsque le produit aura une visibilité limitée. 

## Étape 3 : Ajoutez une version initiale de votre produit
<a name="container-add-version-gs"></a>

Votre produit peut avoir plusieurs versions au cours de sa durée de vie. Chaque version possède un ensemble d'images de conteneur spécifiques à cette version. Pour ajouter une version initiale de votre produit, consultez[Ajouter une nouvelle version de votre produit en conteneur sur AWS Marketplace](container-add-version.md). 

## Étape 4 : (Pour les produits payants uniquement) Intégrez le comptage ou la tarification contractuelle
<a name="getting-started-integrate-metering"></a>

Pour les produits basés sur des conteneurs soumis à une tarification d'utilisation, vous utilisez le [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html)pour vérifier les droits d'utilisation de votre produit et pour mesurer l'utilisation à des fins de facturation. Vous devez mesurer en fonction du modèle de tarification que vous avez créé lors de la définition de vos informations de tarification. Pour de plus amples informations, veuillez consulter [Comptage horaire et personnalisé avec AWS Marketplace Metering Service](container-products-billing-integration.md#entitlement-and-metering-for-paid-products).

### Tarification des contrats
<a name="container-integrate-LM"></a>

Pour les produits basés sur des conteneurs dont la tarification est contractuelle, vous pouvez utiliser le AWS License Manager pour associer des licences à votre produit. 

Pour plus d'informations sur l'intégration avec AWS License Manager, consultez[Tarification contractuelle pour les produits en conteneur avec AWS License Manager](container-license-manager-integration.md).

## Étape 5 : Mettre à jour la visibilité du produit
<a name="container-product-visibility-allowlist"></a>

Lorsque vous créez un produit dans AWS Marketplace, il est initialement publié avec une visibilité limitée afin que les comptes figurant sur la liste d'autorisation puissent le voir, y compris le compte qui a créé le produit. Vous pouvez mettre à jour la visibilité du produit pour permettre aux acheteurs de s'abonner et d'acheter votre produit. Vous pouvez également mettre à jour la liste des produits autorisés pour l'ajouter Comptes AWS. Cette rubrique explique comment gérer les acheteurs autorisés à consulter votre produit AWS Marketplace.

Pour plus d'informations sur la visibilité et le cycle de vie des produits, consultez[Cycle de vie du produit](#container-product-lifecycle).

**Topics**
+ [Mettre à jour la visibilité des produits](#container-product-visibility)
+ [Mise à jour de la liste d'autorisation de Compte AWS IDs](#container-update-allowlist)

### Mettre à jour la visibilité des produits
<a name="container-product-visibility"></a>

**Pour mettre à jour la visibilité**

1. Ouvrez l' Portail de gestion AWS Marketplace adresse[https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/), puis connectez-vous à votre compte vendeur.

1. Accédez à la page [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), sous l'onglet **Produit serveur actuel**, sélectionnez le produit basé sur un conteneur que vous souhaitez modifier.

1. Dans le menu déroulant **Demander des modifications**, sélectionnez **Mettre à jour la visibilité**.
**Note**  
Vous pouvez demander que le produit passe du statut **limité** au statut **public** en utilisant cette demande de modification. Toutefois, la demande de modification doit passer par un processus d'approbation de l'équipe des opérations des AWS Marketplace vendeurs pour être rendue **publique**.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut devient **Successed**.

### Mise à jour de la liste d'autorisation de Compte AWS IDs
<a name="container-update-allowlist"></a>

Vous pouvez modifier la liste des Compte AWS IDs personnes autorisées à afficher votre produit dans un état limité. Les comptes autorisés affichent un badge Limited à côté de la version du produit sur la page détaillée du produit.

1. Ouvrez l' Portail de gestion AWS Marketplace adresse [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) et connectez-vous à votre compte vendeur.

1. Sur la page [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), sélectionnez le produit conteneur que vous souhaitez modifier.

1. Dans la liste déroulante **Demander des modifications**, sélectionnez **Mettre à jour la liste des autorisations.** La liste actuelle des comptes autorisés s'affiche.

1. Dans le Comptes AWS champ **Allowlisted**, entrez les Compte AWS IDs et séparez-les par une virgule.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut passe à **Successed** ou **Echec**.

## Étapes suivantes
<a name="container-next-steps"></a>

Après avoir créé un produit conteneur, vous pouvez utiliser les informations des rubriques suivantes pour le configurer et le gérer :
+ [Mise à jour des informations sur le produit pour votre produit en conteneur sur AWS Marketplace](update-container-product-info.md)
+ [Ajouter une nouvelle version de votre produit en conteneur sur AWS Marketplace](container-add-version.md)
+ [Gestion de la tarification des produits en conteneur sur AWS Marketplace](container-pricing.md)
+ [Mise à jour de la disponibilité des produits en conteneur par pays en AWS Marketplace](container-update-offer-avail-country.md)
+ [Mettre à jour votre contrat de licence d'utilisateur final (EULA) pour les produits en conteneur sur AWS Marketplace](container-update-eula.md)
+ [Test et mise en circulation de votre produit en conteneur sur AWS Marketplace](test-release-product.md)

## Analyses des produits en conteneur pour détecter des problèmes de sécurité
<a name="container-security"></a>

Lorsque vous créez une demande de modification pour ajouter une nouvelle version à votre produit conteneur, nous scannons les images du conteneur incluses dans cette nouvelle version et vérifions les failles de sécurité. Pour ce faire, nous effectuons un scan layer-by-layer statique de l'image. Si nous découvrons des vulnérabilités critiques présentant des vecteurs de risque exploitables à distance, nous vous fournirons une liste des problèmes détectés. Nous vous recommandons vivement d'effectuer votre propre analyse de sécurité à l'aide d'un scanner d'images de conteneur tel que ClairTwistlock,Aqua Security, ou Trend Micro pour éviter des retards dans le processus d'ingestion et de publication. 

Votre choix d'images de base pour générer vos images de conteneur peut avoir un impact significatif sur le profil de sécurité de l'image finale. Si vous choisissez une image de base présentant déjà des vulnérabilités critiques connues, elles seront signalées en raison de la couche de base, même si les couches logicielles de votre application sont propres. Nous vous recommandons de vérifier que vous commencez avec un conteneur de base exempt de vulnérabilités avant de créer vos images et de les envoyer à AWS Marketplace. 

# Mise à jour des informations sur le produit pour votre produit en conteneur sur AWS Marketplace
<a name="update-container-product-info"></a>

Après avoir créé votre identifiant de produit et défini le prix, vous pouvez modifier les informations relatives à votre produit, y compris ce que les clients verront à propos de votre produit en conteneur dans le AWS Marketplace. Par exemple, si une nouvelle version modifie la description ou les points forts du produit, vous pouvez modifier les informations du produit avec les nouvelles données. Vous pouvez également mettre à jour d'autres informations sur le produit, notamment le titre du produit, la description du SKU, les catégories, les mots clés, etc. La procédure suivante décrit la création des détails du produit pour votre produit.

**Pour créer ou mettre à jour les détails du produit pour votre produit en conteneur**

1. Connectez-vous à la [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Sélectionnez **Serveur** dans le menu **Produits**. 

1. Dans l'onglet **Produits du serveur**, sélectionnez le produit que vous souhaitez modifier.

1. Dans le menu déroulant **Demander des modifications**, choisissez **Mettre à jour les informations sur le produit**.

1. Mettez à jour les champs suivants que vous souhaitez modifier :
   + **Titre du produit**
   + **SKU**
   + **Brève description**
   + **Description longue**
   + **URL de l'image du logo du produit**
   + **Éléments principaux**
   + **Catégories de produits**
   + **Mots clés**
   + **URL de la vidéo du produit**
   + **Ressources**
   + **Informations de support**
**Note**  
L'image URLs doit se trouver dans un compartiment Amazon S3 accessible au public. Pour plus de détails sur le format du logo, voir[Spécifications des logos des produits et de l'entreprise](product-submission.md#seller-and-product-logos).

1. Sélectionnez **Soumettre**.

1. Vérifiez que la demande apparaît dans l'onglet **Demandes** avec le statut **En cours d'examen**. Il se peut que vous deviez actualiser la page pour que la demande apparaisse dans la liste.

Vous pouvez vérifier le statut de votre demande à tout moment depuis l'onglet **Demandes** de la page [Produits pour serveurs](https://aws.amazon.com/marketplace/management/products/server).

# Ajouter une nouvelle version de votre produit en conteneur sur AWS Marketplace
<a name="container-add-version"></a>

En tant que AWS Marketplace vendeur, vous pouvez ajouter de nouvelles versions de votre produit conteneur, gérer les versions et mettre à jour les informations relatives aux versions. Votre produit peut avoir plusieurs versions au cours de sa durée de vie. Chaque version possède un ensemble d'images de conteneur spécifiques à cette version. Les rubriques suivantes expliquent comment gérer les versions de produits pour vos produits en conteneur.

**Note**  
Vous ne pouvez pas ajouter de version à votre produit tant que vous n'avez pas créé l'identifiant du produit et le prix de celui-ci. Pour plus d'informations sur ces étapes, consultez[Étape 1 : Créez l'ID de produit et le code de produit pour votre produit en conteneur](container-product-getting-started.md#create-initial-container-product). 

**Topics**
+ [Étape 1 : ajouter des référentiels](#add-repositories)
+ [Étape 2 : télécharger des images et des artefacts de conteneurs dans des référentiels](#upload-resources)
+ [Étape 3 : Ajoutez une nouvelle version à votre produit en conteneur](#add-new-version)
+ [Étape 4 : Mettre à jour les informations de version](#container-product-updating-version)
+ [Restreindre une version de votre module complémentaire Amazon EKS](#restriciting-version-eks-addon)

## Étape 1 : ajouter des référentiels
<a name="add-repositories"></a>

Les images de vos conteneurs et les autres artefacts de votre produit sont stockés dans des référentiels dans AWS Marketplace. Généralement, vous créez un dépôt pour chaque artefact nécessaire, mais le référentiel peut stocker plusieurs versions de l'artefact (avec des balises différentes). 

**Note**  
Toutes les images du déploiement de votre produit doivent utiliser des images provenant des AWS Marketplace référentiels.

La procédure suivante décrit comment ajouter les référentiels nécessaires. AWS Marketplace

**Pour ajouter des référentiels**

1. Connectez-vous à la [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Sélectionnez **Serveur** dans le menu **Produits**.

1. Dans l'onglet **Produits du serveur**, sélectionnez le produit que vous souhaitez modifier, puis choisissez **Ajouter des référentiels** dans le menu déroulant **Demander des modifications**.

1. Entrez le nom du référentiel que vous souhaitez créer. Si vous souhaitez créer plusieurs nouveaux référentiels :
   + Choisissez **Ajouter un nouveau référentiel** pour chaque dépôt supplémentaire.
   + Donnez-lui un nom unique. Le nom unique que vous choisissez doit figurer sur tous les produits de votre compte vendeur.
**Note**  
Le référentiel aura cette structure :`<repositoryID>.dkr.ecr.us-east-1.amazonaws.com/<sellerName>/<repositoryName>`. Lorsque vous ajoutez des éléments au référentiel (dans la procédure suivante), ils reçoivent une balise et ont cette structure :`<repositoryID>.dkr.ecr.us-east-1.amazonaws.com/<sellerName>/<repositoryName>:<tag>`.   
`repositoryID`Il s'agit d'un identifiant interne pour AWS Marketplace.
`sellerName`Il est basé sur le nom que vous avez créé pour votre compte vendeur. Lorsque le nom d'affichage de votre vendeur génère un préfixe de référentiel non valide`sellerName`, AWS Marketplace automatiquement le nom du vendeur par un UUID (identifiant unique universel). Pour modifier le préfixe UUID dans le nom de votre référentiel, contactez l'équipe des opérations d'AWS Marketplace.
Le `respositoryName` est défini dans cette étape.
Le `tag` est défini lorsque vous téléchargez un artefact dans le référentiel.

1. Sélectionnez **Soumettre**.

**Note**  
Vous pouvez avoir jusqu'à 70 référentiels par produit.

Une nouvelle demande est créée et affichée dans l'onglet **Demandes**. Une fois l'opération terminée, en quelques minutes, vous pouvez commencer à ajouter des images de conteneurs et d'autres artefacts aux référentiels que vous avez créés.

## Étape 2 : télécharger des images et des artefacts de conteneurs dans des référentiels
<a name="upload-resources"></a>

**Pour télécharger des images et des artefacts de conteneurs dans des référentiels**

1. Connectez-vous à la [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Dans le menu **Produits**, sélectionnez **Serveur**.

1. Dans l'onglet **Produits du serveur**, sélectionnez le produit que vous souhaitez modifier.

1. Choisissez **Ajouter des référentiels dans** le menu déroulant **Demander des modifications**.

1. Choisissez **Afficher les référentiels existants**.

1. Sélectionnez le référentiel vers lequel vous souhaitez effectuer le téléchargement.

1. Sélectionnez **Afficher les commandes push** pour ouvrir une liste d'instructions, y compris les commandes que vous pouvez utiliser pour transférer des images et des Helm graphiques de Docker conteneurs vers ce référentiel. 

   Pour obtenir des informations générales sur la manière de transférer des images de conteneurs et d'autres artefacts vers des référentiels, consultez la section Transmission [d'une image](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-push.html) dans le *guide de l'utilisateur d'Amazon Elastic Container Registry*.
**Note**  
Vous pouvez utiliser les opérations d'API Amazon Elastic Container Registry (Amazon ECR) suivantes lorsque vous appelez ou : `docker pull` `docker push`  
`DescribeImages`— Utilisez-le pour examiner les métadonnées relatives aux images d'un référentiel.
`GetAuthorizationToken`— À utiliser pour vous authentifier avant de télécharger des artefacts dans le référentiel, puis utilisez les commandes `docker pull` or`docker push`.
`ListImages`— À utiliser pour afficher la liste des images que vous avez envoyées.

1. Utilisez les commandes répertoriées pour transférer les artefacts nécessaires de votre référentiel local vers le AWS Marketplace référentiel de votre produit.
**Note**  
Les informations **tag** que vous fournissez dans les `push` commandes sont utilisées pour différencier la version de l'artefact que vous téléchargez dans le référentiel. Utilisez une balise adaptée à la version dont font partie les artefacts.

1. Répétez l'opération pour chaque image de conteneur ou artefact dont vous avez besoin dans votre version.
**Note**  
Votre version peut inclure jusqu'à 50 images ou artefacts du conteneur dans chaque option de livraison. Reportez-vous à la procédure suivante pour plus d'informations sur les options de livraison.

Une fois que vous avez chargé vos artefacts, vous êtes prêt à créer la version de votre produit. 

**Note**  
Les images de vos conteneurs sont numérisées automatiquement pour voir si elles répondent aux[Exigences relatives aux produits basées sur les conteneurs pour AWS Marketplace](container-product-policies.md). Pour de plus amples informations, veuillez consulter [Analyses des produits en conteneur pour détecter des problèmes de sécurité](container-product-getting-started.md#container-security).

### Ajouter une nouvelle option de livraison
<a name="add-delivery-option"></a>

Chaque version de votre produit en conteneur nécessiterait une option de livraison. L'option de livraison indique les options de déploiement disponibles pour l'acheteur. Selon l'une des options de livraison ci-dessous, vous devrez télécharger les artefacts appropriés dans les référentiels.
+ Pour une option de livraison d'**images de conteneur**, téléchargez toutes les images de conteneur requises pour l'installation du produit dans le référentiel Amazon Elastic Container Registry (Amazon ECR) créé dans la console. AWS Marketplace 
+ Pour une option de livraison de **Helmgraphiques**, téléchargez le Helm graphique et les images du conteneur dans le référentiel Amazon ECR créé dans la AWS Marketplace console.
+ Pour une option de livraison d'un **module complémentaire pour console Amazon EKS**, téléchargez le Helm graphique et les images du conteneur dans le référentiel Amazon ECR créé dans la AWS Marketplace console.

## Étape 3 : Ajoutez une nouvelle version à votre produit en conteneur
<a name="add-new-version"></a>

**Note**  
*Si vous recevez des erreurs lors de l'ajout d'une nouvelle version à votre conteneur, consultez le [tableau des erreurs asynchrones relatives à l'ajout d'une nouvelle version](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version) dans la AWS Marketplace Catalog API référence.*

**Pour ajouter une nouvelle version à votre produit en conteneur**

1. Connectez-vous à la [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Choisissez **Serveur** dans le menu **Produits**.

1. Dans l'onglet **Produits du serveur**, sélectionnez le produit auquel vous souhaitez ajouter une version. Choisissez ensuite **Ajouter une nouvelle version** dans le menu déroulant **Demander des modifications**.

1. Sur la page **Ajouter une nouvelle version**, entrez le **titre de la version** et les **notes de version** de votre version.

1. Après avoir saisi les détails de la version, l'étape suivante consiste à ajouter des options de livraison. Les options de livraison sont des ensembles d'instructions et d'informations que les acheteurs peuvent utiliser pour lancer le logiciel à partir de la version de votre produit. Les options de livraison sont connues sous le nom *d'options d'expédition* pour les acheteurs.
**Note**  
Votre produit peut prendre en charge plusieurs plateformes avec différentes images de conteneur (par exemple, Kubernetes et Ubuntu des déploiements). Vous pouvez créer une option de livraison pour chaque manière dont les clients peuvent configurer votre produit, jusqu'à quatre options de livraison par version du produit.

   1. Si le produit possède déjà des options de livraison dans d'autres versions, vous pouvez utiliser l'option existante comme modèle pour ajouter une option de livraison à la nouvelle version. Dans **Options de livraison**, choisissez l'option de livraison que vous souhaitez ajouter dans la liste. Vous pouvez modifier l'option en suivant les instructions des étapes suivantes.

   1. Pour ajouter une nouvelle option de livraison, sélectionnez **Nouvelle option de livraison**. Après avoir ajouté une option, suivez les instructions des étapes suivantes pour la configurer.

1. Choisissez un mode de livraison pour l'option de livraison. Le mode de livraison détermine la manière dont les acheteurs lanceront votre logiciel.
   + Pour une option de livraison d'**images de conteneurs**, indiquez les chemins d'accès aux images de conteneurs dans un référentiel Amazon Elastic Container Registry (Amazon ECR) créé dans la console. AWS Marketplace Les acheteurs utilisent les chemins des images du conteneur pour lancer le logiciel en extrayant les images directement dans leur environnement.
   + Pour une option de livraison de **Helmgraphiques**, indiquez les chemins d'accès aux Helm graphiques dans un référentiel Amazon ECR créé dans la AWS Marketplace console. Les acheteurs installent les Helm graphiques dans leur environnement de déploiement pour lancer le logiciel.
   + Pour une option de livraison d'un **module complémentaire pour console Amazon EKS**, indiquez les chemins d'accès aux Helm graphiques dans un référentiel Amazon ECR créé dans la AWS Marketplace console. Les acheteurs installent le conteneur à l'aide de la console Amazon EKS ou du module complémentaire Amazon EKS natif APIs pour lancer le logiciel. Pour plus d'informations, consultez la section [Extensions Amazon EKS disponibles sur Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html#workloads-add-ons-available-eks).

   1. Pour ajouter une option de diffusion **d'images Container**, effectuez les opérations suivantes :

      1. Dans **Container images**, ajoutez l'URL Amazon ECR aux images du conteneur contenant la version logicielle du produit.

      1. Dans **Titre de l'option de livraison** et **Description de l'option de déploiement**, entrez le titre et la description de cette option de livraison.

      1. Dans **Instructions d'utilisation**, entrez des informations détaillées pour aider vos acheteurs à utiliser votre logiciel après son lancement.

      1. Dans **Services pris en charge**, sélectionnez les environnements dans lesquels les acheteurs peuvent lancer le logiciel.

      1. Dans les **modèles de déploiement**, ajoutez des ressources que les acheteurs peuvent utiliser pour lancer le logiciel. Entrez un titre et une URL vers la ressource pour chaque modèle.

   1. Pour ajouter une option de livraison de **Helmgraphiques**, effectuez les opérations suivantes :

      1. Dans le **Helmgraphique**, ajoutez l'URL Amazon ECR au Helm graphique que les acheteurs installeront dans leur environnement de déploiement pour lancer votre logiciel.

      1. Dans **Container images**, ajoutez l'URL Amazon ECR aux images du conteneur contenant la version logicielle du produit.

      1. Dans **Titre de l'option de livraison** et **Description de l'option de déploiement**, entrez le titre et la description de cette option de livraison.

      1. Dans **Instructions d'utilisation**, entrez des informations détaillées pour aider vos acheteurs à utiliser votre logiciel après son lancement.

      1. Dans **Services pris en charge**, sélectionnez les environnements dans lesquels les acheteurs peuvent lancer le logiciel.

      1. *Facultatif -* Dans le **nom de la Helm version**, entrez le nom de l'Kubernetesespace de noms dans lequel le Helm graphique sera installé.

      1. *Facultatif -* Dans **Helml'espace de noms d'installation**, entrez le nom Helm de la version qui sera utilisée par la `helm install` commande.

      1. *Facultatif -* Dans le **nom du compte de Kubernetes service**, entrez le nom du compte de Kubernetes service qui sera utilisé pour se connecter à Gestion des identités et des accès AWS (IAM). Le compte Kubernetes de service fait appel à AWS des services tels que les licences ou les compteurs.

      1. Dans **Remplacer les paramètres**, entrez les paramètres qui seront utilisés dans les commandes de la Helm CLI qui lancent le logiciel. Ces paramètres permettent aux acheteurs de remplacer les valeurs par défaut fournies. Il y a une limite de 15 paramètres lors de l'utilisation de la console AWS Marketplace de gestion, mais il n'y a aucune limite lors de l'utilisation de AWS Marketplace Catalog API. Pour plus d'informations, consultez la section [Ajout d'une nouvelle version à un produit basé sur un conteneur](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version).
**Note**  
Certains **paramètres de remplacement** sont obligatoires. Les produits Amazon EKS Anywhere nécessitent un **paramètre Override pour le** secret de licence avec un caractère `DefaultValue` de`"${AWSMP_LICENSE_SECRET}"`. Pour les produits payants, vous devez fournir un **paramètre Override** pour la configuration du compte de service avec le nom `DefaultValue` de`"${AWSMP_SERVICE_ACCOUNT}"`.

      1. Choisissez **Masquer les mots de passe et les secrets** pour masquer les informations sensibles dans les consoles, les outils de ligne de commande et APIs. Pour plus d'informations, consultez la `NoEcho` documentation des [paramètres dans la section Paramètres](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html) du *guide de AWS CloudFormation l'utilisateur*.

   1. Pour ajouter une option de livraison de **modules complémentaires à la console Amazon EKS**, assurez-vous que les artefacts sont conformes[Exigences relatives aux produits complémentaires Amazon EKS](container-product-policies.md#publishing-eks-add-on), puis effectuez les étapes suivantes :
**Note**  
Une seule option de livraison du module complémentaire Amazon EKS est prise en charge par version. Vous ne pouvez pas ajouter de nouvelle version tant que la version actuelle avec laquelle vous travaillez n'est pas publiée sur la console Amazon EKS.

      1. Dans le **Helmgraphique**, ajoutez l'URL Amazon ECR au Helm graphique que les acheteurs installeront dans leur environnement de déploiement pour lancer votre logiciel.

      1. Dans **Container images**, ajoutez l'URL Amazon ECR aux images du conteneur contenant la version logicielle du produit. Assurez-vous que toutes les images du Helm graphique sont répertoriées.

      1. Dans **Titre de l'option de livraison** et **Description de l'option de déploiement**, entrez le titre et la description de cette option de livraison.

      1. Dans **Visibilité**, maintenez la valeur par défaut de **Limité sélectionnée**.

      1. Dans **Nom du module complémentaire**, entrez un nom unique pour ce module complémentaire. Le nom du module complémentaire que vous entrez sera ajouté au nom du vendeur lors de son affichage dans la console Amazon EKS.

      1. Dans **Version du module complémentaire**, entrez la version du module complémentaire qui sera visible lors de l'installation ou de la mise à niveau de ce module complémentaire. Suivez le format`major.minor.patch`.

      1. Dans **Type de module complémentaire**, sélectionnez une catégorie pour votre module complémentaire dans la liste déroulante.

      1. Dans **KubernetesVersion**, sélectionnez toutes les Kubernetes versions prises en charge par votre module complémentaire.

      1. Dans **Architecture**, sélectionnez les architectures de plate-forme prises en charge par votre module complémentaire. Les options sont **AMD64** et **ARM64**. Nous recommandons de prendre en charge les deux architectures pour optimiser la compatibilité. Si votre extension n'est pas compatible avec ARM64 les appareils, vous devez spécifier une date prévue pour l'ajout du support avant que votre produit puisse être publié dans toutes les publicités Régions AWS.

      1. Dans **Namespace**, entrez un espace de Kubernetes noms unique dans lequel votre module complémentaire sera installé. Les `kube-public` espaces de noms `default``kube-system`, et ne sont pas pris en charge pour l'installation de modules complémentaires tiers.

      1. Dans **Environment Override parameters**, vous pouvez sélectionner jusqu'à 2 paramètres d'environnement dans le framework complémentaire Amazon EKS. Vous pouvez associer les noms de paramètres de votre fichier values.yaml à ces variables d'environnement, qui sont et. `${AWS_REGION}` `${AWS_EKS_CLUSTER_NAME}`

1. Pour ajouter des options de livraison supplémentaires, choisissez **Nouvelle option de livraison** et répétez les instructions des étapes précédentes pour les configurer.

1. Sélectionnez **Soumettre**.

## Étape 4 : Mettre à jour les informations de version
<a name="container-product-updating-version"></a>

Après la création d'une version, il peut être utile de fournir des informations actualisées à vos acheteurs en modifiant les informations associées à la version. Par exemple, si vous prévoyez de restreindre la version 1.0 après la publication de la version 1.1, vous pouvez mettre à jour la description de la version 1.0 pour rediriger les acheteurs vers la version 1.1. Indiquez la date à laquelle la version 1.0 sera restreinte. Vous mettez à jour les informations de version à partir du Portail de gestion AWS Marketplace.

**Pour mettre à jour les informations de version**

1. Connectez-vous à la [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Sélectionnez **Serveur** dans le menu **Produits**. 

1. Dans l'onglet **Produits du serveur**, sélectionnez le produit que vous souhaitez modifier.

1. Dans le menu déroulant **Demander des modifications**, choisissez **Mettre à jour les informations de version**.

1. Sur la page **Mettre à jour la version**, sélectionnez la version que vous souhaitez mettre à jour.

1. Apportez des mises à jour à la version sélectionnée. Les champs disponibles pour la mise à jour dépendent de l'état de la version du produit ou de l'option de livraison.

   1. Pour toutes les versions, vous pouvez mettre à jour les **notes de publication**.

   1. Pour les versions qui ne sont pas encore accessibles au public, vous pouvez mettre à jour le **titre de la version**.

   1. Pour les options de livraison qui n'ont pas été restreintes, vous pouvez mettre à jour les champs suivants :
      + **Description**
      + **Instructions d'utilisation**
      + **Services pris en charge**

   1. Pour les options de livraison dans les versions qui ne sont pas encore accessibles au public, vous pouvez mettre à jour les champs suivants :
      + **Titres des options de livraison**
      + **Helmgraphique** (pour les options de livraison des **Helmgraphiques** uniquement)
      + **Images de conteneur**
      + **Ressources de déploiement**
      + **AddOn Nom**
      + **AddOn Version**
      + **AddOn Type**
      + **HelmURI du graphique**
      + **CompatibleKubernetesVersions**
      + **SupportedArchitectures**
      + **Namespace**
      + **EnvironmentOverrideParameters**

   1. Pour les options de livraison dans les versions accessibles au public, vous pouvez les mettre à jour **SupportedArchitectures**.

1. Sélectionnez **Soumettre**.

1. Vérifiez que la demande apparaît dans l'onglet **Demandes** avec le statut **En cours d'examen**.

Vous pouvez vérifier le statut de votre demande à tout moment dans l'onglet **Demandes** de la page [Produits pour serveurs](https://aws.amazon.com/marketplace/management/products/server).

## Restreindre une version de votre module complémentaire Amazon EKS
<a name="restriciting-version-eks-addon"></a>

Pour restreindre une version de votre produit conteneur publiée en tant que module complémentaire, contactez l'équipe AWS Marketplace des opérations en utilisant le formulaire de contact au bas du [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/).

# Gestion de la tarification des produits en conteneur sur AWS Marketplace
<a name="container-pricing"></a>

En tant que AWS Marketplace vendeur, vous pouvez gérer et mettre à jour les prix des produits en conteneur. Pour les produits en conteneur, vous pouvez répertorier des produits gratuits, des produits du modèle Bring Your Own License (BYOL) et des produits payants pour Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) et. AWS Fargate Vous ne pouvez définir qu'un seul prix par produit. Vous pouvez ajouter ou mettre à jour des dimensions de tarification. En fonction de votre modèle de tarification, vous pouvez ajouter des dimensions de contrat et d'utilisation. Vous pouvez également mettre à jour vos conditions tarifaires ou votre politique de remboursement. Pour plus d’informations, consultez les sections suivantes.

 Pour plus d'informations sur les modèles de tarification des produits en conteneur pour AWS Marketplace, consultez[Tarification des produits en conteneur pour AWS Marketplace](pricing-container-products.md).

**Topics**
+ [Ajouter une dimension tarifaire](#container-add-pricing-dimensions)
+ [Mise à jour des informations de dimension](#container-update-dimensions-information)
+ [Mise à jour des conditions tarifaires](#container-update-pricing-terms)
+ [Mettre à jour la politique de remboursement d'un produit](#container-update-refund-policy)

## Ajouter une dimension tarifaire
<a name="container-add-pricing-dimensions"></a>

Vous pouvez ajouter une dimension tarifaire au modèle de tarification que vous utilisez pour la facturation de vos produits. Pour plus d'informations sur les modèles de tarification, consultez[Modèles de tarification des conteneurs](pricing-container-products.md#pricing-models-for-server-products).

**Note**  
L'ajout d'une dimension tarifaire pour un contrat avec des prix de consommation (par exemple, le pay-as-you-go prix d'une utilisation supplémentaire) n'est pas disponible sur le Portail de gestion AWS Marketplace.  
Vous ne pouvez pas modifier votre modèle de tarification entre contrat, utilisation et contrat avec tarification à la consommation. Contactez l'équipe des [opérations des AWS Marketplace vendeurs](https://aws.amazon.com/marketplace/management/contact-us/) pour obtenir de l'aide.

1. Ouvrez l' Portail de gestion AWS Marketplace adresse [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) et connectez-vous à votre compte vendeur.

1. Sur la page [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), sélectionnez le produit conteneur que vous souhaitez modifier.

1. Dans la liste déroulante **Demander des modifications**, sélectionnez **Mettre à jour les dimensions de tarification**, puis sélectionnez **Ajouter des dimensions de tarification**.

1. Selon le modèle de tarification, vous pouvez ajouter des dimensions de contrat ou des dimensions d'utilisation en fournissant des informations pour **l'identifiant de l'API**, le **nom d'affichage** et la **description**.

1. Choisissez **Next**, puis saisissez la dimension et le prix de votre contrat.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut passe à **Successed** ou **Echec**. 

## Mise à jour des informations de dimension
<a name="container-update-dimensions-information"></a>

Vous pouvez modifier les informations relatives aux dimensions de votre produit. Pour plus d'informations sur les modèles de tarification, consultez[Modèles de tarification des conteneurs](pricing-container-products.md#pricing-models-for-server-products).

1. Ouvrez l' Portail de gestion AWS Marketplace adresse [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) et connectez-vous à votre compte vendeur.

1. Sur la page [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), sélectionnez le produit conteneur que vous souhaitez modifier.

1. Dans la liste déroulante **Demander des modifications**, sélectionnez **Mettre à jour les dimensions de tarification**, puis sélectionnez **Mettre à jour les informations relatives aux dimensions**.

1. Vous pouvez ajouter des informations de dimension en fournissant des informations pour le **nom d'affichage** et la **description** de la dimension que vous souhaitez mettre à jour.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut passe à **Successed** ou **Echec**. 

## Mise à jour des conditions tarifaires
<a name="container-update-pricing-terms"></a>

Vous pouvez modifier les conditions tarifaires de votre produit. Les conditions tarifaires peuvent nécessiter une mise à jour si vous modifiez les pays dans lesquels votre produit est proposé.

1. Ouvrez l' Portail de gestion AWS Marketplace adresse [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) et connectez-vous à votre compte vendeur.

1. Sur la page [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), sélectionnez le produit conteneur que vous souhaitez modifier.

1. Dans la liste **Demander des modifications**, sélectionnez **Mettre à jour l'offre publique**, puis sélectionnez **Mettre à jour les conditions tarifaires**.

1. Les prix actuels sont préremplis pour que vous puissiez les modifier. Vous pouvez supprimer le prix actuel et ajouter votre nouveau prix. Nous vous recommandons de vérifier les prix que vous demandez avant de soumettre votre demande de révision.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut passe à **Successed** ou **Echec**.

**Note**  
Si vous augmentez le prix d'une dimension en utilisant l'**option Mettre à jour les conditions tarifaires**, vous ne pourrez pas mettre à jour le prix pendant 90 jours. Une augmentation de prix bloque le prix pendant 90 jours à compter du jour où vous initiez le changement. Ce blocage des prix n'est en vigueur que pour une augmentation de prix et non pour une baisse de prix.

## Mettre à jour la politique de remboursement d'un produit
<a name="container-update-refund-policy"></a>

Vous pouvez mettre à jour la politique de remboursement de votre produit. Les mises à jour de la politique de remboursement prennent effet pour tous les utilisateurs. Pour de plus amples informations, veuillez consulter [Remboursements et annulations en AWS Marketplace](refunds.md). 

1. Ouvrez l' Portail de gestion AWS Marketplace adresse [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) et connectez-vous à votre compte vendeur.

1. Sur la page [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), sélectionnez le produit conteneur que vous souhaitez modifier.

1. Dans la liste déroulante **Demander des modifications**, sélectionnez **Mettre à jour l'offre publique**, puis sélectionnez **Mettre à jour la politique de remboursement**.

1. La politique de remboursement actuelle est préremplie pour que vous puissiez la modifier. Vous pouvez supprimer la politique de remboursement actuelle et ajouter votre nouvelle politique de remboursement. Nous vous recommandons de consulter la politique de remboursement que vous demandez avant de soumettre votre demande de révision. L'envoi de la demande annule la politique de remboursement actuelle.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut passe à **Successed** ou **Echec**. 

# Mise à jour de la disponibilité des produits en conteneur par pays en AWS Marketplace
<a name="container-update-offer-avail-country"></a>

En tant que AWS Marketplace vendeur, vous pouvez modifier les pays dans lesquels votre produit en conteneur peut être proposé et auquel vous pouvez souscrire. Pour de plus amples informations, veuillez consulter [Pays](regions-and-countries.md#product-countries). La procédure suivante explique comment mettre à jour la disponibilité de vos produits en conteneur par pays.

1. Ouvrez l' Portail de gestion AWS Marketplace adresse [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) et connectez-vous à votre compte vendeur.

1. Sur la page [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), sélectionnez le produit conteneur que vous souhaitez modifier.

1. Dans la liste déroulante **Demander des modifications**, sélectionnez **Mettre à jour l'offre publique**, puis sélectionnez **Mettre à jour la disponibilité par pays**.

1. Sélectionnez l’une des options suivantes : 
   + **Tous les pays** — Disponible dans tous les pays pris en charge.
   + **Tous les pays avec exclusions** : disponible dans tous les pays pris en charge, à l'exception de certains pays.
   + **Autoriser les pays listés uniquement** : les acheteurs peuvent acheter uniquement dans les pays que vous spécifiez.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut passe à **Succès ou **Échec****. 

# Mettre à jour votre contrat de licence d'utilisateur final (EULA) pour les produits en conteneur sur AWS Marketplace
<a name="container-update-eula"></a>

En tant que AWS Marketplace vendeur, vous pouvez mettre à jour le contrat de licence utilisateur final (EULA) pour utiliser le CLUF [Contrat standard pour AWS Marketplace](standardized-license-terms.md#standard-contracts) ou un EULA personnalisé. Les mises à jour apportées au CLUF prennent effet pour les nouveaux utilisateurs qui s'abonnent à votre produit et pour les renouvellements de produits. Pour mettre à jour votre EULA, suivez la procédure ci-dessous.

1. Ouvrez l' Portail de gestion AWS Marketplace adresse [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) et connectez-vous à votre compte vendeur.

1. Sur la page [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), sélectionnez le produit conteneur que vous souhaitez modifier.

1. Dans la liste déroulante **Demander des modifications**, sélectionnez **Mettre à jour l'offre publique**, puis sélectionnez **Mettre à jour le CLUF**.

1. Sélectionnez un **contrat standard AWS Marketplace** ou soumettez votre EULA personnalisé. Pour un EULA personnalisé, vous devez fournir le contrat à partir d'un compartiment Amazon S3.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut passe à **Succès ou **Échec****. 

# Mise à jour de la politique de remboursement de votre produit basé sur un conteneur sur AWS Marketplace
<a name="update-container-refund-policy"></a>

En tant que AWS Marketplace vendeur, vous pouvez définir la politique de remboursement de votre produit basé sur un conteneur. Si vous souhaitez modifier la politique de remboursement de votre produit, vous pouvez utiliser **Mettre à jour la politique de remboursement**. La procédure suivante explique comment mettre à jour votre politique de remboursement.

**Pour mettre à jour la politique de remboursement**

1. Ouvrez l' Portail de gestion AWS Marketplace adresse[https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/), puis connectez-vous à votre compte vendeur.

1. Accédez à la page [des produits du serveur](https://aws.amazon.com/marketplace/management/products/server), puis sélectionnez le produit que vous souhaitez modifier.

1. Dans le menu déroulant **Demander des modifications**, choisissez **Mettre à jour l'offre publique**, puis **Mettre à jour la politique de remboursement**.

1. Les détails de la politique de remboursement actuelle sont fournis dans la zone de texte pour que vous puissiez les modifier. L'envoi de la demande annule la politique de remboursement actuelle.

1. Choisissez **Soumettre** pour soumettre votre demande de révision.

1. Vérifiez que l'onglet **Demandes** indique que le **statut de la demande** est En **cours d'examen**. Lorsque la demande est terminée, le statut devient **Succeed**.

# Test et mise en circulation de votre produit en conteneur sur AWS Marketplace
<a name="test-release-product"></a>

Une fois que vous avez ajouté une nouvelle version de votre produit conteneur AWS Marketplace, vous pouvez tester votre produit, puis le mettre à la disposition du public. Cette rubrique décrit les étapes et les processus spécifiques requis pour tester et diffuser votre produit au public.

**Topics**
+ [Options de livraison d'images et de Helm graphiques du conteneur](#container-helm-delivery)
+ [Option de livraison du module complémentaire Amazon EKS](#eks-addon-delivery)

## Options de livraison d'images et de Helm graphiques du conteneur
<a name="container-helm-delivery"></a>

Cette section fournit des conseils sur la publication de l'image et du Helm graphique de votre conteneur.

Votre demande de nouvelle version est créée et devrait être terminée en quelques minutes. Vous pouvez suivre la demande depuis l'onglet **Demandes** de la page des **produits du serveur**. *Si vous recevez des erreurs lors du test ou de la publication de votre module complémentaire, consultez le tableau des erreurs asynchrones dans [Ajouter une nouvelle version dans la référence](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version).AWS Marketplace Catalog API *

**Note**  
Si la disponibilité de votre produit est actuellement limitée, seuls les acheteurs pour lesquels le produit est disponible peuvent accéder à la version du produit. Si votre produit est actuellement mis à la disposition du public, tous les AWS Marketplace acheteurs peuvent accéder à la version du produit.

S'il s'agit de votre première version définie, votre produit est maintenant prêt à être publié.

## Option de livraison du module complémentaire Amazon EKS
<a name="eks-addon-delivery"></a>

Cette section fournit des conseils sur le test et la publication de votre module complémentaire Amazon EKS.

**Testez votre module complémentaire**
+ Une fois que vous avez soumis votre module complémentaire AWS Marketplace , traité votre demande et publié votre module complémentaire dans un état limité afin que vous puissiez le valider dans le catalogue des modules complémentaires Amazon EKS. Vous pouvez suivre la demande depuis l'onglet **Demandes** de la page des **produits du serveur** dans le Portail de gestion AWS Marketplace. Les délais d'ingestion varient de 5 à 10 jours ouvrables en fonction du volume de demandes que nous traitons.

  Lorsque votre demande est en **cours d'examen**, le module complémentaire est toujours publié par AWS l'équipe depuis AWS Marketplace le catalogue des modules complémentaires Amazon EKS. Le statut de la demande passe à **Success** une fois que le module complémentaire est publié sur l'état **Limité**. Vous pouvez ensuite commencer à tester votre module complémentaire.
+ Une fois que votre module sera disponible, vous pourrez le trouver dans la région Asie-Pacifique (Séoul) à des fins de test. AWS Marketplace s'appuie sur votre expertise pour vérifier le fonctionnement de votre logiciel. Pour tester votre module complémentaire, vous devez créer un cluster Amazon EKS dans la région Asie-Pacifique (Séoul) dans votre compte vendeur où votre module complémentaire est autorisé. Pour tester votre module complémentaire, suivez [ces instructions détaillées](https://aws.amazon.com/blogs/awsmarketplace/deploy-third-party-software-add-ons-aws-marketplace-amazon-eks-clusters/). Assurez-vous de tester chaque Kubernetes version prise en charge par votre logiciel.
+ Si vous proposez un produit payant, créez une offre privée à l'adresse interne suivante Comptes AWS. Ces comptes permettent d'intégrer votre logiciel dans la console Amazon EKS dans toutes les publicités Régions AWS.

  ```
  288092140294, 288092140294, 408202761791
  ```
+ Maintenez votre cluster de test avec le module complémentaire actif jusqu'à ce qu'il soit AWS Marketplace approuvé et que la version de votre module complémentaire soit rendue publique.
**Note**  
AWS Marketplace ne prendra pas en charge les coûts AWS d'infrastructure engagés lors du test de votre produit conteneur sur vos clusters Amazon EKS. Vous pouvez suivre des mécanismes de dimensionnement appropriés pour réduire le nombre de nœuds à un coût d'exploitation minimal pendant que nous vérifions les résultats des tests.

**Publiez votre module complémentaire**

Après avoir validé votre logiciel via le cluster Amazon EKS en tant que module complémentaire, vous pouvez envoyer une demande pour rendre publique la version de votre module complémentaire Amazon EKS à l'aide du [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/)ou AWS Marketplace Catalog API.

 Pour plus d'informations, consultez [Mettre à jour la visibilité d'un module complémentaire Amazon EKS](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#update-delivery-option-visibility) dans la *AWS Marketplace Catalog API référence*.

Vous pouvez suivre la demande depuis l'onglet **Demandes** de la page des **produits du serveur** dans le Portail de gestion AWS Marketplace. Les temps d'ingestion peuvent varier.

# Exigences relatives aux produits basées sur les conteneurs pour AWS Marketplace
<a name="container-product-policies"></a>

AWS Marketplace maintient les exigences suivantes pour tous les produits et offres basés sur des conteneurs sur. AWS Marketplace Ces exigences contribuent à promouvoir un catalogue sûr, sécurisé et fiable pour nos clients. Nous encourageons également les vendeurs à examiner la mise en œuvre de contrôles et de protocoles supplémentaires, le cas échéant, pour répondre aux besoins spécifiques de leurs produits.

Tous les produits et leurs métadonnées associées sont examinés lors de leur soumission afin de s'assurer qu'ils respectent ou dépassent AWS Marketplace les politiques en vigueur. Ces politiques sont régulièrement mises à jour pour s'aligner sur l'évolution des directives de sécurité. AWS Marketplace analyse en permanence les produits pour vérifier que les offres existantes continuent de répondre aux modifications apportées à ces exigences. Si un produit n'est pas conforme, nous AWS Marketplace contacterons le vendeur pour le mettre à jour afin qu'il réponde aux nouvelles normes. Dans certains cas, les produits peuvent être temporairement indisponibles pour les nouveaux abonnés jusqu'à ce que les problèmes soient résolus. Ce processus permet de maintenir la sécurité et la fiabilité de la AWS Marketplace plateforme pour tous les utilisateurs.

**Topics**
+ [Stratégies de sécurité](#container-security-requirements)
+ [Exigences en matière d'information du client](#container-customer-info-requirements)
+ [Exigences relatives à l'utilisation du produit](#container-usage-requirements)
+ [Exigences relatives à l'architecture](#container-architecture-requirements)
+ [Exigences relatives à la structure du tableau de bord](#helm-chart-structure-requirements)
+ [Instructions d'utilisation du produit contenant](#container-product-usage-instructions)
+ [Exigences relatives aux produits complémentaires Amazon EKS](#publishing-eks-add-on)

## Stratégies de sécurité
<a name="container-security-requirements"></a>

 Tous les produits en conteneur doivent respecter les exigences de sécurité suivantes :
+ Les images de conteneur ne doivent pas contenir de vulnérabilités connues, de logiciels malveillants, de progiciels ou de systèmes d'exploitation End-of-Life (EoL).
+ Les conteneurs ne doivent pas demander AWS d'informations d'identification pour accéder aux AWS services. Lorsque votre produit a besoin d'accéder à AWS des services, vous devez utiliser l'un des outils suivants :
  + Rôles IAM pour les comptes de service, pour les charges de travail Amazon Elastic Kubernetes Service (Amazon EKS).
  + Rôles IAM pour les tâches, pour les charges de travail Amazon Elastic Container Service (Amazon ECS).
+ Les produits basés sur des conteneurs ne doivent nécessiter que le minimum de privilèges pour fonctionner. Pour plus d'informations, consultez les [sections Sécurité dans Amazon Elastic Container Service](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/security.html) et [Sécurité dans Amazon EKS](https://docs.aws.amazon.com//eks/latest/userguide/security.html).
+ Les images de conteneur doivent être configurées pour s'exécuter avec des privilèges non root par défaut.
+ Les conteneurs ne doivent pas contenir de secrets codés en dur, tels que des mots de passe (même hachés) pour les utilisateurs et les services du système, des clés privées, des informations d'identification, etc.
+ L'authentification dans les services exécutés dans le conteneur ne doit pas utiliser d'authentification basée sur un mot de passe, même si le mot de passe est généré, réinitialisé ou défini par l'utilisateur au lancement. Les mots de passe nuls et vides ne sont pas non plus autorisés.
+ Les images de conteneur ne doivent pas inclure de couches dont les architectures ne sont pas prises en charge (par exemple, les métadonnées intégrées à l'Attestation Framework).

## Exigences en matière d'information du client
<a name="container-customer-info-requirements"></a>

 Tous les produits en conteneur doivent respecter les exigences d'information client suivantes : 
+ Le logiciel ne doit pas collecter ou exporter les données du client à l'insu du client et sans son consentement exprès, sauf si cela est exigé par BYOL (Bring Your Own License). Les applications qui collectent ou exportent des données clients doivent suivre les directives suivantes : 
  + La collecte des données clients doit être en libre-service, automatisée et sécurisée. Les acheteurs ne doivent pas attendre l'approbation des vendeurs pour déployer le logiciel. 
  + La collecte des données clients doit être conforme à vos accords avec AWS, notamment, mais sans s'y limiter, les conditions [générales de AWS Marketplace, les conditions](https://aws.amazon.com/legal/seller-terms/) de [AWS service](https://aws.amazon.com/service-terms/), la déclaration de [AWS confidentialité](https://aws.amazon.com/privacy/) et [AWS le contrat client](https://aws.amazon.com/agreement/).
  + Les informations de paiement ne doivent pas être collectées.

## Exigences relatives à l'utilisation du produit
<a name="container-usage-requirements"></a>

 Tous les produits en contenant doivent respecter les exigences d'utilisation suivantes : 
+ Les vendeurs ne peuvent mettre en vente que des produits entièrement fonctionnels. Les produits bêta ou en version préliminaire à des fins d'essai ou d'évaluation ne sont pas autorisés. Les éditions pour développeurs, communautaires et BYOL des logiciels commerciaux sont prises en charge si le vendeur fournit une version payante équivalente AWS Marketplace dans les 90 jours suivant la fourniture de l'édition gratuite.
+ Toutes les instructions d'utilisation d'un produit basé sur un conteneur doivent inclure toutes les étapes de déploiement des produits basés sur un conteneur. Les instructions d'utilisation doivent fournir des commandes et des ressources de déploiement pointant vers les images de conteneur correspondantes sur AWS Marketplace.
+ Les produits basés sur des conteneurs doivent inclure toutes les images de conteneurs dont un abonné a besoin pour utiliser le logiciel. En outre, les produits basés sur des conteneurs ne doivent pas obliger l'utilisateur à lancer le produit à l'aide d'images provenant de l'extérieur AWS Marketplace (par exemple, des images de conteneurs provenant de référentiels tiers).
+ Les conteneurs et leurs logiciels doivent être déployables en libre-service et ne doivent pas nécessiter de méthodes de paiement ou de coûts supplémentaires. Les applications qui nécessitent des dépendances externes lors du déploiement doivent suivre les directives suivantes :
  + L'exigence doit être indiquée dans la description ou les instructions d'utilisation de l'annonce. Par exemple, *ce produit nécessite une connexion Internet pour être déployé correctement. Les packages suivants sont téléchargés lors du déploiement :.* <list of package> 
  + Les vendeurs sont responsables de l'utilisation de toutes les dépendances externes et de la garantie de leur disponibilité et de leur sécurité. 
  + Si les dépendances externes ne sont plus disponibles, le produit doit AWS Marketplace également être retiré. 
  + Les dépendances externes ne doivent pas nécessiter de méthodes de paiement ou de coûts supplémentaires.
+ Les conteneurs qui nécessitent une connexion permanente à des ressources externes ne relevant pas du contrôle direct de l'acheteur, par exemple, externes APIs ou Services AWS gérées par le vendeur ou un tiers, doivent respecter les directives suivantes :
  + L'exigence doit être indiquée dans la description ou les instructions d'utilisation de l'annonce. Par exemple, *ce produit nécessite une connexion Internet permanente. Les services externes permanents suivants sont nécessaires pour fonctionner correctement :.* <list of resources> 
  + Les vendeurs sont responsables de l'utilisation de toutes les ressources externes, de leur disponibilité et de leur sécurité.
  + Si les ressources externes ne sont plus disponibles, le produit doit AWS Marketplace également être retiré.
  + Les ressources externes ne doivent pas nécessiter de méthodes de paiement ou de coûts supplémentaires et la configuration de la connexion doit être automatisée.
+ Le logiciel et les métadonnées du produit ne doivent pas contenir de langage qui redirige les utilisateurs vers d'autres plateformes cloud, des produits supplémentaires ou des services de vente incitative qui ne sont pas disponibles sur. AWS Marketplace
+ Si votre produit est un module complémentaire à un autre produit ou au produit d'un autre éditeur de logiciels indépendants, la description de votre produit doit indiquer qu'il étend les fonctionnalités de l'autre produit et que, sans lui, l'utilité de votre produit est très limitée. Par exemple, *ce produit étend les fonctionnalités et sans lui, son utilité est très limitée. <product name> Veuillez noter que cette liste peut nécessiter sa propre licence pour accéder à toutes les fonctionnalités.* <product name>

## Exigences relatives à l'architecture
<a name="container-architecture-requirements"></a>

 Tous les produits basés sur des conteneurs doivent respecter les exigences d'architecture suivantes : 
+ Les images du conteneur source pour AWS Marketplace doivent être transférées vers le référentiel Amazon Elastic Container Registry (Amazon ECR) détenu par. AWS Marketplace Vous pouvez créer ces référentiels dans les produits Portail de gestion AWS Marketplace sous-serveur pour chacune de vos listes de produits en conteneur.
+ Les images de conteneur doivent être basées sur Linux.
+ Les produits payants basés sur des conteneurs doivent pouvoir être déployés sur [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html), [Amazon EKS ou](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html). [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html)
+ Les produits payants basés sur des conteneurs avec une tarification contractuelle et une intégration AWS License Manager doivent être déployés sur Amazon EKS, Amazon ECS Anywhere AWS Fargate, Amazon ECS Anywhere, Red Hat OpenShift Service on AWS (ROSA), sur des clusters Kubernetes autogérés sur site ou sur Amazon Elastic Compute Cloud.
+ Pour les produits de cartes Helm, les références aux images des conteneurs doivent être structurées conformément à la [Exigences relatives à la structure du tableau de bord](#helm-chart-structure-requirements) afin de permettre le déploiement entre régions.
+ Si votre produit basé sur un conteneur nécessite que l'acheteur déploie une Amazon Machine Image (AMI), il doit s'agir d'une AMI AWS gérée ou d'une AMI distincte publiée dans. AWS Marketplace Si vous publiez votre propre AMI dans AWS Marketplace, elle doit être conforme à la [Exigences relatives aux produits basées sur l'AMI pour AWS Marketplace](product-and-ami-policies.md) et vous devez indiquer qu'il s'agit d'un produit complémentaire, comme l'exige le[Politiques d'utilisation des produits](product-and-ami-policies.md#product-usage). Vous pouvez fixer le prix de votre produit basé sur l'AMI en tant que BYOL, car il s'agit d'une extension de votre offre basée sur des conteneurs. AWS Marketplace analyse les produits basés sur l'AMI pour détecter les vulnérabilités et expositions courantes non corrigées () CVEs et les exigences de sécurité. Vos acheteurs doivent également s'abonner à votre produit basé sur l'AMI avant de le déployer.

## Exigences relatives à la structure du tableau de bord
<a name="helm-chart-structure-requirements"></a>

Tous les produits Helm Chart soumis AWS Marketplace doivent respecter les exigences de structure suivantes afin de garantir une régionalisation et un déploiement appropriés dans toutes AWS les régions :
+ Les références aux images du conteneur doivent être définies exclusivement dans le `values.yaml` fichier et ne doivent être codées en dur dans aucun autre fichier du graphique de Helm. Cela permet AWS Marketplace de remplacer automatiquement ces références lors de la réplication de votre produit dans différentes régions.
+ Le `values.yaml` fichier doit utiliser des variables pour toutes les références aux images du conteneur.
+ Vous pouvez éventuellement les `registry` diviser `tag` en champs distincts au même niveau que le référentiel pour créer votre référence d'image.
+ Les modèles Helm doivent référencer ces variables en utilisant la syntaxe standard des modèles Helm (par exemple,`{{ .Values.image.repository }}:{{ .Values.image.tag }}`).
+ Évitez d'utiliser une logique conditionnelle dans les modèles qui contournerait les références d'image définies dans`values.yaml`.
+ Lorsque vous testez votre carte Helm avec différentes AWS régions, assurez-vous que le fait de modifier `values.yaml` correctement la région met à jour toutes les références d'image dans les ressources déployées.

AWS Marketplace vérifie que toutes les références aux images du conteneur sont correctement définies dans le `values.yaml` fichier lors du processus de soumission du produit. Les produits qui ne répondent pas à ces exigences seront rejetés.

### Exigences relatives aux références d'images de conteneurs dans les diagrammes Helm
<a name="helm-chart-best-practices"></a>

Ce qui suit illustre les approches permettant de structurer les références d'images de conteneurs dans les diagrammes de Helm :

**`values.yaml`(format recommandé) :**

```
image:
  registry: "709825985650.dkr.ecr.us-east-1.amazonaws.com"
  repository: "accuknox/kubearmor"
  tag: "v1.1.1"
```

**Note**  
Nous recommandons l'approche ci-dessus pour votre structure`values.yaml`, mais les méthodes alternatives ci-dessous sont également valables.

**`values.yaml`(format alternatif) :**

```
image:
  repository: "709825985650.dkr.ecr.us-east-1.amazonaws.com/guance/datakit"
  tag: "1.0"
```

**`values.yaml`(format alternatif) :**

```
image:
  repository: "709825985650.dkr.ecr.us-east-1.amazonaws.com/guance/datakit:1.0"
```

**Note**  
Pour le modèle de déploiement, le format ci-dessous est le seul format valide disponible.

**Modèle de déploiement :**

```
containers:
- name: kubearmor
  image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}"
```

**Approche incorrecte (ne pas utiliser) :**

```
containers:
- name: kubearmor
  image: "709825985650.dkr.ecr.us-east-1.amazonaws.com/accuknox/kubearmor:v1.1.1"
```

### Erreurs possibles de validation du graphique de Helm
<a name="helm-chart-validation-errors"></a>

Au cours du processus de soumission des produits, AWS Marketplace effectue des contrôles de validation sur les produits Helm Chart afin de garantir leur conformité aux exigences de référence relatives aux images des conteneurs. Si votre graphique Helm ne répond pas à ces exigences, vous risquez de rencontrer les erreurs de validation suivantes :


| Erreur | Explication | 
| --- | --- | 
| INCOMPATIBLE\$1HELM\$1OBJECTS | Les objets Helm spécifiés ne sont pas pris en charge pour les modules complémentaires EKS. Consultez [Exigences relatives aux produits complémentaires Amazon EKS](#publishing-eks-add-on). | 
| INVALID\$1DEPENDENT\$1HELM\$1CHARTS | Les cartes Helm dépendantes doivent être contenues dans le répertoire graphique parent et ne pas provenir de sources externes. | 
| INVALID\$1HELM\$1SENSITIVE\$1CONFIG | Le schéma de configuration ne peut pas contenir de champs qui collectent des informations sensibles. Les schémas de configuration ne doivent pas accepter les mots de passe, les clés d'API, les certificats ou les secrets. Fournissez plutôt des champs pour les noms secrets Kubernetes que les clients créeront séparément. | 
| INVALID\$1HELM\$1CHART\$1IMAGES | Toutes les images, y compris les dépendances open source, doivent être transférées vers les référentiels AWS Marketplace Amazon ECR créés via la demande [Add](container-add-version.md#add-repositories) Repository. | 
| INVALID\$1HELM\$1UNDECLARED\$1IMAGES | Toutes les références d'images de conteneur doivent être explicitement répertoriées dans la demande d'[ajout de version](container-add-version.md#add-new-version). | 
| INVALID\$1HELM\$1LINT | La helm lint validation du graphique de Helm a échoué. Exécutez helm lint localement pour identifier et résoudre les problèmes structurels ou syntaxiques. Utilisez la version Helm 3.19.0 ou ultérieure. | 
| INVALID\$1HELM\$1TEMPLATE | La helm template validation du graphique de Helm a échoué. Le graphique ne peut pas être converti en manifestes Kubernetes valides. Effectuez un test local helm template pour identifier les erreurs de syntaxe ou de logique du modèle. Utilisez la version Helm 3.19.0 ou ultérieure. | 
| MISSING\$1HELM\$1DEPLOYMENT\$1CONFIG | Le diagramme Helm d'un module complémentaire Amazon EKS doit contenir un déploiement ou une DaemonSet ressource. Amazon EKS nécessite au moins l'un de ces types de charge de travail pour la gestion du cycle de vie des modules complémentaires. Consultez [Exigences relatives aux produits complémentaires Amazon EKS](#publishing-eks-add-on). | 
| INCOMPATIBLE\$1CONFIGURATION\$1SCHEMA\$1VERSION | La version du schéma JSON dans n'aws\$1mp\$1configuration\$1schema.jsonest pas prise en charge. Consultez [Exigences relatives au schéma](#schema-requirements) les versions de schéma prises en charge. | 
| INVALID\$1IMAGE\$1REFERENCE | Toutes les images doivent être définies en tant que variables values.yaml et référencées à l'aide de la syntaxe du modèle Helm, comme décrit dans[Exigences relatives à la structure du tableau de bord](#helm-chart-structure-requirements). | 
| MISSING\$1VALUES\$1IMAGE\$1REFERENCE | Chaque référence d'image de conteneur doit avoir une entrée correspondantevalues.yaml. | 
| MISSING\$1IMAGE\$1TAG | Les références aux images du conteneur values.yaml doivent inclure des valeurs de balise explicites ou utiliser par défaut la version du graphique à partir deChart.yaml. | 

## Instructions d'utilisation du produit contenant
<a name="container-product-usage-instructions"></a>

Lorsque vous créez des instructions d'utilisation pour votre produit en conteneur, suivez les étapes et les instructions indiquées dans[Création d'instructions d'utilisation de l'AMI et du produit conteneur pour AWS Marketplace](ami-container-product-usage-instructions.md). 

### Instructions d'utilisation du Helm Chart
<a name="helm-chart-usage-instructions"></a>

Lorsque vous créez des instructions d'utilisation pour les produits Helm Chart :
+ Documentez clairement tous les paramètres configurables de votre `values.yaml` fichier, y compris le référentiel d'images, les balises et les paramètres de registre.
+ Fournissez des exemples de la manière de remplacer ces paramètres lors de l'installation du graphique Helm.
+ Ne demandez pas aux utilisateurs de modifier des fichiers autres que `values.yaml` ou d'utiliser des `--set` paramètres lors de l'installation du graphique.
+ Incluez des informations sur la manière dont votre produit gère la régionalisation des images de conteneurs.

## Exigences relatives aux produits complémentaires Amazon EKS
<a name="publishing-eks-add-on"></a>

Un module complémentaire Amazon EKS est un logiciel qui fournit des fonctionnalités opérationnelles aux Kubernetes applications mais qui n'est pas spécifique à l'application. Par exemple, un module complémentaire Amazon EKS inclut des agents ou des Kubernetes pilotes d'observabilité qui permettent au cluster d'interagir avec les AWS ressources sous-jacentes pour la mise en réseau, le calcul et le stockage.

En tant que vendeur de produits conteneurisés, vous pouvez choisir parmi plusieurs options de déploiement, notamment Amazon EKS. Vous pouvez publier une version de votre produit en tant que AWS Marketplace module complémentaire dans le catalogue des modules complémentaires Amazon EKS. Votre module complémentaire apparaît dans la console Amazon EKS à côté des modules complémentaires gérés par d'autres fournisseurs ou gérés par AWS d'autres fournisseurs. Vos acheteurs peuvent déployer votre logiciel en tant que module complémentaire aussi facilement qu'ils le font pour les autres modules complémentaires.

Pour plus d'informations, veuillez consulter [Modules complémentaires Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html) dans le *Guide de l'utilisateur Amazon EKS*.

### Préparation de votre produit en pot en tant que AWS Marketplace complément
<a name="preparing-eks-addon"></a>

Pour publier votre produit en conteneur en tant que AWS Marketplace module complémentaire, celui-ci doit répondre aux exigences suivantes :
+ Votre produit en conteneur doit être publié dans AWS Marketplace.
+ Votre produit conteneur doit être conçu de manière compatible avec AMD64 les deux ARM64 architectures.
+ Votre produit en conteneur ne doit pas utiliser le [modèle de tarification](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-container-products.html) BYOL (Bring Your Own License).
**Note**  
Le BYOL n'est pas pris en charge pour la livraison des modules complémentaires Amazon EKS.
+ Vous devez respecter toutes les [exigences relatives aux produits liés aux conteneurs](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-policies.html), y compris le transfert de toutes les images et de tous les Helm graphiques des conteneurs dans les référentiels AWS Marketplace Amazon ECR gérés. Cette exigence inclut les images open source, par exemple,`nginx`. Les images et les graphiques ne peuvent pas être hébergés dans d'autres référentiels externes, y compris, mais sans s'y limiter, [Amazon ECR Public Gallery](https://docs.aws.amazon.com/AmazonECR/latest/public/public-repositories.html)Docker Hub, et. Quay
+ **Helmgraphiques** - Préparez et empaquetez votre logiciel sous forme de Helm graphique. Le framework complémentaire Amazon EKS convertit un Helm graphique en manifeste Kubernetes. Certaines Helm fonctionnalités ne sont pas prises en charge dans les systèmes Amazon EKS. La liste suivante décrit les exigences qui doivent être satisfaites avant d'intégrer votre logiciel en tant que module complémentaire Amazon EKS. Dans cette liste, toutes les Helm commandes utilisent Helm la version 3.19.0 :
  + Tous les `Capabilities` objets sont pris en charge, à l'exception de`.APIVersions`. `.APIVersions`n'est pas pris en charge pour la non-built-in personnalisation Kubernetes APIs.
  + Seuls les `Release.Namespace` objets `` `Release.Name` et sont pris en charge.
  + Helmles crochets et la `lookup` fonction ne sont pas pris en charge.
  + Tous les graphiques dépendants doivent être situés dans le Helm graphique principal (spécifié avec le chemin du référentiel file ://...).
  + Le Helm graphique doit réussir à passer Helm Lint et Helm Template sans erreur. Les commandes sont les suivantes :
    + HelmPeluche — `helm lint helm-chart`

      Les problèmes courants incluent les graphiques non déclarés dans les métadonnées du graphique parent. Par exemple, `chart metadata is missing these dependencies: chart-base Error: 1 chart(s) linted, 1 chart(s) failed`
    + HelmModèle — `helm template chart-name chart-location --set k8version=Kubernetes-version --kube-version Kubernetes-version --namespace addon-namespace --include-crds --no-hooks -f any-overriden-values`

      Transmettez toutes les configurations remplacées avec le `-f` drapeau.
  + Stockez tous les fichiers binaires des conteneurs dans les AWS Marketplace dépôts Amazon ECR. Pour créer un manifeste, utilisez la commande Helm template présentée précédemment. Recherchez dans le manifeste toute référence d'image externe, telle que `busybox` des `gcr` images. Téléchargez toutes les images de conteneur ainsi que les dépendances dans les dépôts AWS Marketplace Amazon ECR créés à l'aide de l'option **Ajouter un référentiel** dans le menu déroulant des demandes.
+ **Configuration personnalisée** : vous pouvez ajouter des variables personnalisées lors du déploiement. Pour plus d'informations sur la façon d'identifier l'expérience de l'utilisateur final, de nommer le logiciel `aws_mp_configuration_schema.json` et de le mettre dans un emballage contenant le Helm graphique, consultez la section [Extensions Amazon EKS : Configuration avancée](https://aws.amazon.com/blogs/containers/amazon-eks-add-ons-advanced-configuration/).

  Selon [le mot clé « \$1schema »](https://json-schema.org/draft/2020-12/json-schema-core#name-the-schema-keyword), `$schema` il doit s'agir d'un URI pointant vers une `application/schema+json` ressource valide.

  Ce fichier ne doit pas accepter d'informations sensibles telles que les mots de passe, les clés de licence et les certificats.

  Pour gérer les secrets et les installations de certificats, vous pouvez fournir aux utilisateurs finaux les étapes de pre-Add-on post-installation ou d'installation. Le produit ne doit pas reposer sur des licences externes. Le produit doit fonctionner en fonction des AWS Marketplace droits.

  Pour plus d'informations sur les limitations relatives à`aws_mp_configuration_schema.json`, voir[Exigences de configuration des modules complémentaires et meilleures pratiques pour les fournisseurs de modules complémentaires](#eks-addon-configuration).
+ **Identifiez et créez l'espace de noms dans lequel le logiciel sera déployé : dans** la première version de votre produit, vous devez identifier l'espace de noms dans lequel le logiciel sera déployé en ajoutant un espace de noms modèle.
+ **Définitions de ressources personnalisées (CRDs)** — Le framework d'extension Amazon EKS ne prend pas en charge l'installation CRDs et les déclarations de ressources personnalisées basées sur l' CRDs application du même module complémentaire. Si votre module complémentaire dispose de ressources personnalisées et s'appuie sur CRDs celles-ci, vous pouvez soit : 
  + **Publiez deux modules complémentaires :** divisez la définition du CRD en un module complémentaire distinct (tableau de bord distinct) et l'installation réelle [des ressources personnalisées](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) en un module complémentaire distinct.
  + **Publiez un seul module complémentaire avec des instructions manuelles supplémentaires :** publiez un seul module complémentaire qui installe le module CRDs sur le cluster. Fournissez des instructions d'utilisation ainsi que des fichiers manifestes Kubernetes aux utilisateurs finaux afin de configurer des ressources personnalisées qui en dépendent. CRDs
+ **Créez le cas `serviceAccount` échéant** — S'il s'agit d'un logiciel payant AWS Marketplace ou s'il doit être connecté à un autre Services AWS, assurez-vous que le Helm graphique est créé `serviceAccount` par défaut. Si la `serviceAccount` création est gérée par un paramètre dans un `values.yaml` fichier, définissez la valeur du paramètre sur`true`. Par exemple, `serviceAccount.create = true`. Cela est nécessaire car le client peut choisir d'installer le module complémentaire en héritant des autorisations de l'instance de nœud sous-jacente qui possède déjà les autorisations requises. Si le graphique Helm ne crée pas le`serviceAccount`, les autorisations ne peuvent pas être liées au`serviceAccount`.
+ **Déploiements ou daemonsets traçables** : assurez-vous que votre diagramme Helm comporte un daemonset ou un déploiement. Le framework d'extensions Amazon EKS suit le déploiement de vos ressources Amazon EKS à l'aide de celles-ci. En l'absence d'un déploiement ou d'un daemonset traçable, votre addon sera confronté à une erreur de déploiement. Si votre addon ne dispose pas d'un déploiement ou d'un daemonset, par exemple, s'il déploie un ensemble de ressources personnalisées ou une tâche Kubernetes qui ne sont pas traçables, ajoutez un déploiement factice ou un objet daemonset.
+ **Support pour les architectures AMD et ARM** — De nombreux clients Amazon EKS utilisent ARM64 aujourd'hui des instances AWS Graviton. Les logiciels tiers doivent prendre en charge les deux architectures.
+ **Intégrez les licences ou les compteurs APIs à partir de AWS Marketplace** : AWS Marketplace prend en charge plusieurs modèles de facturation. Pour de plus amples informations, veuillez consulter [Intégrations relatives à la facturation, au mesurage et aux licences des produits conteneurisés](container-products-billing-integration.md). Si vous souhaitez vendre votre produit par le biais de mécanismes PAYG, consultez[Configuration du comptage personnalisé pour les produits conteneurisés avec AWS Marketplace Metering Service](container-metering-meterusage.md). Si vous souhaitez vendre votre produit par le biais d'un modèle initial ou contractuel, consultez[Tarification contractuelle pour les produits en conteneur avec AWS License Manager](container-license-manager-integration.md). 
+ **Téléchargez le logiciel ainsi que tous les artefacts et dépendances** : le graphique Helm doit être autonome et ne doit pas nécessiter de dépendances provenant de sources externes, GitHub par exemple. Si le logiciel nécessite des dépendances externes, celles-ci doivent être transférées vers des référentiels Amazon ECR AWS Marketplace privés sous la même AWS Marketplace liste.
+ **Fournissez des instructions de déploiement sur votre site Web** : nous vous demandons d'héberger un guide de déploiement destiné aux clients afin d'identifier comment déployer votre logiciel à l'aide de la commande [create-addon](https://docs.aws.amazon.com/cli/latest/reference/eks/create-addon.html).
+ ** permissions/IAM Rôles supplémentaires** : si votre module complémentaire publié à partir de AWS Marketplace nécessite l'accès à un AWS service, votre logiciel doit disposer d'un compte de service Kubernetes annoté avec des politiques IAM pour accéder aux services. AWS Vous pouvez choisir entre deux options pour que votre compte de service envoie des demandes d'API aux AWS services :
  + Informations d'identification via IRSA : cette option permet à votre logiciel d'obtenir des informations d'identification auprès du service IRSA (Identity and Access Management) Role Service (IAM). Pour plus d'informations, consultez la section [Rôles IAM pour les comptes de service](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html). 
  + Identité du pod Amazon EKS : cette option permet à votre logiciel d'utiliser l'identité du pod Amazon EKS pour envoyer des demandes d'API aux AWS services. Pour plus d'informations, voir [Découvrez comment EKS Pod Identity permet aux pods d'accéder aux AWS services](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)

  Votre module complémentaire doit comporter un fichier de configuration supplémentaire nommé `aws_mp_addon_parameters.json` au niveau supérieur du graphique Helm, dans le même répertoire que le schéma de configuration personnalisé actuel (`aws_mp_configuration_schema.json`). Actuellement, ce fichier ne gère que les autorisations compatibles avec l'identité des pods. Le format de fichier est le suivant : 

  ```
  {
    "permissions": {
        "isPodIdentityCompatible" : true,
        "permissionsList": [
         {
          "serviceAccount" : "String",
          "managedPolicies" : ["Policy Arn"],
         }
       ]
      }
    }
  ```

  **Nom du fichier : `aws_mp_addon_parameters.json`**
**Note**  
Le `aws_mp_addon_parameters.json` fichier active la section **Accès aux modules complémentaires** sur la page des **paramètres de configuration des modules** complémentaires de la console Amazon EKS    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/marketplace/latest/userguide/container-product-policies.html)
**Note**  
Pay-as-you-go Les produits complémentaires (PAYG) de ne AWS Marketplace peuvent pas utiliser Amazon EKS Pod Identity et doivent utiliser les rôles IAM pour les comptes de service (IRSA) pour le contrôle d'accès.
+ **Mises à jour des versions** : Amazon EKS publie de nouvelles versions de Kubernetes quelques semaines après la publication en amont. À mesure que les nouvelles versions du cluster Amazon EKS sont généralement disponibles, les fournisseurs ont 45 jours pour certifier ou mettre à jour leur logiciel afin qu'il soit compatible avec la nouvelle version du cluster Amazon EKS. Si vos versions actuelles du module complémentaire sont compatibles avec la nouvelle version de Kubernetes, validez-la et certifiez-la afin que nous puissions mettre à jour la matrice de compatibilité des versions. Si une nouvelle version complémentaire est nécessaire pour prendre en charge la nouvelle version de Kubernetes, veuillez soumettre la nouvelle version pour intégration.
+ Le logiciel du partenaire doit appartenir à l'un des types suivants ou être un logiciel opérationnel destiné à améliorer Kubernetes ou Amazon EKS : Gitops \$1 surveillance \$1 journalisation \$1 gestion des certificats \$1 gestion des politiques \$1 gestion des coûts \$1 mise à l'échelle automatique \$1 stockage \$1 kubernetes-management \$1 service-mesh \$1 etcd-backup \$1 \$1 équilibreur de charge \$1 registre local \$1 mise en réseau \$1 sécurité \$1 sauvegarde \$1 contrôleur d'entrée \$1 observabilité ingress-service-type
+ Le logiciel ne peut pas être [une interface réseau de conteneurs (CNI).](https://github.com/containernetworking/cni)
+ Les logiciels doivent être vendus AWS Marketplace et intégrés aux licences et aux compteurs APIs pour les produits payants. Les produits BYOL ne sont pas acceptés.

### Exigences de configuration des modules complémentaires et meilleures pratiques pour les fournisseurs de modules complémentaires
<a name="eks-addon-configuration"></a>

Amazon EKS nécessite une configuration sous forme de chaîne de [schéma Helm JSON](https://helm.sh/docs/topics/charts/#schema-files) auprès des fournisseurs de modules complémentaires. Les modules complémentaires qui nécessitent des configurations requises ou autorisent des configurations facultatives doivent inclure un `aws_mp_configuration_schema.json` fichier contenant le Helm Chart soumis à AWS Marketplace. Amazon EKS utilisera ce schéma pour valider les entrées de configuration fournies par les clients et rejeter les appels d'API dont les valeurs d'entrée ne sont pas conformes au schéma. Les configurations complémentaires se répartissent généralement en deux catégories :
+ Configuration des propriétés générales de Kubernetes telles que les étiquettes, les tolérations, NodeSelector, etc.
+ Configurations spécifiques aux modules complémentaires, telles que la clé de licence, l'activation des fonctionnalités URLs, etc.

Cette section se concentre sur la première catégorie liée aux propriétés générales de Kubernetes.

Amazon EKS recommande de suivre les meilleures pratiques en matière de configuration des modules complémentaires Amazon EKS.
+ [Exigences relatives au schéma](#schema-requirements)
+ [Paramètres courants autorisés pour la configuration](#parameters-allowed)
+ [Paramètres courants qui ne sont pas autorisés pour la configuration](#parameters-not-available)

#### Exigences relatives au schéma
<a name="schema-requirements"></a>

Lorsque vous définissez le schéma JSON, assurez-vous d'utiliser une version de jsonschema prise en charge par les modules complémentaires Amazon EKS. 

Liste des schémas pris en charge :
+ https://json-schema. org/draft-04/schema
+ https://json-schema. org/draft-06/schema
+ https://json-schema. org/draft-07/schema
+ https://json-schema. org/draft/2019-09/schema

L'utilisation d'une autre version du schéma JSON est incompatible avec les modules complémentaires Amazon EKS et empêchera leur publication tant que le problème ne sera pas résolu.

**Exemple de fichier de schéma Helm**

```
{
"$schema": "http://json-schema.org/schema#",
  "type": "object",
  "properties": {
"podAnnotations": {
"description": "Pod Annotations"
"type": "object"
    },
    "podLabels": {
"description": "Pod Labels"
"type": "string"
    },
    "resources": {
"type": "object"
"description": "Resources"
    },
    "logLevel": {
"description": "Logging Level"
"type": "string",
      "enum": [
        "info",
        "debug"
      ]
    },
    "config": {
"description": "Custom Configuration"
"type": "object"
    }
  }
}
```

**camelCase**  
Les paramètres de configuration doivent être CamelCase et seront rejetés s'ils ne respectent pas ce format.

**Les descriptions sont obligatoires**  
Incluez toujours des descriptions pertinentes pour les propriétés du schéma. Cette description sera utilisée pour afficher les noms d'étiquette dans la console Amazon EKS pour chaque paramètre de configuration.

**Définition du RBAC**  
Les fournisseurs de modules complémentaires doivent définir et fournir les autorisations RBAC nécessaires pour installer correctement le module complémentaire en utilisant le principe du moindre privilège. Si les autorisations RBAC doivent être modifiées pour les nouvelles versions d'un module complémentaire ou pour tout correctif visant à résoudre un CVE, les fournisseurs de modules complémentaires devront informer l'équipe Amazon EKS de cette modification. Les autorisations requises pour chaque ressource Kubernetes doivent être limitées au nom de ressource de l'objet.   

```
apiGroups: ["apps"]
resources: ["daemonsets"]
resourceNames: ["ebs-csi-node"]
verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
```

**Gestion des secrets**  
Cette section s'applique uniquement aux modules complémentaires qui nécessitent que les clients configurent des informations secrètes telles que la clé d'application, la clé d'API, le mot de passe, etc. Amazon EKS APIs ne prend actuellement pas en charge la transmission d'informations secrètes en texte brut pour des raisons de sécurité. Cependant, les clients peuvent utiliser la configuration pour transmettre le nom du Kubernetes Secret qui contient les clés nécessaires au module complémentaire. Les clients devront créer des objets Kubernetes Secret contenant les clés avec le même espace de noms comme étape préalable, puis transmettre le nom du secret à l'aide du blob de configuration lors de la création du module complémentaire. Nous recommandons aux fournisseurs de modules complémentaires de nommer les propriétés du schéma afin que les clients ne le confondent pas accidentellement avec la clé réelle. Par exemple : appSecretName, connectionSecretName etc.   
En résumé, les fournisseurs de modules complémentaires peuvent tirer parti du schéma pour permettre aux clients de transmettre le nom du secret, mais pas les clés qui détiendront réellement le secret lui-même. 

**Exemples de valeurs de configuration**  
Vous pouvez inclure des exemples de configuration dans votre schéma pour aider les clients à configurer les modules complémentaires. L'exemple suivant est tiré du schéma de AWS Distro pour OpenTelemetry module complémentaire.  

```
"examples": [
      {
        "admissionWebhooks": {
          "namespaceSelector": {},
          "objectSelector": {}
        },
        "affinity": {},
        "collector": {
          "amp": {
            "enabled": true,
            "remoteWriteEndpoint": "https://aps-workspaces.us-west-2.amazonaws.com/workspaces/ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/api/v1/remote_write"
          },
          "cloudwatch": {
            "enabled": true
          },
          "mode": "deployment",
          "replicas": 1,
          "resources": {
            "limits": {
              "cpu": "256m",
              "memory": "512Mi"
            },
            "requests": {
              "cpu": "64m",
              "memory": "128Mi"
            }
          },
          "serviceAccount": {
            "annotations": {},
            "create": true,
            "name": "adot-collector"
          },
          "xray": {
            "enabled": true
          }
        },
        "kubeRBACProxy": {
          "enabled": true,
          "resources": {
            "limits": {
              "cpu": "500m",
              "memory": "128Mi"
            },
            "requests": {
              "cpu": "5m",
              "memory": "64Mi"
            }
          }
        },
        "manager": {
          "env": {},
          "resources": {
            "limits": {
              "cpu": "100m",
              "memory": "128Mi"
            },
            "requests": {
              "cpu": "100m",
              "memory": "64Mi"
            }
          }
        },
        "nodeSelector": {},
        "replicaCount": 1,
        "tolerations": []
      }
    ]
```

#### Paramètres courants autorisés pour la configuration
<a name="parameters-allowed"></a>

Les paramètres suivants sont recommandés dans un fichier de schéma Helm destiné au client.


| Paramètre | Description | Devrait avoir une valeur par défaut ? | 
| --- | --- | --- | 
| Étiquettes supplémentaires | Ajoutez des étiquettes Kubernetes à tous les objets Kubernetes gérés par le module complémentaire. | Non | 
| Annotations supplémentaires | Ajoutez des annotations Kubernetes à tous les objets Kubernetes gérés par le module complémentaire. | Non | 
| Étiquettes POD | Ajoutez des étiquettes Kubernetes aux pods gérés par le module complémentaire. | Non | 
| Annotations de Podan | Ajoutez des annotations Kubernetes aux pods gérés par le module complémentaire. | Non | 
| logLevel | Niveau de journalisation pour les composants gérés par le module complémentaire. | Oui | 
| nodeSelector | Forme recommandée la plus simple de contrainte de sélection de nœuds. Vous pouvez ajouter le champ NodeSelector à la spécification de votre pod et spécifier les étiquettes de nœud que vous souhaitez attribuer au nœud cible. | Potentiellement, par exemple, les nœuds Linux uniquement | 
| tolérances | Des tolérances sont appliquées aux gousses. Les tolérances permettent au planificateur de planifier des pods avec les teintes correspondantes. Les tolérances autorisent la planification mais ne garantissent pas la planification. | Peut-être, plus courant avec les daemonsets | 
| affinité | La fonction d'affinité comprend deux types d'affinité : l'affinité des nœuds fonctionne comme le champ NodeSelector, mais elle est plus expressive et vous permet de spécifier des règles souples, tandis que l'affinité/anti-affinité entre les pods vous permet de restreindre les pods par rapport aux étiquettes des autres pods. | Peut-être | 
| topologySpreadConstraints | Vous pouvez utiliser les contraintes de propagation topologique pour contrôler la manière dont les pods sont répartis dans votre cluster entre les domaines de défaillance tels que les régions, les zones, les nœuds et les autres domaines topologiques définis par l'utilisateur. Cela peut aider à atteindre une haute disponibilité ainsi qu'une utilisation efficace des ressources. | Peut-être | 
| demande/limites de ressources | Spécifiez la quantité dont cpu/memory chaque conteneur a besoin. Il est fortement recommandé de définir des demandes. Les limites sont facultatives. | Oui | 
| réplicas | Nombre de répliques des pods gérés par le module complémentaire. Non applicable aux daemonsets. | Oui | 

**Note**  
Pour les paramètres de configuration de la planification de la charge de travail, vous devrez peut-être séparer les composants de niveau supérieur dans le schéma si nécessaire. Par exemple, le pilote Amazon EBS CSI contient deux composants principaux, le contrôleur et l'agent de nœud. Les clients ont besoin d'un nœud différent selectors/tolerations pour chaque composant. 

**Note**  
Les valeurs par défaut définies dans le schéma JSON sont uniquement destinées à la documentation utilisateur et ne remplacent pas la nécessité d'avoir la valeur par défaut légitime dans le `values.yaml` fichier. Si vous utilisez la propriété par défaut, assurez-vous que la valeur par défaut `values.yaml` correspond à celle du schéma et que les deux artefacts (`values.schema.json`et`values.yaml`) restent synchronisés chaque fois que des modifications sont apportées au graphique de Helm.

```
"affinity": {
            "default": {
              "affinity": {
                "nodeAffinity": {
                  "preferredDuringSchedulingIgnoredDuringExecution": [
                    {
                      "preference": {
                        "matchExpressions": [
                          {
                            "key": "eks.amazonaws.com/compute-type",
                            "operator": "NotIn",
                            "values": [
                              "fargate"
                            ]
                          }
                        ]
                      },
                      "weight": 1
                    }
                  ]
                },
                "podAntiAffinity": {
                  "preferredDuringSchedulingIgnoredDuringExecution": [
                    {
                      "podAffinityTerm": {
                        "labelSelector": {
                          "matchExpressions": [
                            {
                              "key": "app",
                              "operator": "In",
                              "values": [
                                "ebs-csi-controller"
                              ]
                            }
                          ]
                        },
                        "topologyKey": "kubernetes.io/hostname"
                      },
                      "weight": 100
                    }
                  ]
                }
              }
            },
            "description": "Affinity of the controller pod",
            "type": [
              "object",
              "null"
            ]
          }
```

### Paramètres courants qui ne sont pas autorisés pour la configuration
<a name="parameters-not-available"></a>

Les paramètres de métadonnées du cluster tels que `clusterName``region`,`vpcId`,`accountId`,, et d'autres peuvent être requis par divers modules complémentaires (par exemple, Elastic Load Balancing Controller). Tout paramètre similaire connu par le service Amazon EKS sera automatiquement injecté par les modules complémentaires Amazon EKS, et il n'incombe pas à l'utilisateur de le spécifier comme option de configuration. Ces paramètres incluent :
+ AWS région
+ Nom du cluster Amazon EKS
+ ID VPC du cluster
+ Registre de conteneurs, spécifiquement pour les comptes build-prod, utilisé par les modules complémentaires réseau
+ IP du cluster DNS, spécifiquement pour le module complémentaire Coredns
+ Point de terminaison de l'API du cluster Amazon EKS
+ IPv4 activé sur le cluster
+ IPv6 activé sur le cluster
+ Délégation de préfixe pour IPv6 activation sur le cluster

Les fournisseurs de modules complémentaires doivent s'assurer que vous avez défini un modèle pour ces paramètres applicables. Chacun des paramètres ci-dessus aura un `parameterType` attribut prédéfini défini par Amazon EKS. Les métadonnées de version spécifieront le mappage entre le `parameterType` et le name/path du paramètre dans le modèle. Ainsi, les valeurs peuvent être transmises dynamiquement par Amazon EKS sans que les clients aient à les spécifier par le biais de configurations, ce qui donne également la flexibilité aux fournisseurs de modules complémentaires de définir leur propre nom/chemin de modèle. Les paramètres tels que ceux ci-dessus dont Amazon EKS a besoin pour injecter dynamiquement doivent être exclus du fichier de schéma.

**Exemple de mappage à partir des métadonnées de publication**

```
"defaultConfiguration": [
       {
            "key": "image.containerRegistry",
            "parameterType": "CONTAINER_REGISTRY"
       }
]
```

Il n'est pas recommandé de configurer les paramètres suivants dans un fichier de schéma Helm destiné au client. Soit les paramètres doivent avoir des valeurs par défaut non modifiables, soit ne pas être inclus du tout dans le modèle de module complémentaire.


| Paramètre | Description | Devrait avoir une valeur par défaut ? | 
| --- | --- | --- | 
| image | Image de conteneur qui sera déployée sur le cluster Kubernetes. | Non, géré via la définition d'un module complémentaire | 
| imagePullSecrets | Configuration d'un pod pour utiliser un secret à extraire d'un registre privé. | N/A | 
| Sonde Liveness | Le processus Kubelet utilise des sondes de réactivité pour savoir quand redémarrer un conteneur. Par exemple, les sondes Liveness peuvent détecter un blocage, lorsqu'une application est en cours d'exécution, mais ne parvient pas à progresser. Le redémarrage d'un conteneur dans un tel état peut contribuer à rendre l'application plus disponible malgré les bogues. | Oui | 
| Sonde de préparation | Il est important que vous disposiez d'une sonde de disponibilité pour vos contenants. De cette façon, le processus Kubelet exécuté sur votre plan de données saura quand le conteneur est prêt à desservir le trafic. Un pod est considéré comme prêt lorsque tous ses conteneurs sont prêts. L'une des utilisations de ce signal consiste à contrôler quels pods sont utilisés comme backends pour les services. Lorsqu'un pod n'est pas prêt, il est retiré des équilibreurs de charge de service. | Oui | 
| Sonde de démarrage | Le kubelet utilise des sondes de démarrage pour savoir quand une application conteneur a démarré. Si une telle sonde est configurée, elle désactive les contrôles de réactivité et de disponibilité jusqu'à ce qu'elle aboutisse, afin de s'assurer que ces sondes n'interfèrent pas avec le démarrage de l'application. Cela peut être utilisé pour adopter des contrôles de vitalité sur les conteneurs à démarrage lent, afin d'éviter qu'ils ne soient tués par le kubelet avant qu'ils ne soient opérationnels. | Facultatif | 
| podDisruptionBudget | Définissez un budget de perturbation des pods (PDB) pour garantir qu'un nombre minimum de PODS continuent de fonctionner pendant les interruptions volontaires. Un PDB limite le nombre de pods d'une application répliquée qui sont simultanément indisponibles en raison d'interruptions volontaires. Par exemple, une application basée sur un quorum souhaite s'assurer que le nombre de répliques en cours d'exécution ne soit jamais inférieur au nombre requis pour un quorum. Une interface Web peut vouloir s'assurer que le nombre de répliques servant la charge ne tombe jamais en dessous d'un certain pourcentage du total. | Oui, si vous utilisez par défaut plus de deux répliques | 
| ServiceAccount (nom) | Nom du compte de service sous lequel les pods seront exécutés. | Oui | 
| Compte de service (annotations) | Annotations appliquées au compte de service. Généralement utilisé pour la fonctionnalité Rôles IAM pour les comptes de service | Non, l'ARN du rôle du compte de service IAM est défini dans l'API des modules complémentaires Amazon EKS de haut niveau. Il existe une exception à cette règle si votre module complémentaire en possède plusieurs deployments/controllers (comme Flux) et nécessite un rôle ARNs IRSA distinct. | 
| priorityClassName | La priorité indique l'importance d'un pod par rapport aux autres pods. Si un pod ne peut pas être programmé, le planificateur essaie de préempter (expulser) les pods moins prioritaires afin de permettre la planification du pod en attente. | Oui. La plupart des modules complémentaires sont essentiels au fonctionnement du cluster et doivent avoir une classe de priorité définie par défaut. | 
| podSecurityContext | Un contexte de sécurité définit les paramètres de privilège et de contrôle d'accès pour un pod ou un conteneur. Généralement utilisé pour définir FSGroup, qui était requis pour IRSA dans les clusters v1.19 et inférieurs. | Peu probable, étant donné qu'Amazon EKS ne prend plus en charge Kubernetes v1.19 | 
| Contexte de sécurité | Un contexte de sécurité définit les paramètres de privilège et de contrôle d'accès pour un pod ou un conteneur. | Oui | 
| Stratégie de mise à jour | Spécifie la stratégie utilisée pour remplacer les anciens pods par de nouveaux. | Oui | 
| Nom Override | Remplacez le nom des pods. | Non | 
| podSecurityPolicy |  Appliquez des restrictions sur les paramètres.  | Non, PSPs sont déconseillés | 
| extraVolumeMounts/Volumes supplémentaires |  Utilisé pour IRSA dans des clusters autres qu'Amazon EKS.   | Non | 

# Tarification des produits en conteneur pour AWS Marketplace
<a name="pricing-container-products"></a>

Sur AWS Marketplace, vous pouvez répertorier des produits gratuits, des produits du modèle Bring Your Own License (BYOL) et des produits payants pour Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) et. AWS Fargate Vous ne pouvez définir qu'un seul prix par produit. Cette rubrique décrit les modèles de tarification disponibles pour les produits en conteneur. 

**Note**  
Vous utilisez le [Metering Service d’AWS Marketplace](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) pour appliquer les droits d’utilisation et mesurer l’utilisation pour vos produits payants. Pour la tarification par tâche ou par module, l'utilisation est mesurée automatiquement par AWS.

Le prix que vous fixez pour un produit en conteneur s'applique à tous Régions AWS. Chaque fois que vous abaissez le prix d'un produit de conteneur, le nouveau prix est immédiatement mis en œuvre pour vos acheteurs. En ce qui concerne les augmentations de prix, les acheteurs actuels sont avertis du changement 90 jours avant qu'il n'ait une incidence sur leur facturation. Le nouveau montant est facturé aux nouveaux acheteurs.

**Note**  
Pour les nouveaux abonnés, le changement de prix prend effet immédiatement. Pour les abonnés existants, le changement de prix entre en vigueur le premier jour du mois suivant une période de 90 jours commençant à la date d'envoi de la notification de modification de prix. Supposons, par exemple, que vous envoyiez une notification de modification de prix le 16 mars. Le 16 juin est environ 90 jours après le 16 mars. Comme le changement de prix intervient le premier jour du mois qui suit la période de 90 jours, la date d'entrée en vigueur du changement est le 1er juillet.

**Topics**
+ [Modèles de tarification des conteneurs](#pricing-models-for-server-products)

## Modèles de tarification des conteneurs
<a name="pricing-models-for-server-products"></a>

AWS Marketplace propose plusieurs modèles de tarification pour les produits en conteneur. 

Le tableau suivant fournit des informations générales sur les modèles de tarification pour les produits en conteneur.


**Modèles de tarification pour les produits de conteneur**  

| Modèle de tarification | Description | 
| --- | --- | 
| Apportez votre propre licence (BYOL) | Le BYOL est géré en dehors du AWS Marketplace cadre d'une relation de facturation externe que vous entretenez avec l'acheteur. Votre logiciel dans le conteneur ne s'intègre pas à AWS Marketplace la facturation. | 
| Mensuel | **Prix mensuel fixe**Un tarif mensuel fixe qui octroie aux utilisateurs une utilisation illimitée du produit pendant le mois suivant.Exemple : vous fixez le prix de votre produit à 99\$1 par mois. Votre produit inclut trois images de conteneur différentes déployées à l'aide d'une définition de tâche Amazon ECS.Lorsqu'un acheteur s'abonne à votre produit, on lui facture immédiatement 99 \$1. Ce montant est facturé chaque mois jusqu'à la résiliation de l'abonnement. L'acheteur bénéficie également d’une utilisation illimitée du produit. De plus, l’acheteur paie séparément pour toute l'infrastructure qui permet l'exécution des tâches. Lorsqu'ils sont abonnés, ils peuvent accéder à vos images de conteneur. Ils peuvent lancer et exécuter n'importe quel nombre de conteneurs à partir de ces images sur Amazon ECS ou Amazon EKS, quelle que soit la configuration.Si l'acheteur annule son abonnement au milieu d'un mois, il perd l'accès au référentiel Amazon ECR où sont stockées AWS Marketplace les images du conteneur. L'acheteur a peut-être extrait et stocké les images originales. Cependant, ils ne peuvent plus extraire les nouvelles versions d'images de conteneur que vous mettez à disposition via AWS Marketplace. L'acheteur est remboursé pour la partie non utilisée du dernier mois. Vous êtes payé en fonction de l'utilisation de l'acheteur, déduction faite des frais convenus AWS Marketplace . | 
| Dimensions de tarification mesurées personnalisées |  Prix mesurés personnalisés en fonction des dimensions que vous définissez (par exemple, utilisateurs, nœuds, référentiels ou Go), jusqu'à 24 dimensions par produit.  Exemple : votre produit est facturé par les utilisateurs. Vous avez des utilisateurs administrateurs et des utilisateurs réguliers, et vous définissez le prix à 2\$1 pour les utilisateurs administrateurs et à 1\$1 pour les utilisateurs réguliers. Vous pouvez les configurer en tant que dimensions distinctes lors de la publication de votre produit. Vous facturez en fonction des utilisateurs connectés, par jour, et vous mesurez cette utilisation par jour. Pour en savoir plus sur le comptage personnalisé pour une tarification basée sur l'utilisation, voir. [Configuration du comptage personnalisé pour les produits conteneurisés avec AWS Marketplace Metering Service](container-metering-meterusage.md)  | 
| Prix horaire par tâche ou par pod |  **Tâche Amazon ECS ou module Amazon EKS** Prix par tâche Amazon ECS ou par module Amazon EKS, que nous mesurons à la seconde près en fonction du prix horaire fixé. Exemple : votre produit inclut trois images de conteneur différentes : un nœud de contrôleur, un nœud de travail et un nœud d'analyse. Comme votre produit n'est pas fonctionnel ou utilisable sans le nœud de contrôleur, vous décidez que c'est cette image pour laquelle vous souhaitez facturer l'utilisation. Vous fixez un prix de 6 \$1 par heure. Vous modifiez le logiciel dans l'image du conteneur pour le nœud de contrôleur afin de l'intégrer au fonctionnement de l'[AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html)`RegisterUsage`API. Cela permet de s'assurer que seuls les acheteurs avec un abonnement actif peuvent lancer et exécuter cette image de conteneur et que son utilisation est calculée en fonction de la durée de son exécution. L'acheteur est facturé 6\$1 par heure d'utilisation pour chaque module de contrôleur Amazon EKS en cours d'exécution. Si l'acheteur lance cinq pods de contrôleur Amazon EKS qui incluent le conteneur de nœuds de contrôleur, il est facturé 30 dollars de l'heure (6 dollars par module). L'acheteur paie également séparément pour toute infrastructure sur laquelle les pods s'exécutent. Pour la tarification horaire, la facturation a lieu par seconde, avec un minimum d'une minute. Si le client exécute de conteneur de contrôleur pendant 20 minutes et 30 secondes, il est facturé `20 x ($6/60) + 30 x ($6/60/60) = $2 + $0.05 = $2.05`. Vous êtes payé en fonction de l'utilisation de l'acheteur, déduction faite des frais convenus AWS Marketplace . Pour en savoir plus sur la tarification horaire par tâche ou par module, consultez[Configuration du comptage horaire avec AWS Marketplace Metering Service](container-metering-registerusage.md).  | 
| Tarification horaire ou tarif de comptage personnalisé avec contrat à long terme |  Un contrat à long terme, à prix réduit, payé d'avance ou en versements réguliers. Un contrat à long terme peut être ajouté à un produit existant qui propose une tarification personnalisée au compteur, ou une tarification par tâche et par module. Les acheteur paient les prix mesurés lorsqu'ils consomment plus que ce qu'ils ont acheté dans le contrat à long terme. Exemple : pour les modèles de tarification mesurés, vous pouvez ajouter un prix contractuel à long terme pour les acheteurs afin de bénéficier d'une réduction en cas d'engagement initial. Supposons que vous facturez normalement 1\$1 par unité consommée. Un acheteur utilisant 1 unité par heure paierait 8 760\$1 par an ()`365 days x 24 hours x $1 per hour`. Vous pouvez activer un contrat qui permet à l'acheteur d'utiliser 1 unité par heure pendant ces 365 jours à la moitié du prix (4 380\$1). Dans ce cas, l'acheteur s'engage à payer d'avance pour le contrat d'un an, et le prix passe de 1\$1 par unité à 0,5\$1 par unité. Vous pouvez également permettre à l'acheteur d'acheter plusieurs de ces contrats. Si la quantité mesurée indique que l'acheteur a consommé 10 unités en une heure et qu'il avait conclu deux contrats, alors 2 unités seront incluses dans les 2 contrats. Les 8 unités supplémentaires seraient facturées au taux normal de 1\$1 l'heure, pour un total de 8\$1 pour cette heure. Pour l'exemple par tâche ou par module, vous pouvez également ajouter un prix contractuel à long terme pour les acheteurs afin de bénéficier d'une réduction en cas d'engagement initial. Si vous facturez normalement 6\$1 par capsule, vous pouvez définir un contrat à long terme de 365 jours au prix de 13 140\$1 (). `365 days x 24 hours x $3 per pod per hour` Un contrat donnerait alors droit au client à 1 capsule par heure pendant ces 365 jours. Les clients peuvent choisir d'acheter plusieurs contrats. Par exemple, un client peut acheter deux contrats qui lui donnent droit à 2 capsules par heure. Si le client produit plus de capsules par heure que ce qui est prévu dans les contrats autorisés, les capsules excédentaires seront facturées à votre prix horaire normal. Dans les deux cas, les acheteurs qui achètent des contrats à long terme seront facturés d'avance, soit sous forme de paiement unique, soit sous forme de paiements futurs réguliers. Les acheteurs seront également facturés pour toute utilisation supplémentaire au-delà de leur contrat au tarif mesuré.   | 
| Tarification des contrats relatifs aux conteneurs |  **Conteneur avec prix contractuel** : produit basé sur un conteneur pour lequel l'acheteur paie des frais initiaux. Pour en savoir plus sur la tarification des contrats, voir[Tarification contractuelle pour les produits en conteneur avec AWS License Manager](container-license-manager-integration.md).  | 

# Intégrations relatives à la facturation, au mesurage et aux licences des produits conteneurisés
<a name="container-products-billing-integration"></a>

AWS Marketplace s'intègre Services AWS à d'autres pour fournir à la fois des mesures et une tarification basée sur des contrats pour votre produit en conteneur. Pour les produits basés sur des conteneurs soumis à une tarification d'utilisation, vous pouvez utiliser le [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html)pour vérifier le droit d'utiliser votre produit et mesurer l'utilisation à des fins de facturation. Pour les produits basés sur des conteneurs assortis de tarifs contractuels, vous pouvez utiliser le AWS License Manager pour associer des licences à votre produit. Les sections suivantes fournissent plus d'informations sur le comptage horaire et personnalisé AWS Marketplace Metering Service ainsi que sur la tarification contractuelle avec AWS License Manager.

**Topics**
+ [Comptage horaire et personnalisé avec AWS Marketplace Metering Service](#entitlement-and-metering-for-paid-products)
+ [Tarification contractuelle avec AWS License Manager](#container-products-contracts-license-manager)
+ [Configuration du comptage horaire avec AWS Marketplace Metering Service](container-metering-registerusage.md)
+ [Configuration du comptage personnalisé pour les produits conteneurisés avec AWS Marketplace Metering Service](container-metering-meterusage.md)
+ [Tarification contractuelle pour les produits en conteneur avec AWS License Manager](container-license-manager-integration.md)

## Comptage horaire et personnalisé avec AWS Marketplace Metering Service
<a name="entitlement-and-metering-for-paid-products"></a>

Pour vérifier le droit d'utiliser votre produit et pour mesurer l'utilisation à des fins de facturation, utilisez le service de [AWS Marketplace mesure](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html). Si vous souhaitez définir vos propres unités de tarification et nous communiquer cette consommation pour la facturation, intégrez-les à l'aide de l'opération [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. Si vous souhaitez fixer le prix de votre produit en fonction du nombre de tâches ou de modules utilisés et que vous souhaitez AWS mesurer automatiquement cette utilisation, intégrez-le à l'aide de l'opération [RegisterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_RegisterUsage.html)API. Pour les deux types de tarification, vous pouvez ajouter un prix contractuel à long terme sans modifier la façon dont vous vous intégrez au AWS Marketplace Metering Service.

Lorsque vous créez un nouveau produit conteneur dans le Portail de gestion AWS Marketplace, nous fournissons un ensemble d'identifiants de produit (le code du produit et la clé publique) qui sont utilisés pour intégrer votre produit au AWS Marketplace Metering Service.

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

L'intégration avec le vous AWS Marketplace Metering Service permet de vérifier que le client qui utilise votre logiciel payant est abonné à votre produit AWS Marketplace, vous protégeant ainsi contre toute utilisation non autorisée lors du démarrage du conteneur. Pour vérifier l'éligibilité, utilisez les opérations de l'[RegisterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_RegisterUsage.html)API [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)or, en fonction de votre modèle de tarification. Pour les modèles de tarification horaire et mensuelle fixe, utilisez l'opération `RegisterUsage` API. Pour les modèles de tarification personnalisés, utilisez l'opération `MeterUsage` API.

Si un acheteur n'a pas droit à votre produit, ces opérations d'API renvoient l'`CustomerNotEntitledException`exception.

**Note**  
Si un acheteur se désabonne de votre produit pendant l’exécution de celui-ci, il a le droit de continuer à l'exécuter. Cependant, il ne peut pas lancer de conteneurs supplémentaires pour votre produit.

### Consignes relatives à l’intégration
<a name="integration-guidelines"></a>

Lorsque vous créez et publiez vos produits en conteneur et que vous utilisez les opérations de l'`RegisterUsage`API `MeterUsage` or pour les droits et le comptage, gardez à l'esprit les directives suivantes :
+ Ne configurez pas les AWS informations d'identification dans votre logiciel ou dans l'image du conteneur Docker. AWS les informations d'identification de l'acheteur sont automatiquement obtenues lors de l'exécution lorsque votre image de conteneur est exécutée dans une tâche Amazon ECS ou un pod Amazon EKS.
+  Pour appeler les opérations `RegisterUsage` d'API `MeterUsage` ou depuis Amazon EKS, vous devez [utiliser un AWS SDK compatible](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html). Pour tester `MeterUsage` ou `RegisterUsage` intégrer Amazon EKS, vous devez exécuter un cluster Amazon EKS exécutant Kubernetes 1.13.x ou une version ultérieure. Kubernetes 1.13 est requis pour les rôles Gestion des identités et des accès AWS (IAM) afin de prendre en charge les pods. Les rôles IAM sont nécessaires pour que le pod en cours d'exécution obtienne les AWS informations d'identification requises pour invoquer ces actions sur Amazon EKS. 
+ Vous pouvez effectuer du développement local, mais vous obtiendrez une exception `PlatformNotSupportedException`. Cette exception ne se produit pas lorsque vous lancez le conteneur sur des services de AWS conteneur (Amazon ECS, Amazon EKS et Fargate).

### Soutenu Régions AWS
<a name="supported-regions-metering"></a>

Pour une liste de toutes les solutions AWS Marketplace prises en charge Régions AWS, consultez le [tableau des régions](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/) sur le site Web de l'infrastructure mondiale.

#### Obtenir le Région AWS pour le comptage
<a name="metering-aws-region-configuration"></a>

Lorsque vous intégrez votre conteneur à des fins de mesure à l'opération `MeterUsage` ou à l'`RegisterUsage`API, ne configurez pas le AWS SDK pour utiliser une opération spécifique. Région AWS La région doit être obtenue de manière dynamique lors de l'exécution. 

**Example**  
Par exemple, un client lance une tâche Amazon ECS ou un pod Amazon EKS. L'opération `RegisterUsage` d'API est appelée dans une région différente de la région où la tâche Amazon ECS ou le pod Amazon EKS a été lancé. Par conséquent, l'opération d'`RegisterUsage`API génère une `InvalidRegionException` erreur.



AWS Les langages du SDK ne les déterminent pas de `AWS_REGION` manière cohérente. Si votre SDK ne détecte pas automatiquement le`AWS_REGION`, le logiciel doit être écrit manuellement pour déterminer le`AWS_Region`. Par exemple, utilise AWS SDK pour Java automatiquement les [métadonnées de l'instance Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) (en particulier`ec2InstanceMetadata`) pour obtenir la région en l'absence de variables d'environnement ou d'autres configurations. Dans ce cas, appelez uniquement `ec2InstanceMetadata` si la variable d'environnement `AWS_REGION` n'est pas présente.

Pour plus d'informations sur la manière d'obtenir dynamiquement un Région AWS au moment de l'exécution, reportez-vous au [guide du développeur du AWS SDK correspondant](https://aws.amazon.com/tools) à votre langage de programmation.

### Empêcher toute modification de la mesure
<a name="prevent-metering-modification"></a>

L'introduction de moyens permettant aux acheteurs de modifier ou d’ignorer les appels vers `RegisterUsage` ou `MeterUsage` peut entraîner des problèmes indésirables concernant la facturation et les paiements. Nous vous recommandons vivement d'intégrer la logique de mesure et d'autorisation.

Lorsque vous concevez votre produit pour empêcher toute modification des mesures, gardez à l'esprit les points suivants :
+ Si les acheteurs peuvent insérer de nouvelles couches d'image contenant des `CMD` `ENTRYPOINT` instructions, intégrez-les directement `RegisterUsage` ou `MeterUsage` dans le logiciel qu'ils exécutent pour parcourir votre image de conteneur. Dans le cas contraire, les appels vers `RegisterUsage` `CMD` ou `MeterUsage` exécutés via ou `ENTRYPOINT` depuis l'image de base seront probablement annulés par l'acheteur.
+ Nous vous recommandons de gérer les codes de AWS Marketplace produit que votre logiciel utilise comme entrée `RegisterUsage` ou d'une `MeterUsage` manière que les acheteurs ne peuvent pas modifier. *Toutefois, si votre produit gère les codes de produit d'une manière que les clients peuvent ignorer, telle que AWS CloudFormation le graphique Helm ou le manifeste Kubernetes, vous devez tenir à jour une liste de codes de produits fiables.* AWS Marketplace Cela permet de garantir que le code produit que votre logiciel transmet en entrée `RegisterUsage` ou qu'`MeterUsage`il est valide.
+  Si certains de vos codes produits approuvés correspondent à des produits gratuits, vous devez vous assurer qu'ils ne peuvent pas être utilisés à la place d'un code de produit payant.

## Tarification contractuelle avec AWS License Manager
<a name="container-products-contracts-license-manager"></a>

Pour les produits basés sur des conteneurs dont la tarification est contractuelle, vous pouvez associer AWS License Manager des licences à votre produit. 

AWS License Manager est un outil de gestion des licences qui permet à votre application de suivre et de mettre à jour les licences (également appelées droits) achetées par un client. Cette section fournit des informations sur la manière d'intégrer votre produit à AWS License Manager. Une fois l'intégration terminée, vous pouvez publier votre liste de produits sur AWS Marketplace.

Pour plus d'informations AWS License Manager, consultez le [guide de AWS License Manager l'utilisateur](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) et la [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)section du manuel de *référence des AWS CLI commandes*.

**Note**  
Les clients ne peuvent pas lancer de nouvelles instances du conteneur après la période d'expiration du contrat. Cependant, pendant la durée du contrat, ils peuvent lancer autant d'instances que vous le souhaitez. Ces licences ne sont pas liées à un nœud ou à une instance spécifique. Tout logiciel exécuté sur n'importe quel conteneur sur n'importe quel nœud peut récupérer la licence à condition qu'il dispose des AWS informations d'identification attribuées.
**Création d'offres privées** — Les vendeurs peuvent générer des offres privées pour les produits à l'aide de l'outil de création d'offres privées du Portail de gestion AWS Marketplace.
**Rapports** — Vous pouvez configurer des flux de données en configurant un compartiment Amazon S3 dans la section **Rapport** du Portail de gestion AWS Marketplace. Pour de plus amples informations, veuillez consulter [Rapports sur les vendeurs, flux de données et tableaux de bord dans AWS Marketplace](reports-and-data-feed.md).

### Flux de travail d'intégration
<a name="container-LM-LM-workflow"></a>

Les étapes suivantes montrent le flux de travail permettant d'intégrer votre produit en conteneur à AWS License Manager :

1. Le vendeur crée un produit avec AWS License Manager intégration.

1. Le vendeur met en vente le produit sur AWS Marketplace.

1. L'acheteur trouve le produit dessus AWS Marketplace et l'achète.

1. Une licence est envoyée à l'acheteur dans son Compte AWS.

1. L'acheteur utilise le logiciel en lançant l'instance Amazon EC2, la tâche Amazon ECS ou le logiciel Amazon EKS pod. Le client effectue le déploiement à l'aide d'un rôle IAM.

1. Le logiciel lit la licence enregistrée sur le AWS License Manager compte de l'acheteur, découvre les droits achetés et fournit les fonctionnalités en conséquence. 
**Note**  
License Manager n'effectue aucun suivi ni aucune mise à jour ; cela est effectué par l'application du vendeur.

# Configuration du comptage horaire avec AWS Marketplace Metering Service
<a name="container-metering-registerusage"></a>

**Note**  
 Pour les déploiements Amazon EKS, votre logiciel doit utiliser les [rôles IAM pour les comptes de service (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) afin de signer l'appel d'API pour l'[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)opération d'API. Avec [EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), le rôle de nœud ou les clés d'accès à long terme ne sont pas pris en charge.  
Pour les déploiements Amazon ECS, votre logiciel doit utiliser le rôle [IAM de la tâche Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) pour signer l'appel d'API pour l'opération d'[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)API. L'utilisation du rôle de nœud ou de clés d'accès à long terme n'est pas prise en charge.

Si votre produit en conteneur utilise une tarification par heure, par tâche ou par dosette au lieu de mesures personnalisées, vous n'avez pas besoin de définir des dimensions de mesure personnalisées. Vous pouvez utiliser AWS Marketplace Metering Service pour le comptage horaire des produits en conteneur. AWS Marketplace Les sections suivantes expliquent comment configurer le comptage horaire avec AWS Marketplace Metering Service.

Le fonctionnement de l'`RegisterUsage`API mesure l'utilisation du logiciel par tâche Amazon Elastic Container Service (Amazon ECS) ou par pod Amazon Elastic Kubernetes Service (Amazon EKS), par heure, l'utilisation étant calculée au prorata de la seconde. Un minimum d'une minute d'utilisation s'applique aux tâches de courte durée. La mesure continue pour l'utilisation du logiciel est automatiquement gérée par le AWS Marketplace Metering Control Plane. Votre logiciel n'est pas obligé d'effectuer des actions spécifiques de mesure, sauf d'en appeler `RegisterUsage` une seule fois pour que le mesurage de l'utilisation du logiciel commence.

`RegisterUsage`doit être appelé immédiatement au moment du lancement d'un conteneur. Si vous n'enregistrez pas le conteneur dans les 6 premières heures suivant son lancement, AWS Marketplace Metering Service ne fournit aucune garantie de comptage pour les mois précédents. Cependant, le comptage se poursuivra pour le mois en cours jusqu'à la fin du conteneur.

Les clients AWS Marketplace Metering Control Plane continuent d'être facturés pour l'exécution de tâches Amazon ECS et de pods Amazon EKS, quel que soit l'état de leur abonnement. Votre logiciel n'a donc plus besoin de vérifier les droits après le lancement initial réussi de la tâche ou du module. 

Pour plus d'informations sur l'intégration de AWS Marketplace Metering Service l'API aux produits en conteneur avec une tarification horaire, consultez le laboratoire d'[intégration au comptage horaire](https://catalog.workshops.aws/mpseller/en-US/container/integrate-hourly) de l'*atelier destiné aux AWS Marketplace vendeurs*. 

**Topics**
+ [Prérequis pour la mesure horaire](#hourly-metering-prereqs)
+ [Tester l'intégration pour `RegisterUsage`](#testing-integration-for-registerusage)
+ [Gestion des erreurs pour `RegisterUsage`](#hourly-metering-entitlement-error-handling)
+ [Intégrer votre produit conteneur au service de mesure AWS Marketplace à l'aide du AWS SDK pour Java](java-integration-example-registerusage.md)

## Prérequis pour la mesure horaire
<a name="hourly-metering-prereqs"></a>

Avant de publier le produit, vous devez effectuer les opérations suivantes :

1. Créez un nouveau produit conteneur dans Portail de gestion AWS Marketplace le et notez son code produit.

   Pour de plus amples informations, veuillez consulter [Vue d'ensemble : Création d'un produit en conteneur](container-product-getting-started.md#create-container-product).

1. Utilisez un rôle Gestion des identités et des accès AWS (IAM) pour la tâche ou le module exécutant votre application avec les autorisations IAM nécessaires pour appeler. `RegisterUsage` La politique gérée par IAM `AWSMarketplaceMeteringRegisterUsage` dispose de ces autorisations. Pour plus d'informations sur la politique, consultez [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)la *référence des stratégies AWS gérées*.

1. (Facultatif) Si vous souhaitez voir la journalisation, nous vous recommandons d'activer la AWS CloudTrail journalisation dans la définition de la tâche ou du module.

1. Effectuez un appel test à l'opération d'`RegisterUsage`API avec un enregistrement de toutes les dimensions de tarification que vous définissez.

## Tester l'intégration pour `RegisterUsage`
<a name="testing-integration-for-registerusage"></a>

Utilisez l'opération `RegisterUsage` API pour tester votre intégration avant de soumettre votre image à des AWS Marketplace fins de publication.

Appelez `RegisterUsage` depuis l'image du conteneur en exécutant votre produit sur Amazon ECS ou Amazon EKS. Utilisez le AWS compte que vous utilisez pour mettre le produit en vente AWS Marketplace. Votre intégration de mesure doit définir le de manière dynamique Région AWS, plutôt que de le coder en dur. Toutefois, lors du test, lancez au moins une tâche Amazon ECS ou un pod Amazon EKS contenant votre conteneur payant dans la région USA Est (Virginie du Nord). Ce faisant, l'équipe AWS Marketplace des opérations peut vérifier votre travail à l'aide des journaux de cette région.

**Note**  
Si votre produit prend en charge à la fois Amazon ECS et Amazon EKS, il vous suffit de le lancer dans Amazon EKS pour que nous puissions valider votre intégration.

Vous ne pouvez pas tester totalement l'intégration tant que votre produit n’a pas été publié avec toutes les métadonnées requises et les informations de tarification. Sur demande, l'équipe chargée des opérations du AWS Marketplace catalogue peut vérifier la réception de vos relevés de mesure.

## Gestion des erreurs pour `RegisterUsage`
<a name="hourly-metering-entitlement-error-handling"></a>

Si l'image de votre conteneur s'intègre à AWS Marketplace Metering Service et reçoit une exception autre qu'`ThrottlingException`au démarrage du conteneur, vous devez mettre fin au conteneur pour empêcher toute utilisation non autorisée.

Les exceptions autres que ne `ThrottlingException` sont émises que lors de l'appel initial à l'opération `RegisterUsage` d'API. Les appels suivants provenant de la même tâche Amazon ECS ou du même pod Amazon EKS ne sont pas lancés, `CustomerNotSubscribedException` même si le client se désabonne alors que la tâche ou le module est toujours en cours d'exécution. Ces clients sont toujours facturés pour la gestion des conteneurs après leur désinscription, et leur utilisation est suivie.

Le tableau suivant décrit les erreurs que l'opération `RegisterUsage` d'API peut générer. Chaque langage de programmation du AWS SDK possède un ensemble de directives de gestion des erreurs auxquelles vous pouvez vous référer pour plus d'informations. 


|  **Error (Erreur)**  |  **Description**  | 
| --- | --- | 
|  InternalServiceErrorException  |  RegisterUsage n'est pas disponible.  | 
|  CustomerNotEntitledException  |  Le client ne dispose pas d'un abonnement valable pour le produit.  | 
|  InvalidProductCodeException  |  La valeur ProductCode transmise dans le cadre de la requête n'existe pas.  | 
|  InvalidPublicKeyException  |  La valeur PublicKeyVersion transmise dans le cadre de la requête n'existe pas.  | 
|  PlatformNotSupportedException  |  AWS Marketplace ne prend pas en charge la mesure de l'utilisation à partir de la plateforme sous-jacente. Seuls Amazon ECS, Amazon EKS et Amazon AWS Fargate sont pris en charge.  | 
|  ThrottlingException  |  Les appels vers RegisterUsage sont limités.  | 
|  InvalidRegionException  |  RegisterUsagedoit être appelée de la même manière Région AWS que la tâche Amazon ECS ou le pod Amazon EKS a été lancé. Cela empêche un conteneur de choisir une région (par exemple, withRegion(“us-east-1”)) lorsqu’il appelle RegisterUsage.  | 

# Intégrer votre produit conteneur au service de mesure AWS Marketplace à l'aide du AWS SDK pour Java
<a name="java-integration-example-registerusage"></a>

Vous pouvez utiliser le AWS SDK pour Java pour intégrer le service de mesure AWS Marketplace. La mesure continue pour l'utilisation du logiciel est automatiquement gérée par le AWS Marketplace Metering Control Plane. Votre logiciel n'est pas obligé d'effectuer des actions spécifiques de mesure, sauf d'en appeler `RegisterUsage` une seule fois pour que le mesurage de l'utilisation du logiciel commence. Cette rubrique fournit un exemple d'implémentation utilisant le AWS SDK pour Java pour intégrer l'`RegisterUsage`action [AWS Marketplace du service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) de mesure. 

`RegisterUsage`doit être appelé immédiatement au moment du lancement d'un conteneur. Si vous n'enregistrez pas le conteneur dans les 6 premières heures suivant son lancement, AWS Marketplace Metering Service ne fournit aucune garantie de comptage pour les mois précédents. Cependant, le comptage se poursuivra pour le mois en cours jusqu'à la fin du conteneur.

Pour la source complète, consultez [RegisterUsage Exemple Java](#registerusage-java-example). La plupart de ces étapes s'appliquent quelle que soit la langue du AWS SDK. 



**Exemples d'étapes pour l'intégration du service de mesure AWS Marketplace**

1. Connectez-vous au [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/tour).

1. À partir de **Assets (Ressources)**, choisissez **Containers (Conteneurs)** pour commencer à créer un produit de conteneur. La création du produit génère le code produit pour l'intégration du produit à votre image de conteneur. Pour plus d'informations sur la définition des autorisations IAM, consultez[AWS Marketplace autorisations de l'API de mesure et d'autorisation](iam-user-policy-for-aws-marketplace-actions.md).

1.  Téléchargez le kit [Java SDK AWS](https://aws.amazon.com/sdk-for-java/) public. 
**Important**  
 Pour appeler le compteur APIs depuis Amazon EKS, vous devez [utiliser un AWS SDK compatible et l'exécuter sur un](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) cluster Amazon EKS exécutant Kubernetes 1.13 ou version ultérieure. 

1.  (Facultatif) Si vous intégrez l'`RegisterUsage`action et que vous souhaitez effectuer une vérification de signature numérique, vous devez configurer la bibliothèque de vérification de [BouncyCastle](https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on)signature dans le chemin de classe de votre application.

   Si vous souhaitez utiliser JSON Web Token (JWT), vous devez également inclure des bibliothèques [JWT Java](https://jwt.io/) dans votre chemin de classe d'applications. L'utilisation de JWT fournit une approche plus simple de la vérification des signatures, mais elle n'est pas obligatoire, et vous pouvez utiliser le mode autonome BouncyCastle à la place. Que vous utilisiez JWT ou BouncyCastle que vous deviez utiliser un système de compilation tel que Maven pour inclure les dépendances transitives de BouncyCastle ou JWT dans le chemin de classe de votre application.

   ```
   // 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.  Appelez `RegisterUsage` à partir de chaque image de conteneur payante dans votre offre de produit. `ProductCode` et `PublicKeyVersion` sont des paramètres obligatoires et toutes les autres entrées sont facultatives. Voici un exemple de charge utile pour `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
   }
   ```
**Note**  
Il est possible que des problèmes transitoires se produisent lors de la connexion au service de mesure AWS Marketplace. AWS Marketplace recommande vivement d'implémenter des tentatives d'une durée maximale de 30 minutes, avec des interruptions exponentielles, afin d'éviter les pannes de courte durée ou les problèmes de réseau.

1.  `RegisterUsage` génère une signature numérique RSA-PSS à l'aide de SHA-256 que vous pouvez utiliser pour vérifier l'authenticité de la requête. La signature inclut les champs suivants : `ProductCode`, `PublicKeyVersion`, et `Nonce`. Pour vérifier la signature numérique, vous devez conserver ces champs à partir de la requête. Le code suivant est un exemple de réponse à un appel `RegisterUsage`. 

   ```
   {
   "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. Reconstruisez une nouvelle version de l'image de votre conteneur qui inclut l'`RegisterUsage`appel, balisez le conteneur et envoyez-la vers n'importe quel registre de conteneurs compatible avec Amazon ECS ou Amazon EKS, tel qu'Amazon ECR ou Amazon ECR Public. Si vous utilisez Amazon ECR, assurez-vous que le compte qui lance la tâche Amazon ECS ou le pod Amazon EKS dispose d'autorisations sur le référentiel Amazon ECR. Dans le cas contraire, le lancement échoue.

1.  Créez un rôle [IAM](https://aws.amazon.com/iam/) qui accorde l'autorisation à votre conteneur d'appeler `RegisterUsage`, tel que défini dans le code suivant. Vous devez fournir ce rôle IAM dans le paramètre [Task Role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) de la tâche Amazon ECS ou de la définition du pod Amazon EKS.

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

****  

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

------

1. Créez une tâche Amazon ECS ou une définition de module Amazon EKS qui fait référence au conteneur intégré AWS Marketplace et au rôle IAM que vous avez créé à l'étape 7. Vous devez activer la AWS CloudTrail journalisation dans la définition de tâche si vous souhaitez voir la journalisation. 

1. Créez un cluster Amazon ECS ou Amazon EKS pour exécuter votre tâche ou votre pod. Pour plus d'informations sur la création d'un cluster Amazon ECS, consultez la section [Création d'un cluster](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html) dans le manuel *Amazon Elastic Container Service Developer Guide*. Pour plus d'informations sur la création d'un cluster Amazon EKS (à l'aide de Kubernetes version 1.1.3.x ou ultérieure), consultez Création [d'un](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html) cluster Amazon EKS.

1. Configurez le cluster Amazon ECS ou Amazon EKS et lancez la définition de tâche Amazon ECS ou le pod Amazon EKS que vous avez créé, dans le us-east-1 Région AWS. Ce n'est que pendant ce processus de test, avant que le produit ne soit mis en service, que vous devez utiliser cette région.

1. Lorsque vous recevez une réponse valide de `RegisterUsage`, vous pouvez commencer à créer votre produit de conteneur. Pour toute question, contactez l’équipe responsable des [opérations vendeur AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/). 

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

L'exemple suivant utilise le service de AWS Marketplace mesure AWS SDK pour Java et pour appeler l'`RegisterUsage`opération. La vérification de la signature est facultative, mais si vous souhaitez l'effectuer, vous devez inclure les bibliothèques de vérification de signatures numériques nécessaires. Cet exemple est donné uniquement à titre d'illustration. 

```
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();
        }
    }
}
```

# Configuration du comptage personnalisé pour les produits conteneurisés avec AWS Marketplace Metering Service
<a name="container-metering-meterusage"></a>

**Note**  
 Pour les déploiements Amazon EKS, votre logiciel doit utiliser les [rôles IAM pour les comptes de service (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) afin de signer l'appel d'API pour l'[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)opération d'API. Avec [EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), le rôle de nœud ou les clés d'accès à long terme ne sont pas pris en charge.  
Pour les déploiements Amazon ECS, votre logiciel doit utiliser le rôle [IAM de la tâche Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) pour signer l'appel d'API pour l'opération d'[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)API. L'utilisation du rôle de nœud ou de clés d'accès à long terme n'est pas prise en charge.  
Pour les déploiements Amazon Bedrock AgentCore Runtime, votre logiciel doit utiliser le [rôle AgentCore d'exécution Runtime](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html#runtime-permissions-execution) pour signer l'appel d'API pour l'opération d'[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)API. Les clés d'accès à long terme ne sont pas prises en charge.

AWS Marketplace les produits en conteneur peuvent être mesurés sur mesure pour un maximum de 24 dimensions de prix différentes par produit. Chaque dimension peut être associée à un prix contractuel à long terme. Pour activer le comptage personnalisé, intégrez votre produit conteneur à AWS Marketplace Metering Service. Vous pouvez définir vos propres unités de tarification et des mesures personnalisées pour cette utilisation ou pour la facturation à AWS l'aide de l'opération [https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. Les sections suivantes vous montrent comment configurer le comptage personnalisé pour votre produit en conteneur.

Les dimensions du prix sont définies à deux endroits, une fois lors de la création de votre produit dans le Portail de gestion AWS Marketplace (portail des vendeurs) et une fois dans votre logiciel pour effectuer l'`MeterUsage`opération. Cette méthode à deux facteurs garantit que les offres suivantes fonctionnent comme prévu avant d'être mises à la disposition du public.

Pour configurer le comptage personnalisé, vous devez choisir la catégorie d'utilisation, le type d'unité et les dimensions de tarification : 
+ **Catégorie d'utilisation** — La catégorie d'utilisation aide les acheteurs à comprendre ce qu'est votre produit et comment l'utiliser. 
+ **Type d'unité** — Le type d'unité définit l'unité de mesure pour la facturation. Par exemple, la bande passante mesurée en GBps ou MBps, le nombre d'hôtes, ou les données mesurées en Mo, Go ou To.
+ **Dimensions tarifaires** : les dimensions tarifaires représentent une fonctionnalité ou un service pour lequel vous avez défini un prix unitaire (par exemple, les utilisateurs, les scans, les v CPUs ou les agents déployés). Les dimensions des prix sont publiques. Cependant, vous pouvez toujours définir des offres privées et des offres BYOL (Bring Your Own License) pour les produits publics. N'envoyez pas de tarification dans les relevés de mesure. Vous mesurez la quantité d'unités, et nous l'utilisons avec les prix que vous avez définis lors de la création de votre produit pour calculer la facture de l'acheteur. 

  Si le prix de votre produit ne correspond à aucune des catégories ou types d'unités prédéfinis, vous pouvez choisir la catégorie **d'unités** générique. Utilisez ensuite la description des dimensions pour décrire l'unité.

Vous pouvez éventuellement répartir l'utilisation en allocations en fonction des propriétés que vous suivez. Les allocations sont représentées sous forme de balises pour l'acheteur. Ces balises permettent à l'acheteur de visualiser ses coûts répartis en fonction de l'utilisation par valeur des balises. Par exemple, si vous facturez par utilisateur et que les utilisateurs ont une propriété « Service », vous pouvez créer des allocations d'utilisation avec des balises comportant la clé « Département », et une allocation par valeur. Cela ne modifie pas le prix, les dimensions ou l'utilisation totale que vous signalez, mais permet à votre client de consulter ses coûts par catégories correspondant à votre produit.

Nous vous recommandons d'envoyer un relevé de mesure toutes les heures. Cependant, vous pouvez également agréger l'utilisation sur des périodes quotidiennes ou mensuelles. En cas de panne, vous pouvez agréger l'utilisation du logiciel par l'acheteur et l'envoyer dans les heures qui suivent pour le comptage. Vous ne pouvez pas envoyer plus d'un enregistrement par heure.

Pour plus d'informations sur l'intégration de AWS Marketplace Metering Service l'API pour les produits en conteneurs avec des tarifs de dosage personnalisés, consultez le laboratoire d'[intégration aux compteurs personnalisés](https://catalog.workshops.aws/mpseller/en-US/container/integrate-custom) de l'atelier destiné aux *AWS Marketplace vendeurs*.

**Important**  
L'essai gratuit et les droits prépayés sont suivis sur une base horaire. Par conséquent, l'envoi de ces enregistrements séparément peut entraîner une surfacturation à l'acheteur.

**Topics**
+ [Prérequis à la mesure personnalisée](#custom-metering-prereqs)
+ [`MeterUsage`Intégration des tests pour ECS et EKS](#testing-meterusage-integration)
+ [Tester MeterUsage l'intégration pour AgentCore](#testing-agentcore-metering)
+ [Gestion des erreurs pour `MeterUsage`](#custom-metering-entitlement-error-handling)
+ [(Facultatif) Marquage mesuré par le fournisseur](#container-vendor-metered-tagging)
+ [Exemple de code](#container-meter-code-example)
+ [Intégration de votre produit en conteneur à l'aide d'un dosage personnalisé avec le et AWS Marketplace Metering Service AWS SDK pour Java](java-integration-example-meterusage.md)

## Prérequis à la mesure personnalisée
<a name="custom-metering-prereqs"></a>

Avant de publier le produit, vous devez effectuer les opérations suivantes :

1. Créez un nouveau produit conteneur dans Portail de gestion AWS Marketplace le et notez son code produit.

1. Utilisez un rôle Gestion des identités et des accès AWS (IAM) pour la tâche, le pod ou le point de terminaison AgentCore d'exécution exécutant votre application avec les autorisations IAM nécessaires pour appeler. `MeterUsage` La politique gérée par IAM `AWSMarketplaceMeteringRegisterUsage` dispose de ces autorisations. Pour plus d'informations sur la politique, consultez [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)la *référence des stratégies AWS gérées*.

1. (Facultatif) Nous vous recommandons d'activer la AWS CloudTrail journalisation dans la définition de la tâche ou du pod si vous souhaitez voir la journalisation.

1. Effectuez un appel test à l'opération d'`MeterUsage`API avec un enregistrement de toutes les dimensions de tarification que vous définissez.

## `MeterUsage`Intégration des tests pour ECS et EKS
<a name="testing-meterusage-integration"></a>

Utilisez cette `MeterUsage` opération pour tester votre intégration avant de soumettre votre image à des AWS Marketplace fins de publication.

Appelez `MeterUsage` depuis les images du conteneur en exécutant votre produit sur Amazon Elastic Container Service (Amazon ECS) ou Amazon Elastic Kubernetes Service (Amazon Compte AWS EKS) avec le logiciel que vous avez utilisé pour mettre le produit en vente. AWS Marketplace Votre intégration de mesure doit le définir dynamiquement Région AWS, plutôt que de le coder en dur. Toutefois, lors du test, lancez au moins une tâche Amazon ECS ou un module Amazon EKS contenant votre conteneur payant dans la région de l'est des États-Unis (Virginie du Nord) afin que l'équipe AWS Marketplace des opérations puisse vérifier votre travail avec les journaux de cette région.

**Note**  
Si votre produit prend en charge à la fois Amazon ECS et Amazon EKS, il vous suffit de le lancer dans Amazon EKS pour que nous puissions valider votre intégration.
Testez chaque dimension avant de lancer votre produit auprès du public et après avoir ajouté une nouvelle dimension. Si vous n'envoyez pas d'enregistrement de mesure pour chaque dimension associée à un produit en conteneur, une erreur se produira et la demande échouera.

Vous ne pouvez pas tester totalement l'intégration tant que votre produit n’a pas été publié avec toutes les métadonnées requises et les informations de tarification. Sur demande, l'équipe chargée des opérations du AWS Marketplace catalogue peut vérifier la réception de vos relevés de mesure.

## Tester MeterUsage l'intégration pour AgentCore
<a name="testing-agentcore-metering"></a>

Utilisez cette `MeterUsage` opération pour tester votre intégration avant de soumettre votre image à des AWS Marketplace fins de publication.

Appelez `MeterUsage` à partir des images du conteneur en lançant votre produit sur Amazon Bedrock AgentCore avec le AWS compte sur AWS Marketplace lequel vous avez mis le produit en vente. Votre intégration de mesure doit définir la AWS région de manière dynamique, plutôt que de la coder en dur. Toutefois, lors du test, lancez au moins un AgentCore agent Amazon Bedrock contenant votre conteneur payant dans la région USA Est (Virginie du Nord) afin que l'équipe AWS Marketplace des opérations puisse vérifier votre travail avec les journaux de cette région. 

 Il n'est pas nécessaire d'agréger les enregistrements d'utilisation horaire. Appelez `MeterUsage` chaque invocation d'agent avec l'utilisation de cette invocation.

Vous devez utiliser la dernière version du AWS SDK pour votre langue. Cela permet de renseigner automatiquement le `ClientToken` paramètre avec une valeur générée automatiquement pour faciliter l'idempuissance. Les versions précédentes du SDK qui ne renseignent pas ce champ ne fonctionneront pas pour les `MeterUsage` appels provenant d'Amazon Bedrock. AgentCore En raison d'un problème réseau, vous devez réutiliser exactement la même demande lorsque vous réessayez. Cela garantit que les demandes sont traitées de manière idempotente.

En raison des différences de comportement de mesure attendu entre Amazon Bedrock AgentCore et les autres produits en conteneur, nous vous déconseillons de partager la même image de conteneur pour une utilisation sur Amazon Bedrock et AgentCore sur Amazon ECS ou EKS.

## Gestion des erreurs pour `MeterUsage`
<a name="custom-metering-entitlement-error-handling"></a>

Appelez le `MeterUsage` réglage du `DryRun` paramètre sur true au démarrage du conteneur pour vérifier que l'intégration de la mesure fonctionne. Si l'image de votre conteneur s'intègre à l'`MeterUsage`opération et reçoit une exception autre qu'`ThrottlingException`au démarrage du conteneur, vous devez arrêter le conteneur pour empêcher toute utilisation non autorisée.

Les exceptions autres que `ThrottlingException` sont générées uniquement lors de l'appel initial de `MeterUsage`. Les appels suivants provenant de la même tâche Amazon ECS, du même pod Amazon EKS ou du même point de terminaison AgentCore Runtime ne sont pas lancés`CustomerNotSubscribedException`, même si le client se désabonne alors que la tâche ou le module est toujours en cours d'exécution. Ces clients sont toujours facturés pour la gestion des conteneurs après leur désinscription, et leur utilisation est suivie.

Consultez [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)la *référence de l'AWS Marketplace Metering Service API* pour obtenir une description détaillée des erreurs courantes pour`MeterUsage`. Chaque langage de programmation du AWS SDK possède un ensemble de directives de gestion des erreurs auxquelles vous pouvez vous référer pour plus d'informations. 

## (Facultatif) Marquage mesuré par le fournisseur
<a name="container-vendor-metered-tagging"></a>

Le balisage mesuré par le fournisseur aide les fournisseurs de logiciels indépendants (ISVs) à donner à l'acheteur un aperçu plus précis de l'utilisation de ses logiciels et peut l'aider à répartir les coûts.

**Note**  
Le balisage mesuré par le fournisseur n'est pas pris en charge pour les demandes de mesure pour les produits Amazon Bedrock. AgentCore 

Plusieurs méthodes s'offrent à vous pour étiqueter l'utilisation du logiciel par un acheteur. La première consiste à demander d'abord à vos acheteurs ce qu'ils souhaitent voir dans leur répartition des coûts. Vous pouvez ensuite répartir l'utilisation entre les propriétés que vous suivez pour le compte de l'acheteur. Les exemples de propriétés incluent `AccountId``Business Unit`,`Cost Centers`, et d'autres métadonnées pertinentes pour votre produit. Ces propriétés sont présentées à l'acheteur sous forme de balises. À l'aide de balises, les acheteurs peuvent voir leurs coûts répartis en fonction de l'utilisation selon les valeurs des balises dans leur console AWS de facturation ([https://console.aws.amazon.com/costmanagement/](https://console.aws.amazon.com/costmanagement/)). Le balisage mesuré par le fournisseur ne modifie pas le prix, les dimensions ou l'utilisation totale que vous signalez. Il permet à votre client de consulter ses coûts par catégories correspondant à votre produit.

Dans un cas d'utilisation courant, un acheteur s'abonne à votre produit avec l'un d'eux Compte AWS. L'acheteur possède également de nombreux utilisateurs associés au même abonnement au produit. Vous pouvez créer des allocations d'utilisation à l'aide de balises dotées d'une clé de`AccountId`, puis attribuer l'utilisation à chaque utilisateur. Dans ce cas, les acheteurs peuvent activer le `AccountId` tag dans leur console Billing and Cost Management et analyser l'utilisation individuelle des utilisateurs.

### Expérience du vendeur
<a name="container-vendor-metered-tag-seller"></a>

Les vendeurs peuvent agréger les relevés de mesure des ressources avec le même ensemble de balises au lieu d'agréger l'utilisation de toutes les ressources. Par exemple, les vendeurs peuvent créer le registre des compteurs qui inclut différents `UsageAllocations` compartiments. Chaque compartiment représente `UsageQuantity` un ensemble de balises, telles que `AccountId` et`BusinessUnit`. 

Dans le schéma suivant, la **ressource 1** possède un ensemble unique de `BusinessUnit` balises `AccountId` et apparaît dans l'**enregistrement de mesure sous** la forme d'une entrée unique. 

La **ressource 2** et la **ressource 3** ont toutes deux le même `AccountId` tag`2222`, et le même `BusinessUnit` tag,`Operations`. Par conséquent, ils sont combinés en une seule `UsageAllocations` entrée dans le **registre de mesure**.

![\[Schéma illustrant la façon dont les étiquettes de mesure des fournisseurs combinent les données d'utilisation. Trois ressources (ressource 1, 2 et 3) différentes AccountIds BusinessUnits sont consolidées dans un seul enregistrement de mesure, UsageAllocations regroupées par AccountId et BusinessUnit avant d'être envoyées au AWS Marketplace Metering Service.\]](http://docs.aws.amazon.com/fr_fr/marketplace/latest/userguide/images/seller-vendor-meter-tag.png)


Les vendeurs peuvent également combiner des ressources sans balises en une seule `UsageAllocation` avec la quantité d'utilisation allouée et l'envoyer comme l'une des entrées`UsageAllocations`.

Les limites incluent :
+ Nombre de tags : 5
+ Taille de `UsageAllocations` (cardinalité) — 2 500

Les validations incluent :
+ Caractères autorisés pour la clé et la valeur du tag : a-zA-Z 0-9\$1 -= . \$1 : \$1 /@
+ Nombre maximum de balises dans `UsageAllocation` la liste : 5
+ Deux ne `UsageAllocations` peuvent pas avoir les mêmes balises (c'est-à-dire la même combinaison de clés et de valeurs de balise). Si tel est le cas, ils doivent utiliser le même`UsageAllocation`.
+ La somme `AllocatedUsageQuantity` de `UsageAllocation` doit être égale à`UsageQuantity`, qui est l'utilisation agrégée.

### Expérience d'acheteur
<a name="container-vendor-metered-tag-buyer"></a>

Le tableau suivant montre un exemple de l'expérience de l'acheteur après qu'un acheteur a activé les tags `AccountId` et `BusinessUnit` vendor. 

Dans cet exemple, l'acheteur peut voir l'utilisation allouée dans son **rapport d'utilisation des coûts**. Les balises mesurées par le fournisseur utilisent le préfixe. `“aws:marketplace:isv”` Les acheteurs peuvent les activer dans Billing and Cost Management, sous Cost Allocation Tags, sous les **balises de répartition** des **coûts AWS générées par** les acheteurs.

Les première et dernière lignes du **rapport d'utilisation des coûts** concernent ce que le vendeur envoie au service de comptage (comme indiqué dans l'[Expérience du vendeur](#container-vendor-metered-tag-seller)exemple).


**Rapport d'utilisation des coûts (simplifié)**  

| ProductCode  | Acheteur | UsageDimension | UsageQuantity | `aws:marketplace:isv:AccountId ` | `aws:marketplace:isv:BusinessUnit` | 
| --- | --- | --- | --- | --- | --- | 
| xyz | 111122223333 | Réseau : par (Go) inspecté  | 70 | 2222 | Opérations | 
| xyz | 111122223333 | Réseau : par (Go) inspecté  | 30 | 3333 | Finance | 
| xyz | 111122223333 | Réseau : par (Go) inspecté  | 20 | 4444 | IT | 
| xyz | 111122223333 | Réseau : par (Go) inspecté  | 20 | 5555 | Marketing | 
| xyz | 111122223333 | Réseau : par (Go) inspecté  | 30 | 1111 | Marketing | 

Pour obtenir un exemple de code, consultez [`MeterUsage`exemple de code avec balisage d'allocation d'utilisation (facultatif)](#container-meterusage-code-example).

## Exemple de code
<a name="container-meter-code-example"></a>

L'exemple de code suivant est fourni pour vous aider à intégrer votre produit conteneur aux éléments AWS Marketplace APIs requis pour la publication et la maintenance de votre produit.

### `MeterUsage`exemple de code avec balisage d'allocation d'utilisation (facultatif)
<a name="container-meterusage-code-example"></a>

L'exemple de code suivant est pertinent pour les produits en conteneur dotés de modèles de tarification à la consommation. L'exemple Python envoie un enregistrement de mesure avec les balises d'allocation d'utilisation appropriées AWS Marketplace pour facturer des pay-as-you-go frais à vos clients.

```
# 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 
)
```

Pour plus d'informations à ce sujet`MeterUsage`, consultez [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)la *référence de AWS Marketplace Metering Service l'API*.

### Exemple de réponse
<a name="container-meterusage-code-response"></a>

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

# Intégration de votre produit en conteneur à l'aide d'un dosage personnalisé avec le et AWS Marketplace Metering Service AWS SDK pour Java
<a name="java-integration-example-meterusage"></a>

AWS Marketplace les produits en conteneur peuvent être mesurés sur mesure pour un maximum de 24 dimensions de prix différentes par produit. Pour activer le comptage personnalisé, vous intégrez votre produit conteneur à AWS Marketplace Metering Service. Vous pouvez définir vos propres unités de tarification et des mesures personnalisées pour cette utilisation ou pour la facturation à AWS l'aide de l'opération [https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. L'exemple suivant décrit une implémentation qui utilise le AWS SDK pour Java pour s'intégrer au `MeterUsage` fonctionnement du [AWS Marketplace service de mesure](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html). 

Consultez [`MeterUsage`Exemples Java](#meterusage-java-example) pour plus de détails. La plupart des étapes suivantes s'appliquent quelle que soit la langue. 

**Exemple : intégration AWS Marketplace du service de mesure**

1. Connectez-vous à la [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/tour).

1. Dans **Ressources**, choisissez **Conteneurs** pour commencer à créer un nouveau produit conteneur. La création du produit génère le code produit pour l'intégration du produit à votre image de conteneur. Pour plus d'informations sur la définition des autorisations Gestion des identités et des accès AWS (IAM), consultez[AWS Marketplace autorisations de l'API de mesure et d'autorisation](iam-user-policy-for-aws-marketplace-actions.md).

1.  Téléchargez le kit [Java SDK AWS](https://aws.amazon.com/sdk-for-java/) public. 
**Important**  
 Pour appeler les opérations de l'API de mesure depuis Amazon Elastic Kubernetes Service (Amazon EKS)[, vous devez AWS utiliser](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) un SDK compatible et exécuter sur un cluster Amazon EKS exécutant Kubernetes 1.13 ou version ultérieure. 

1. Appelez l'`MeterUsage`opération depuis la tâche ou le module une fois par heure pour chaque dimension d'utilisation. L'opération d'API accepte un enregistrement de mesure pour une combinaison unique de `Dimension``Resource`, et`Hour`. La ressource est soit une tâche Amazon Elastic Container Service (Amazon ECS), soit un 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.
   }
   ```
**Note**  
Il est possible de rencontrer des problèmes transitoires lors de la connexion au AWS Marketplace Metering Service. AWS Marketplace recommande vivement d'implémenter des tentatives d'une durée maximale de 30 minutes, avec des interruptions exponentielles, afin d'éviter les pannes de courte durée ou les problèmes de réseau.

1. Reconstruisez une nouvelle version de l'image de votre conteneur qui inclut l'`MeterUsage`appel, balisez le conteneur et envoyez-la vers n'importe quel registre Docker compatible avec Amazon ECS ou Amazon EKS, tel qu'Amazon Elastic Container Registry (Amazon ECR). Si vous utilisez Amazon ECR, assurez-vous que le compte qui lance la tâche Amazon ECS ou le pod Amazon EKS dispose d'autorisations sur le référentiel Amazon ECR. Sinon, l’opération échoue.

1. Créez un rôle [IAM](https://aws.amazon.com/iam/) qui autorise votre conteneur à appeler`MeterUsage`, comme défini dans l'exemple de code suivant. Vous devez fournir ce rôle Gestion des identités et des accès AWS (IAM) dans le paramètre [Task Role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) de la tâche Amazon ECS ou de la définition du pod Amazon EKS.

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

****  

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

------

1. Créez une tâche Amazon ECS ou une définition de module Amazon EKS qui fait référence au conteneur intégré AWS Marketplace et au rôle IAM que vous avez créé à l'étape 6. Si vous souhaitez voir la journalisation, activez-la AWS CloudTrail dans la définition de la tâche. 

1. Créez un cluster Amazon ECS ou Amazon EKS pour exécuter votre tâche ou votre pod. Pour plus d'informations sur la création d'un cluster Amazon ECS, consultez la section [Création d'un cluster](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html) dans le manuel *Amazon Elastic Container Service Developer Guide*. Pour plus d'informations sur la création d'un cluster Amazon EKS (à l'aide de Kubernetes version 1.1.3.x ou ultérieure), consultez Création [d'un](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html) cluster Amazon EKS.

1. Configurez le cluster Amazon ECS ou Amazon EKS et lancez la définition de tâche Amazon ECS ou le pod Amazon EKS que vous avez créé à l'étape 8, dans la région us-east-1 AWS . Ce n'est que pendant ce processus de test, avant la mise en ligne du produit, que vous devez utiliser cette région.

1. Lorsque vous obtenez une réponse valide `MeterUsage` pour chacune des dimensions publiées pour le produit, vous pouvez commencer à créer votre produit conteneur. Pour toute question, contactez l’équipe responsable des [opérations vendeur AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/). 

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

Les exemples de code suivants utilisent le service AWS SDK pour Java et AWS Marketplace Metering pour appeler l'`MeterUsage`opération.

L'exemple de code suivant appelle l'`MeterUsage`opération sans aucune`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);
    }
}
```

L'exemple de code suivant appelle l'`MeterUsage`opération avec`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();
    }
```

# Tarification contractuelle pour les produits en conteneur avec AWS License Manager
<a name="container-license-manager-integration"></a>

Pour les produits basés sur des conteneurs assortis d'une tarification contractuelle, vous pouvez associer AWS License Manager des licences à votre produit. AWS License Manager est un outil de gestion des licences qui permet à votre application de suivre et de mettre à jour les licences (également appelées droits) achetées par un client. Cette section fournit des informations sur la manière d'intégrer votre produit à AWS License Manager. Une fois l'intégration terminée, vous pouvez publier votre liste de produits sur AWS Marketplace.

Si vous intégrez License Manager à un produit AWS Marketplace for Containers Anywhere pour Amazon EKS Anywhere, Amazon ECS Anywhere, Amazon Elastic Compute Cloud (Amazon EC2) ou une infrastructure sur site, suivez les instructions fournies dans. [Intégrer et AWS Marketplace pour Containers Anywhere avec License Manager](container-anywhere-license-manager-integration.md)

Pour plus d'informations AWS License Manager, consultez le [guide de AWS License Manager l'utilisateur](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) et la [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)section du manuel de *référence des AWS CLI commandes*.

Pour plus d'informations sur l'intégration AWS License Manager aux produits en conteneur avec les prix contractuels, consultez le laboratoire d'[intégration au paiement initial](https://catalog.workshops.aws/mpseller/en-US/container/integrate-contract) de l'*atelier des AWS Marketplace vendeurs*.

**Topics**
+ [Tarification contractuelle pour les produits en conteneur](#container-contracts)
+ [Modèles de licence](#container-LM-license-models)
+ [AWS License Manager prérequis d'intégration](#container-LM-prereqs)
+ [Intégration d'un produit conteneur à License Manager](#container-integrate-with-LM)
+ [Opérations de l'API License Manager](#container-LM-API-calls)
+ [Renouvellements et mises à niveau des licences](#container-LM-lic-renew-upgrade)
+ [Intégrer et AWS Marketplace pour Containers Anywhere avec License Manager](container-anywhere-license-manager-integration.md)

## Tarification contractuelle pour les produits en conteneur
<a name="container-contracts"></a>

Pour les produits contenant des prix contractuels, facturez vos AWS Marketplace clients à l'avance ou selon le calendrier de paiement que vous définissez, en fonction du contrat conclu entre vous et votre client. À partir de ce moment, les clients sont autorisés à utiliser ces ressources. 

Pour définir vos prix, choisissez une ou plusieurs durées de contrat que vous proposez aux clients. Vous pouvez entrer des prix différents pour chaque durée de contrat. Vos options sont des durées de 1 mois, 12 mois, 24 mois et 36 mois. Pour les offres privées, vous pouvez définir une durée personnalisée en mois (jusqu'à 60 mois). 

Choisissez la catégorie qui décrit le mieux la tarification de votre produit. La catégorie de prix apparaît aux clients sur le AWS Marketplace site Web. Vous pouvez choisir entre la **bande passante** (GB/s, MB/s), **les données** (Go, Mo, To), les **hôtes**, les **demandes**, les **niveaux** ou **les utilisateurs**. Si aucune des catégories prédéfinies ne correspond à vos besoins, vous pouvez choisir la catégorie **Unités** plus générique. 

L'offre permet d'y ajouter jusqu'à 24 dimensions.


**Exemple : application de stockage de données**  

|   | Tarif pour 1 mois | Tarif pour 12 mois  | Tarif pour 24 mois  | Tarif P36 par mois  | 
| --- | --- | --- | --- | --- | 
|  Données non chiffrées (Go)  |  1,50 USD/Go  |  16,00 USD/Go  |  30,00 USD/Go  |  60,00 \$1/GB  | 
|  Données chiffrées (Go)  |  1,55 USD/Go  |  16,60 USD/Go  |  31,20 USD/Go  |  61,20 \$1/GO  | 


**Exemple : produit de surveillance de journaux**  

|   | Tarif pour 1 mois | Tarif pour 12 mois  | Tarif pour 24 mois | Tarif pour 36 mois | 
| --- | --- | --- | --- | --- | 
|  Basique (10 hôtes surveillés, 5 conteneurs surveillés)  |  100 USD  |  1 000 USD  | 2 000 USD  | 4 000 USD | 
|  Standard (20 hôtes surveillés, 10 conteneurs surveillés)  |  200 USD  |  2 000 USD  | 4 000 USD  | 8 000\$1 | 
|  Pro (40 hôtes surveillés, 20 conteneurs surveillés)  |  400 USD  |  4 000 USD  | 8 000\$1  | 16 000\$1 | 
|  Hôtes supplémentaires surveillés par heure  | 10\$1  | 100 USD  |  \$1200 | 400 USD | 
|  Conteneurs supplémentaires surveillés par heure  | 10\$1  | 100 USD  |  \$1200 | 400 USD | 

**Note**  
Les tarifs peuvent s'appliquer aux durées suivantes : 1 mois, 12 mois, 24 mois ou 36 mois. Vous pouvez choisir d'offrir une ou plusieurs de ces options pour votre produit. Les durées doivent être les mêmes dans chaque dimension.   

**Example**  
Par exemple, dans le cas où vous avez `ReadOnlyUsers` des `AdminUsers` dimensions, si vous proposez un prix annuel pour ReadOnlyUsers, vous devez également proposer un prix annuel pour`AdminUsers`.


### Renouvellements automatiques
<a name="ami-contracts-automatic-renewals"></a>

 Lorsque les clients achètent votre produit en AWS Marketplace utilisant des contrats de conteneur, ils peuvent accepter de renouveler automatiquement les termes du contrat. Les clients continuent de payer leurs droits tous les mois ou pendant 1, 2 ou 3 ans. 

Les clients peuvent modifier leurs paramètres de renouvellement à tout moment. Pour plus d'informations, consultez la section [Modification d'un contrat existant](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-container-contracts.html#modify-existing-contract) dans le *Guide de AWS Marketplace l'acheteur*.

## Modèles de licence
<a name="container-LM-license-models"></a>

AWS Marketplace l'intégration AWS License Manager prend en charge deux modèles de licence :
+ [Modèle de licence configurable](#container-LM-config-lic-model)
+ [Modèle de licence à plusieurs niveaux](#container-LM-tiered-lic-model)

### Modèle de licence configurable
<a name="container-LM-config-lic-model"></a>

Le modèle de licence configurable (également appelé modèle de licence quantifiable) donne droit à un acheteur à une quantité spécifique de ressources une fois qu'il a acheté une licence. 

Vous définissez une dimension tarifaire et un prix unitaire. L'acheteur peut ensuite choisir la quantité de ressources qu'il souhaite acheter.

**Example de la dimension tarifaire et du prix unitaire**  
Vous pouvez définir une dimension tarifaire (telle que la sauvegarde des données) et un prix unitaire (tel que 30 \$1/unité).  
L'acheteur peut choisir d'acheter 5, 10 ou 20 unités.   
Votre produit suit et mesure l'utilisation pour mesurer la quantité de ressources consommées.

Avec le modèle de configuration, les droits sont comptés de deux manières :
+ [Licences Drawdown](#container-floating-lic)
+ [Licences flottantes](#container-floating-lic) 

#### Licence Drawdown
<a name="container-drawndown-lic"></a>

 La licence est extraite du pool de licences autorisé lors de l'utilisation. Ce droit est définitivement retiré et ne peut pas être restitué au pool de licences.

**Example du traitement d'une quantité limitée de données**  
Un utilisateur a le droit de traiter 500 Go de données. Au fur et à mesure qu'ils continuent à traiter les données, la quantité est prélevée dans le pool de 500 Go jusqu'à ce que toutes les licences de 500 Go soient consommées.

Pour les licences de prélèvement, vous pouvez utiliser l'opération `CheckoutLicense` API pour vérifier les unités de licence (droits) consommées. 

**Example de sauvegarde vers Amazon S3 pour un certain nombre d'unités/an**  
Vous disposez d'un produit de stockage qui permet de sauvegarder des données sur Amazon Simple Storage Service pour un maximum de 1 024 unités pendant un an. Votre application peut être lancée à l'aide de plusieurs instances Amazon EC2. Votre application dispose d'un mécanisme permettant de suivre et d'agréger les données. Votre logiciel appelle l'opération `CheckoutLicense` API avec l'identifiant du produit à chaque sauvegarde ou à intervalles réguliers pour mettre à jour les quantités consommées.   
Dans cet exemple, votre logiciel appelle l'opération `CheckoutLicense` API pour extraire 10 unités de données. Lorsque la capacité totale atteint la limite de sauvegarde achetée par le client, l'appel d'API échoue.

**Demande**

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

**Réponse**

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

#### Licences flottantes
<a name="container-floating-lic"></a>

 La licence est renvoyée dans le pool contenant le nombre de licences autorisé après utilisation.

Pour les licences flottantes, l'application extrait les droits du pool de droits à l'aide de l'opération d'`CheckoutLicense`API lorsque la ressource est utilisée. La réponse de l'opération `CheckoutLicense` API inclut un jeton de consommation de licence qui est un identifiant unique pour le paiement. Le jeton de consommation de licence peut être utilisé pour effectuer des actions supplémentaires sur les droits retirés, comme les réintégrer dans la licence ou prolonger le paiement.

Pour réintégrer les droits dans le pool, utilisez l'opération `CheckInLicense` API lorsque la ressource n'est plus utilisée.

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

En cas d'échec de l'enregistrement des droits (en cas de panne de l'application), les droits sont automatiquement réintégrés dans le pool au bout de 60 minutes. Si la ressource est utilisée pendant plus de 60 minutes, il est recommandé de conserver les droits exclus du pool en utilisant l'opération `ExtendLicenseConsumption` API tant que la ressource est utilisée.

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

**Example du nombre d'utilisateurs par rapport à une limite supérieure fixe**  
Un utilisateur a droit à 500 utilisateurs simultanés sur l'application. Au fur et à mesure que les utilisateurs se connectent et se déconnectent, les utilisateurs sont tirés au sort et renvoyés dans le pool de 500 utilisateurs. Cependant, l'application ne peut pas attirer plus de 500 utilisateurs du pool car 500 utilisateurs simultanés constituent la limite supérieure fixe.

Pour les droits flottants, vous pouvez utiliser l'opération `CheckInLicense` API pour renvoyer les unités de licence au pool d'autorisations. 

**Example du nombre d'utilisateurs simultanés pendant un an**  
Le prix de votre produit est basé sur le nombre d'utilisateurs simultanés. Le client achète une licence pour 10 utilisateurs pendant un an. Le client lance le logiciel en fournissant des autorisations Gestion des identités et des accès AWS (IAM). Lorsqu'un utilisateur se connecte, votre application appelle l'opération `CheckoutLicense` API pour réduire la quantité de 1. Lorsque l'utilisateur se déconnecte, l'application renvoie cette licence au pool en appelant l'opération `CheckInLicense` API. Si vous n'appelez pas`CheckInLicense`, l'unité de licence sera automatiquement enregistrée au bout d'une heure.

**Note**  
Dans la demande suivante, il ne s'`key-fingerprint`agit pas d'une valeur d'espace réservé mais de la valeur réelle de l'empreinte digitale avec laquelle toutes les licences seront publiées.

**Demande**

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

**Réponse**

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

### Modèle de licence à plusieurs niveaux
<a name="container-LM-tiered-lic-model"></a>

Le modèle de licence hiérarchisée permet à un acheteur d'accéder à un niveau spécifique, ou niveau, de fonctionnalités de l'application une fois qu'il a acheté une licence. 

Vous créez des niveaux pour votre produit, tels que Basic, Intermediate et Premium. L'acheteur sélectionne ensuite l'un des niveaux prédéfinis.

L'application n'a pas besoin de suivre ou de mesurer l'utilisation de l'application.

Avec le modèle de licence à plusieurs niveaux, les droits ne sont pas pris en compte mais indiquent un niveau de service acheté par le client. 

Si vous souhaitez proposer des fonctionnalités groupées ensemble, les niveaux sont préférables. 

**Example des niveaux de base, intermédiaire et premium**  
Un client peut signer un contrat pour l'un des trois niveaux possibles du logiciel : Basic, Intermediate ou Premium. Chacun de ces niveaux a sa propre tarification. Votre logiciel peut identifier le niveau auquel le client s'est inscrit en invoquant l'opération `CheckoutLicense` API et en spécifiant tous les niveaux possibles dans la demande.   
La réponse à la demande contient le droit correspondant au niveau que le client a acheté. Sur la base de ces informations, le logiciel peut fournir une expérience client appropriée.

#### Demande
<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"
```

#### Réponse
<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 prérequis d'intégration
<a name="container-LM-prereqs"></a>

Avant de publier le produit, vous devez effectuer les opérations suivantes :

1. Créez un nouveau produit conteneur dans Portail de gestion AWS Marketplace le et notez son code produit.

   Pour de plus amples informations, veuillez consulter [Vue d'ensemble : Création d'un produit en conteneur](container-product-getting-started.md#create-container-product).

1. Utilisez un rôle IAM pour la tâche ou le module exécutant votre application avec les autorisations IAM nécessaires pour appeler les opérations `CheckoutLicense``ExtendLicenseConsumption`, et `CheckInLicense` API.

   Les autorisations IAM requises sont détaillées dans la politique IAM suivante.

------
#### [ 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. Effectuez un appel de test pour le fonctionnement de l'`RegisterUsage`API avec un enregistrement de toutes les dimensions de tarification que vous avez définies.

## Intégration d'un produit conteneur à License Manager
<a name="container-integrate-with-LM"></a>

**Pour intégrer votre produit basé sur des conteneurs à License Manager**

1. Définissez les autorisations IAM pour appeler License Manager. Pour de plus amples informations, veuillez consulter [AWS License Manager prérequis d'intégration](#container-LM-prereqs).

1. Téléchargez le AWS SDK.
**Note**  
Ne configurez pas les AWS informations d'identification dans votre logiciel. AWS les informations d'identification de l'acheteur sont automatiquement obtenues lors de l'exécution lorsque votre conteneur est exécuté dans une instance Amazon EC2, une tâche Amazon ECS ou un pod Amazon EKS.

1. Ajoutez des contrôles de licence à votre produit.

   Votre produit peut appeler l'opération `CheckoutLicense` API partout où la vérification de licence doit être effectuée. Pour vérifier la licence, votre produit doit connaître :

   1. L'émetteur de confiance de la licence ()AWS Marketplace

   1. Le SKU du produit (ID du produit) de l'application

   1. Le droit de vérifier la présence de cette application

   Les appels d'API varient en fonction du type de licence tarifaire que vous configurez.

1. Publiez votre liste de produits sur AWS Marketplace.

## Opérations de l'API License Manager
<a name="container-LM-API-calls"></a>

Pour gérer les licences stockées dans le compte License Manager du client, votre logiciel peut utiliser les opérations d'API suivantes :
+ `GetLicense`— Une API que le logiciel peut interroger. Il récupère le statut d'une licence achetée (c'est-à-dire expirée ou expirant bientôt) et envoie une notification de statut au client.
+ `CheckoutLicense`— Découvre les licences que l'utilisateur a achetées. Vous pouvez également utiliser l'opération `CheckoutLicense` API pour mettre à jour la quantité de licences lorsque l'utilisateur a consommé une certaine quantité de licences. Avec`CheckoutLicense`, vous pouvez continuer à vérifier les quantités de licences utilisées par le client. Lorsque le client a épuisé toutes les licences, cet appel renvoie un message d'erreur. Pour plus d'informations sur la cadence de course suggérée`CheckoutLicense`, consultez[Renouvellements et mises à niveau des licences](#container-LM-lic-renew-upgrade).
+ `ExtendLicenseConsumption`— Dans le cas de dimensions flottantes, lorsque le logiciel extrait une licence, celle-ci revient automatiquement dans le pool après 60 minutes. Si vous souhaitez prolonger la durée pendant laquelle la licence reste extraite, utilisez l'opération `ExtendLicenseConsumption` API pour prolonger la licence de 60 minutes supplémentaires.
+ `CheckInLicense`— Dans le cas de dimensions flottantes, lorsque vous souhaitez renvoyer la licence au pool de droits, utilisez l'opération `CheckInLicense` API.
+ `ListReceivedLicenses`API — Répertorie les licences achetées par l'acheteur.

## Renouvellements et mises à niveau des licences
<a name="container-LM-lic-renew-upgrade"></a>

Les clients peuvent renouveler ou mettre à niveau leurs licences sur le Portail de gestion AWS Marketplace. Une fois qu'ils ont effectué un achat supplémentaire, ils AWS Marketplace génèrent une nouvelle version de la licence qui reflète les nouveaux droits. Votre logiciel lit les nouveaux droits en utilisant les mêmes opérations d'API. Vous n'avez rien à faire de différent en termes d'intégration du License Manager pour gérer les renouvellements et les mises à niveau.

En raison des renouvellements de licence, des mises à niveau, des annulations, etc., nous recommandons que votre produit appelle l'`CheckoutLicense`API à un rythme régulier pendant son utilisation. En utilisant le fonctionnement de l'`CheckoutLicense`API à une cadence régulière, le produit peut détecter les modifications des droits, telles que les mises à niveau et les expirations.

Nous vous recommandons d'effectuer l'appel `CheckoutLicense` d'API toutes les 15 minutes. 

# Intégrer et AWS Marketplace pour Containers Anywhere avec License Manager
<a name="container-anywhere-license-manager-integration"></a>

En tant que AWS Marketplace vendeur, vous pouvez intégrer AWS License Manager un produit AWS Marketplace for Containers Anywhere pour Amazon EKS Anywhere, Amazon ECS Anywhere, Amazon EC2 ou une infrastructure sur site. Les sections suivantes fournissent des instructions pour cette intégration.

Pour obtenir des informations générales sur l'intégration de License Manager avec AWS Marketplace, notamment, les modèles de licence disponibles, consultez[Tarification contractuelle pour les produits en conteneur avec AWS License Manager](container-license-manager-integration.md). Pour plus d'informations AWS License Manager, consultez le [guide de AWS License Manager l'utilisateur](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) et la [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)section du manuel de *référence des AWS CLI commandes*.

**Topics**
+ [Intégration d'un produit AWS Marketplace for Containers Anywhere à License Manager](#containers-anywhere-integrate-with-LM)
+ [Tester l'intégration de License Manager en local](#container-testing-LM-integration-locally)
+ [Test de l'intégration du License Manager sur Amazon EKS](#container-testing-LM-integration-EKS)
+ [Droits de licence flottants avec License Manager](#container-LM-floating-license)
+ [Bonnes pratiques d'intégration avec License Manager pour les déploiements sur site](#container-LM-best-practices-on-prem)
+ [`LicenseManagerCredentialsProvider`- Implémentation de Java](#container-license-manager-cred-provider-java)
+ [`LicenseManagerCredentialsProvider`- `Golang` mise en œuvre](#container-license-manager-cred-provider-golang)

## Intégration d'un produit AWS Marketplace for Containers Anywhere à License Manager
<a name="containers-anywhere-integrate-with-LM"></a>

Suivez les instructions ci-dessous pour intégrer votre produit AWS Marketplace for Containers Anywhere à AWS License Manager.

**Pour intégrer votre produit AWS Marketplace for Containers Anywhere à License Manager**

1. Ouvrez un navigateur Web et connectez-vous au [Portail de gestion AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Créez un identifiant de produit pour votre produit en conteneur en effectuant les étapes suivantes. Vous utiliserez cet identifiant dans l'image de votre conteneur pour les vérifications de licence lors d'une étape ultérieure.

   1. Dans la barre de menus, développez **Assets (Ressources)**, puis choisissez **Container (Conteneur)**.

   1. **Entrez un nom destiné aux clients pour votre produit, puis choisissez Créer.** Vous pourrez modifier ce nom ultérieurement.

   1. Prenez note de l'**identifiant du produit**. Vous l'utiliserez lorsque vous créerez ou mettrez à jour les informations de tarification des produits.
**Astuce**  
Si vous perdez votre identifiant de produit, vous pouvez le retrouver dans le en Portail de gestion AWS Marketplace choisissant **Conteneur** dans le menu **Ressources**. La page **Conteneurs** affiche la liste de vos produits avec le produit associé IDs.

1. Téléchargez le dernier AWS SDK public, puis installez-le dans votre application conteneur. Vous trouverez les instructions d'installation de votre AWS SDK préféré sur [Tools to Build on AWS](https://aws.amazon.com/tools/).
**Note**  
Pour appeler les opérations de l'API License Manager depuis Amazon EKS Anywhere ou un cluster Kubernetes non fourni par AWS, vous devez utiliser un SDK compatible. AWS Pour consulter la liste des SDK pris en charge AWS SDKs, consultez la section [Utilisation d'un AWS SDK pris en charge](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html).

1. Créez un AWS License Manager client avec un fournisseur d'informations d'identification personnalisé afin qu'il puisse fournir des informations d'identification à l'application conteneur déployée sur AWS site ou sur site. Pour obtenir le code source complet d'un fournisseur d'informations d'identification personnalisé`LicenseCredentialProvider`, consultez les sections suivantes :
   + [`LicenseManagerCredentialsProvider`- Implémentation de Java](#container-license-manager-cred-provider-java)
   + [`LicenseManagerCredentialsProvider`- `Golang` mise en œuvre](#container-license-manager-cred-provider-golang)

    `LicenseCredentialsProvider`étend la chaîne de fournisseurs d'informations d'identification par défaut du AWS SDK pour une utilisation sur site en ajoutant. `LicenseManagerTokenCredentialsProvider` Cela fournit des informations d'identification en utilisant les jetons d'identité émis par License Manager OIDC dans les environnements sur site. Vous devez inclure le code source de `LicenseCredentialsProvider` dans le chemin de classe de votre application.
**Note**  
L'extension de `DefaultCredentialsProvider` permet à la même application conteneur d'obtenir des informations d'identification lors de son exécution sur AWS et lors de son exécution dans un environnement sur site. Si l'application conteneur utilise déjà une chaîne de fournisseurs d'informations d'identification personnalisée au lieu de la chaîne par défaut, elle peut également être étendue en l'ajoutant `LicenseManagerTokenCredentialsProvider` à la chaîne personnalisée.

   L'extrait de code suivant est un exemple de création d'un AWS License Manager client à l'aide de Java.

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

1. Appelez l'opération `CheckoutLicense` API en utilisant la `aws license-manager checkout-license` commande de chaque image de conteneur payante de votre offre de produits. Cela permet de vérifier que l'acheteur est autorisé à utiliser une licence pour votre application. Si l'acheteur a droit à la demande, elle obtient `CheckoutLicense` gain de cause et renvoie les droits demandés et leur valeur. Si l'acheteur n'a pas droit à l'application, `CheckoutLicense` lance une exception.

   Les paramètres suivants sont requis lors de l'appel de l'opération `CheckoutLicense` API :
   + `CheckoutType`— Les valeurs valides sont `PROVISIONAL` ou `PERPETUAL` :
     + `PERPETUAL`À utiliser lorsque le nombre de droits retirés sera épuisé du pool.

       Exemple : l'acheteur a le droit de traiter 500 Go de données. Au fur et à mesure qu'ils continuent à traiter les données, la quantité est prélevée et épuisée du pool de 500 Go.
     + `PROVISIONAL`À utiliser pour les droits de licence flottants où les droits sont retirés du pool et renvoyés après utilisation.

       Exemple : l'utilisateur a droit à 500 utilisateurs simultanés sur l'application. Lorsque les utilisateurs se connectent ou se déconnectent, ils sont tirés au sort ou renvoyés dans le pool de 500 utilisateurs. Pour en savoir plus sur les droits de licence flottants, consultez. [Droits de licence flottants avec License Manager](#container-LM-floating-license)
   + `ClientToken`— Un identifiant unique distinguant majuscules et minuscules. Nous recommandons d'utiliser un UUID aléatoire pour chaque demande unique.
   + `Entitlements`— Une liste des droits à vérifier.
     + Pour les droits relatifs aux fonctionnalités, indiquez les `Unit` propriétés `Name` et comme suit.

       ```
       {
         "Name": "<Entitlement_Name>",
         "Unit": "None"
       }
       ```
     + Pour les droits comptés, indiquez les `Count` propriétés `Name``Unit`, et comme suit.

       ```
       {
         "Name": "<Entitlement_Name>",
         "Unit": "<Entitlement_Unit>",
         "Value": <Desired_Count>
       }
       ```
   + `KeyFingerprint`— L'empreinte digitale clé des licences délivrées par AWS Marketplace is`aws:294406891311:AWS/Marketplace:issuer-fingerprint`. L'utilisation de cette empreinte clé garantit que la licence est délivrée par une entité peu fiable AWS Marketplace et non par une entité peu fiable.
   + `ProductSKU`— L'identifiant du produit généré Portail de gestion AWS Marketplace lors des étapes précédentes.

   L'extrait suivant est un exemple d'appel utilisant l'opération d'`CheckoutLicense`API à l'aide du. 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"
   ```
**Note**  
Pour vérifier les licences, les applications de conteneur nécessitent un accès réseau sortant pour utiliser le License Manager. Les applications déployées sur site peuvent présenter un accès réseau sortant peu fiable ou lent. Ces applications doivent inclure des tentatives adéquates lors de l'appel de License Manager. Pour de plus amples informations, veuillez consulter [Bonnes pratiques d'intégration avec License Manager pour les déploiements sur site](#container-LM-best-practices-on-prem).

1. Appelez l'`CheckoutLicense`API à un rythme régulier pour identifier toute modification apportée aux licences des clients en raison de renouvellements, de mises à niveau ou d'annulations effectués le. AWS Marketplace La cadence dépend de l'application. Nous vous recommandons de vérifier les licences une fois par jour pour prendre en compte les modifications automatiquement sans aucune intervention de l'acheteur.

   Une application déployée sur site peut disposer d'un accès réseau sortant peu fiable pour vérifier les licences à une cadence régulière. Dans de tels cas, l'application doit utiliser des licences mises en cache pour une résilience suffisante. Pour de plus amples informations, veuillez consulter [Bonnes pratiques d'intégration avec License Manager pour les déploiements sur site](#container-LM-best-practices-on-prem).

1. Après avoir intégré l'`CheckoutLicense`appel à votre application de conteneur, créez une nouvelle version de votre image de conteneur Docker avec les modifications.

1. Mettez à jour le graphique Helm de votre application pour accepter un secret Kubernetes comme entrée facultative contenant la configuration permettant d'accéder aux licences à l'aide de License Manager. APIs Le secret de configuration contiendra un jeton d'identité émis par License Manager et un Gestion des identités et des accès AWS rôle qui sera utilisé par le fournisseur d'informations d'identification personnalisé décrit précédemment pour obtenir les AWS informations d'identification permettant d'appeler License Manager APIs lorsque l'application conteneur est déployée sur site. Ajoutez également le Région AWS en tant qu'entrée avec une valeur par défaut de`us-east-1`.

   Les acheteurs qui déploient l'application de conteneur sur site peuvent créer le secret de Kubernetes grâce à AWS Marketplace l'expérience d'achat des produits en conteneur. Fournissez le nom secret de Kubernetes en entrée de la commande. `helm install` Le secret de configuration est configuré au format suivant.

   ```
   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> // Gestion des identités et des accès AWS role to assume with license token
   ```

1. Mettez à jour le modèle de déploiement de l'application dans le graphique Helm pour les images de conteneur intégrées AWS License Manager afin d'inclure les éléments suivants :
   + Compte de service pour le pod : le compte de service est requis pour les déploiements Helm sur Amazon EKS. Il est utilisé pour obtenir l'autorisation d'appeler les opérations de l'API License Manager en configurant des rôles IAM pour le compte de service sur l'image du conteneur. Pour plus d'informations sur les rôles IAM pour les comptes de service, consultez la section [Rôles IAM pour les comptes de service](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html).
   + Accès aux licences pour les déploiements sur site : le secret de configuration de licence est requis pour fournir les informations d'identification et les autorisations appropriées pour appeler les opérations de l'API License Manager pour les déploiements Helm dans des environnements sur site. Les acheteurs généreront et fourniront le secret de licence à Helm à partir de l'expérience de AWS Marketplace l'acheteur.

   L'extrait de code suivant est un exemple de spécification de déploiement avec le compte de service, la configuration de la licence et le secret d'extraction de l'image.

   ```
   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 }}
   ```
**Note**  
Le secret de configuration de licence est facultatif. Les acheteurs n'utilisent cette valeur que pour les déploiements sur site. Pour les AWS déploiements, la spécification de déploiement doit inclure un compte de service pour les images intégrées du License Manager.

1. Testez l'intégration du License Manager localement et sur Amazon EKS en suivant les étapes décrites dans les sections suivantes :

   1. [Tester l'intégration de License Manager en local](#container-testing-LM-integration-locally)

   1. [Test de l'intégration du License Manager sur Amazon EKS](#container-testing-LM-integration-EKS)

1. Après avoir vérifié avec succès l'intégration de License Manager sur site AWS et sur site, vous pouvez créer votre liste de produits conteneurs en suivant les étapes décrites dans[Vue d'ensemble : Création d'un produit en conteneur](container-product-getting-started.md#create-container-product).

## Tester l'intégration de License Manager en local
<a name="container-testing-LM-integration-locally"></a>

Vous pouvez utiliser minikube ou toute autre configuration pour tester l'intégration de License Manager sur n'importe quel cluster Kubernetes en local. Assurez-vous que le cluster Kubernetes dispose d'un accès Internet sortant pour appeler les opérations de l'API License Manager.

**Pour tester une intégration de License Manager en local**

1. Créez une licence de test dans un compte vendeur de test avec les droits souhaités. Pour configurer une licence de test, reportez-vous [CreateLicense](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_CreateLicense.html)à la *référence de l'AWS License Manager API*. Vous pouvez également utiliser le script suivant pour créer une licence de test, puis octroyer une licence à un compte d'acheteur de test pour qu'il utilise la licence. Le script suivant utilise les informations d'identification du compte vendeur de test.

   ```
   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. Créez un secret Kubernetes avec le jeton de licence et le rôle IAM en utilisant le format de secret défini précédemment. Utilisez l'opération d'`CreateToken`API License Manager pour générer un jeton de licence. Utilisez ensuite l'opération d'`CreateRole`API IAM pour créer un rôle IAM doté d'autorisations et d'une politique de confiance. Consultez l'exemple dans le script suivant. Le script suivant utilise les informations d'identification du compte acheteur de test.

   ```
   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. Configurez n'importe quel cluster Kubernetes hébergé à l'extérieur. AWS Utilisez-le pour vérifier que les applications conteneurs peuvent se connecter à l' AWS License Manager API à partir d'environnements autres que AWS et que le fournisseur d'informations d'identification personnalisé est bien intégré à l'application.

1. Déployez le jeton de licence et le rôle IAM générés précédemment dans le cluster Kubernetes local.

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

1. Déployez votre application via Helm avec le nom secret en entrée et vérifiez que l'application peut appeler les opérations de l'API License Manager pour vérifier les droits d'accès. Pour les modifications des spécifications de Helm et de déploiement, reportez-vous à l'étape 9 de[Intégration d'un produit AWS Marketplace for Containers Anywhere à License Manager](#containers-anywhere-integrate-with-LM).

## Test de l'intégration du License Manager sur Amazon EKS
<a name="container-testing-LM-integration-EKS"></a>

Vous pouvez également tester l'intégration de License Manager sur Amazon EKS. Testez pour vous assurer que l'application peut appeler les opérations de l'API License Manager sans le secret de configuration de la licence. Assurez-vous également que le compte de service peut être utilisé pour configurer les rôles IAM pour les comptes de service (IRSA) et fournir les informations d'identification pertinentes à l'application.

**Pour tester une intégration de License Manager sur Amazon EKS**

1. Créez une licence de test dans un compte vendeur de test avec les droits souhaités. Consultez la [référence de CreateLicense l'API](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_CreateLicense.html) pour configurer votre licence de test ou utilisez le script suivant pour en créer une et octroyer une licence à un compte d'acheteur de test pour qu'il utilise la licence. Le script suivant utilise les informations d'identification du compte vendeur de test.

   ```
   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. Créez un cluster Amazon EKS de test avec les configurations souhaitées ou exécutez les commandes suivantes pour utiliser une configuration par défaut.

   ```
   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. Créez un compte de service pour un cluster existant et associez-le à un rôle IAM. La commande suivante crée un rôle IAM avec le`AWSLicenseManagerConsumptionPolicy`. La commande l'attache ensuite au compte de `test_sa` service du cluster Amazon EKS où les images intégrées du License Manager doivent être déployées. Par conséquent, le compte de service peut obtenir les informations d'identification appropriées pour appeler les opérations de l'API License Manager.

   ```
   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. Déployez l'application via Helm dans le compte de service auquel le rôle IAM est associé depuis la commande précédente. Vérifiez que l'application peut appeler les opérations de l'API License Manager pour vérifier les droits d'accès.

## Droits de licence flottants avec License Manager
<a name="container-LM-floating-license"></a>

Dans le cas des licences flottantes, lorsque les utilisateurs se connectent à l'application, une licence est extraite du pool de licences disponibles. Lorsque les utilisateurs se déconnectent, les licences sont ajoutées à nouveau au pool de licences disponibles.

Pour les licences flottantes, l'application utilise l'opération `CheckoutLicense` API pour extraire les droits du pool de droits lorsque la ressource est utilisée. La réponse de l'opération `CheckoutLicense` API inclut un jeton de consommation de licence qui est un identifiant unique pour le paiement. Le jeton de consommation de licences peut effectuer des actions supplémentaires sur les droits retirés, par exemple les réintégrer dans le pool de licences ou prolonger le retrait.

Lorsque la ressource n'est plus utilisée, l'application utilise l'opération `CheckInLicense` API pour réintégrer les droits dans le pool.

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

Si le réenregistrement d'une licence dans le pool échoue, par exemple si l'application se bloque pendant l'opération, les droits sont automatiquement réintégrés dans le pool au bout de 60 minutes. C'est pourquoi, si la ressource est utilisée pendant plus de 60 minutes, il est recommandé de ne pas inclure les droits dans le pool. Pour ce faire, utilisez l'opération `ExtendLicenseConsumption` API tant que la ressource est utilisée.

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

## Bonnes pratiques d'intégration avec License Manager pour les déploiements sur site
<a name="container-LM-best-practices-on-prem"></a>

Les déploiements d'applications de conteneur dans un environnement sur site peuvent rencontrer un accès réseau sortant peu fiable. Utilisez les meilleures pratiques suivantes pour renforcer la résilience afin d'éviter toute interruption de service pour les acheteurs en raison de problèmes potentiels liés à une mauvaise connectivité Internet :
+ **Réessai adéquat** : des problèmes réseau transitoires peuvent empêcher votre application de se connecter à. AWS License Manager Implémentez de nouvelles tentatives pendant 30 minutes au maximum, avec des interruptions exponentielles. Cela permet d'éviter des pannes de courte durée ou des problèmes de réseau.
+ **Évitez les limites strictes** : les applications déployées dans des clusters connectés peuvent vérifier régulièrement les licences afin d'identifier les modifications dues aux mises à niveau ou aux renouvellements. En cas d'accès sortant peu fiable, l'application risque de ne pas être en mesure d'identifier ces modifications. Dans la mesure du possible, l'application doit éviter d'interrompre le service aux acheteurs en raison de l'impossibilité de vérifier les licences via le License Manager. Les applications peuvent recourir à un essai gratuit ou à une expérience open source lorsque la licence expire et qu'elles ne peuvent pas vérifier si une licence est valide.
+ **Avertir les clients** : lors de l'utilisation d'une licence mise en cache, les modifications apportées à la licence (y compris le renouvellement ou les mises à niveau) ne sont pas automatiquement répercutées sur la charge de travail en cours. Informez vos clients (qu'ils doivent autoriser à nouveau temporairement l'accès sortant à l'application) afin que l'application puisse mettre à jour sa licence mise en cache. Par exemple, informez les clients par le biais de l'application elle-même ou de sa documentation. De même, lorsque vous revenez à un ensemble de fonctionnalités inférieur, informez les clients que leurs droits sont épuisés ou que la licence a expiré. Ils peuvent ensuite choisir de procéder à une mise à niveau ou à un renouvellement.

## `LicenseManagerCredentialsProvider`- Implémentation de Java
<a name="container-license-manager-cred-provider-java"></a>

`LicenseCredentialsProvider`étend la chaîne de fournisseurs d'informations d'identification par défaut du AWS SDK pour une utilisation sur site en ajoutant. `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`fournit des informations d'identification en utilisant les jetons d'identité émis par License Manager OIDC dans les environnements sur site. Vous devez inclure le code source de `LicenseCredentialsProvider` dans le chemin de classe de votre application.

```
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` mise en œuvre
<a name="container-license-manager-cred-provider-golang"></a>

**`LicenseCredentialsProvider`**

`LicenseCredentialsProvider`étend la chaîne de fournisseurs d'informations d'identification par défaut du AWS SDK pour une utilisation sur site en ajoutant. `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`fournit des informations d'identification en utilisant les jetons d'identité émis par License Manager OIDC dans les environnements sur site. Vous devez inclure le code source de `LicenseCredentialsProvider` dans le chemin de classe de votre application.

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

# Notifications Amazon SNS pour les produits en conteneur
<a name="container-notification"></a>

Pour recevoir des notifications, vous pouvez vous abonner aux rubriques Amazon Simple Notification Service (Amazon SNS) qui vous ont été fournies lors de AWS Marketplace la création du produit. Les rubriques fournissent des notifications concernant les modifications apportées aux abonnements des clients pour vos produits. Par exemple, vous pouvez utiliser ces notifications pour savoir quand les clients acceptent une offre privée. 

**Note**  
Au cours du processus de création du produit, une rubrique Amazon SNS est créée pour votre produit. Pour vous abonner aux notifications, vous avez besoin du nom de ressource Amazon (ARN) de la rubrique Amazon SNS (par exemple,`arn:aws:sns:us-east-1:123456789012:aws-mp-subscription-notification-PRODUCTCODE`). L'ARN n'est pas disponible sur le portail des vendeurs pour les produits de serveur. Contactez l'[équipe AWS Marketplace des opérations](https://aws.amazon.com/marketplace/management/contact-us) pour demander l'ARN.

La rubrique Amazon SNS suivante est disponible pour les produits en conteneur :
+ [Rubrique Amazon SNS : `aws-mp-subscription-notification`](#container-sns-subscription-message-body)— Cette rubrique vous informe lorsqu'un acheteur s'abonne ou se désabonne à un produit. Ceci est disponible pour les modèles de tarification horaire, y compris les modèles de tarification horaire et horaire à long terme.

## Rubrique Amazon SNS : `aws-mp-subscription-notification`
<a name="container-sns-subscription-message-body"></a>

Le format de chaque message de la `aws-mp-subscription-notification` rubrique est le suivant.

```
{
    "action": "<action-name>",
    "customer-identifier": " X01EXAMPLEX",
    "product-code": "n0123EXAMPLEXXXXXXXXXXXX",
    "offer-identifier": "offer-abcexample123"
}
```

Elles *<action-name>* varient en fonction de la notification. Les actions possibles sont les suivantes :
+ `subscribe-success`
+ `subscribe-fail`
+ `unsubscribe-pending`
+ `unsubscribe-success`

Le `offer-identifier` n'est inclus dans la notification que lorsque l'action est `subscribe-success` ou`subscribe-fail`. Il n'est pas inclus dans les notifications lorsque l'action est `unsubscribe-pending` ou`unsubscribe-success`. Pour les offres créées avant janvier 2024, cet identifiant est inclus dans la notification uniquement pour les offres privées. Pour les offres créées en janvier 2024 et ultérieurement, cet identifiant est inclus dans les notifications de toutes les offres, y compris les offres privées et les offres publiques.

Pour plus d'informations sur les types d'offres, consultez la réponse de l'[DescribeEntity API](https://docs.aws.amazon.com//marketplace/latest/APIReference/work-with-private-offers.html#describe-entity) ou la visibilité de l'offre d'un accord dans le tableau de [bord des renouvellements des accords](https://docs.aws.amazon.com//marketplace/latest/userguide/agreements-renewals-dashboard.html).

**Note**  
 Pour [DescribeEntity l'API](https://docs.aws.amazon.com//marketplace/latest/APIReference/work-with-private-offers.html#describe-entity), si vous trouvez une facette de ciblage Compte AWS dans le compte de la règle de ciblage pour cette offre, il s'agit d'une offre privée. S'il n'existe pas Compte AWS de règle de ciblage intégrée au compte pour cette offre, il s'agit d'une offre publique.

## Abonnement d'une file d'attente Amazon SQS à la rubrique Amazon SNS
<a name="subscribing-sqs-queue-to-sns-topic"></a>

Nous vous recommandons de souscrire une file d'attente Amazon SQS aux rubriques SNS fournies. *Pour obtenir des instructions détaillées sur la création d'une file d'attente SQS et l'abonnement de la file d'attente à une rubrique Amazon [SQS, consultez la section Abonnement d'une file d'attente Amazon SQS à une rubrique Amazon SNS dans](https://docs.aws.amazon.com/sns/latest/dg/subscribe-sqs-queue-to-sns-topic.html) le manuel du développeur Amazon Simple Notification Service.*

**Note**  
Vous ne pouvez vous abonner à des rubriques AWS Marketplace SNS qu'à partir du Compte AWS site utilisé pour vendre les produits. Vous pouvez toutefois transférer les messages vers un autre compte. Pour plus d'informations, consultez la section [Envoyer des messages Amazon SNS à une file d'attente Amazon SQS d'un autre compte dans](https://docs.aws.amazon.com/sns/latest/dg/sns-send-message-to-sqs-cross-account.html) le manuel *Amazon Simple Notification* Service Developer Guide.

### Interrogation de la file d'attente SQS pour accéder aux notifications
<a name="polling-the-sqs-for-notifications"></a>

Une fois que vous avez inscrit votre file d'attente SQS à une rubrique SNS, les messages sont stockés dans SQS. Vous devez définir un service qui interroge en permanence la file d'attente, recherche les messages et les traite en conséquence.