

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Productos basados en contenedores en AWS Marketplace
<a name="container-based-products"></a>

**importante**  
El 1 de marzo de 2026, AWS Marketplace suspenderá en Lanzamiento rápido las implementaciones para gráfico de Helm en Amazon EKS. Las implementaciones existentes seguirán ejecutándose con normalidad. Aún puede realizar la implementación mediante comandos de Helm estándar o imágenes de contenedor en Amazon ECS.

AWS Marketplace admite productos de software que utilizan contenedores de Docker. Los productos de contenedor constan de opciones de entrega, que son un conjunto de imágenes de contenedor y plantillas de implementación que van juntas. Envía al menos una opción de entrega para su producto, con un máximo de cuatro. Para cada opción de entrega, proporciona un conjunto de imágenes de contenedor, instrucciones de uso y enlaces a plantillas de implementación para que los clientes inicien esa opción de entrega. Este tema proporciona información sobre los productos basados en contenedores en AWS Marketplace.

Los compradores de AWS Marketplace ven las opciones de envío disponibles en las páginas de detalles del producto publicadas que están a su disposición. Tras suscribirse al producto y elegir la opción de envío que prefieran, los compradores ven la información y las instrucciones para lanzar y utilizar el producto. Para ver las opciones de entrega de imágenes de contenedores, los compradores consultan los enlaces a las plantillas de implementación y las URL de imágenes de contenedores disponibles. También reciben instrucciones sobre cómo extraer las imágenes individuales de los contenedores. En cuanto a las opciones de entrega del gráfico de Helm, los compradores verán instrucciones paso a paso sobre el lanzamiento con Helm.

Para ver un resumen de la experiencia de compra, consulte este vídeo: [Implementación de contenedores de AWS Marketplace en clústeres de Amazon ECS](https://www.youtube.com/watch?v=XaiUAiQQJtk) (3:34).

Puede encontrar aplicaciones de Kubernetes de terceros, suscribirse a ellas e implementarlas desdeAWS Marketplace en cualquier clúster de Kubernetes y en cualquier entorno. Puede implementar aplicaciones de Kubernetes de terceros en Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS), AWS Fargate, y en las instalaciones mediante Amazon EKS Anywhere (EKS Anywhere). También puede implementarlos en clústeres de Kubernetes autoadministrables en las instalaciones o en Amazon Elastic Compute Cloud (Amazon EC2).

Puede ejecutar productos de contenedor Free y Bring Your Own License model (BYOL) en cualquier tiempo de ejecución compatible con Docker.

**Topics**
+ [Obtener ayuda](#container-help)
+ [Introducción a los productos de contenedor](container-product-getting-started.md)
+ [Requisitos de productos basados en contenedores para AWS Marketplace](container-product-policies.md)
+ [Precios de productos de contenedores para AWS Marketplace](pricing-container-products.md)
+ [Integraciones de facturación, medición y licencias de productos de contenedor](container-products-billing-integration.md)
+ [Notificaciones de Amazon SNS para productos de contenedores](container-notification.md)

## Obtener ayuda
<a name="container-help"></a>

Si necesita ayuda con sus productos de contenedores, póngase en contacto con su socio de desarrollo empresarial AWS Marketplace o con el equipo [Operaciones del vendedor de AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/).

# Introducción a los productos de contenedor
<a name="container-product-getting-started"></a>

Como AWS Marketplace vendedor, puedes crear productos de software basados en contenedores. Los productos de contenedor constan de opciones de entrega, que son un conjunto de imágenes de contenedor y plantillas de implementación que van juntas. En el siguiente tema se describe cómo comenzar con los productos de contenedor.
+ [Ciclo de vida del producto](#container-product-lifecycle)
+ [Requisitos previos](#container-prereq)
+  [Paso 1: creación del ID de producto y el código de producto para el producto de contenedor](#create-initial-container-product) 
+ [Paso 2: creación de una publicación inicial](#container-initial-listing)
+ [Paso 3: agregación de una versión inicial del producto](#container-add-version-gs)
+ [Paso 4: (solo para productos de pago) integración de la medición o los precios por contrato](#getting-started-integrate-metering)
+ [Pasos siguientes](#getting-started-integrate-metering)
+ [Los contenedores escanean los productos para detectar problemas de seguridad](#container-security)

## Ciclo de vida del producto
<a name="container-product-lifecycle"></a>

Cuando creas un producto en AWS Marketplace, se publica inicialmente con una visibilidad limitada para que las cuentas de la lista de usuarios permitidos puedan verlo, incluida la cuenta que creó el producto. Cuando estés listo, puedes publicarlo en el AWS Marketplace catálogo para que los compradores puedan suscribirse y comprar tu producto.

En la página del [producto de servidor](https://aws.amazon.com/marketplace/management/products/server), puede ver la lista de sus productos. Según la fase en la que se encuentre, el producto tendrá uno de los siguientes estados.
+ **Preparación:** un producto incompleto sobre el que aún está agregando información. La primera vez que **guarde y salga** de la experiencia de autoservicio, la solicitud de cambio correcta crea un producto inédito con información sobre los pasos completados que ha enviado. A partir de este estado, puede seguir agregando información al producto o cambiar los detalles ya enviados mediante solicitudes de cambio.
+ **Limitado**: un producto está completo una vez enviado al sistema y ha superado todas las validaciones del sistema. Luego, el producto pasa a un estado **Limitado**. En este momento, el producto tiene una página de detalles a la que solo se puede acceder desde su cuenta y desde la de las personas que haya incluido en la lista de permitidos. Puede probar su producto desde la página de detalles. Para obtener más información o ayuda, póngase en contacto con el equipo de [Operaciones de vendedores de AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/).
+ **Público**: cuando esté listo para publicar el producto para que los compradores puedan verlo y suscribirse a él, utilice la solicitud de cambio **Actualizar visualización**. Esta solicitud inicia un flujo de trabajo para que el equipo de AWS Marketplace operaciones de venta revise y audite tu producto en relación con AWS las políticas. Una vez aprobado el producto y procesada la solicitud de cambio, el producto pasa del estado **Limitado** al de **Público**. Para obtener información sobre AWS las directrices, consulta[Requisitos de productos basados en contenedores para AWS Marketplace](container-product-policies.md).
+ **Restringido**: si quiere impedir que los nuevos usuarios se suscriban a su producto, puede restringir la acción mediante la solicitud de **Actualizar visibilidad**. El estado **Restringido** significa que los usuarios actuales pueden seguir utilizando el producto. Sin embargo, el producto dejará de estar visible para el público y no estará disponible para los nuevos usuarios. 

## Requisitos previos
<a name="container-prereq"></a>

Antes de comenzar, debe completar los siguientes requisitos previos:

1. Acceda a [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/) y utilícelo. Esta es la herramienta que utilizas para registrarte como vendedor y gestionar los productos en los que vendes AWS Marketplace. Para obtener más información, consulte [AWS Marketplace Management Portal](https://docs.aws.amazon.com/marketplace/latest/userguide/user-guide-for-sellers.html#management-portal).

1. Regístrese como vendedor y envíe su información tributaria y bancaria. Para obtener más información, consulte [Proceso de registro](registration-process.md).

1. Cree al menos un contenedor en Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) o AWS Fargate. Asegúrese de que tiene enlaces para las imágenes asociadas.

1. Planifique cómo creará e integrará el producto de contenedor en AWS Marketplace.

   Le recomendamos que planifique su estrategia de precios, derechos y medición con suficiente antelación a la publicación pública del producto.
   + Para obtener información sobre los requisitos de los productos basados en contenedores, consulte [Requisitos de productos basados en contenedores para AWS Marketplace](container-product-policies.md).
   + Para obtener más información acerca de los precios de su producto, consulte [Precios de productos de contenedores para AWS Marketplace](pricing-container-products.md).
   + Para obtener información sobre la medición personalizada de su producto de pago basado en contenedores, consulte [Medición horaria y personalizada con AWS Marketplace Metering Service](container-products-billing-integration.md#entitlement-and-metering-for-paid-products).

## Descripción general: creación de un producto de contenedor
<a name="create-container-product"></a>

La creación de un producto de contenedor implica los siguientes pasos:

1. [Paso 1: creación del ID de producto y el código de producto para el producto de contenedor](#create-initial-container-product)

1. [Paso 2: creación de una publicación inicial](#container-initial-listing)

1. [Paso 3: agregación de una versión inicial del producto](#container-add-version-gs)

1. [Paso 4: (solo para productos de pago) integración de la medición o los precios por contrato](#getting-started-integrate-metering)

1. [Actualiza la visibilidad del producto](#container-product-visibility)

Para obtener información sobre el ciclo de vida del producto, consulte [Ciclo de vida del producto](#container-product-lifecycle).

## Paso 1: creación del ID de producto y el código de producto para el producto de contenedor
<a name="create-initial-container-product"></a>

Para empezar con un producto en contenedor, debes crear un registro de ID y código de producto en él AWS Marketplace. El ID del producto se utiliza para realizar un seguimiento del producto a lo largo de su ciclo de vida.

Utilice el siguiente procedimiento para crear un nuevo producto de contenedor en y generar el identificador del producto. AWS Marketplace Management Portal

**nota**  
Este proceso también crea una clave pública para el contenedor que se empareja con el producto.

**Para crear un ID de producto de contenedor**

1. Abra un navegador web e inicie sesión en [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

1. En la barra de menús, seleccione **Producto** y, luego, **Servidor**.

1. Elija **Crear producto de servidor** y, a continuación, elija **Contenedor**.

1. Genera un identificador y un código de producto de contenedor.
**nota**  
(Opcional) Puede etiquetar su producto para obtener una autorización basada en etiquetas. Para obtener más información, consulte [Etiquetado de los recursos de AWS](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html).

1. Seleccione **Continuar** para seguir creando su producto.

## Paso 2: creación de una publicación inicial
<a name="container-initial-listing"></a>

Tras generar el ID del producto, el código del producto y la clave pública, utilizará un asistente para crear un listado inicial.

1. Proporciona la información de producto para su listado de productos.

1. Determine el modelo de precios de su producto.
**nota**  
Para obtener más información acerca de los productos de contenedor, consulte [Precios de los productos de contenedor](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-container-products.html).
**nota**  
En el caso de los productos de pago, su producto tendrá un precio inicial de 0,01\$1 para que usted y el equipo de operaciones de vendedores de AWS Marketplace puedan probarlo sin incurrir en costes elevados. Proporcionará el precio actual cuando pase a fase pública.

1. Proporciona información adicional sobre la oferta, incluida la política de reembolsos, el EULA y la disponibilidad de la oferta.

1. Agregue un repositorio inicial para su producto de contenedor.

1. Seleccione **Enviar** en el último paso para mover el producto a visibilidad Limitada.
**nota**  
El producto de contenedor se crea inicialmente con una versión de marcador de posición. Agregará la versión final cuando el producto tenga una visibilidad Limitada. 

## Paso 3: agregación de una versión inicial del producto
<a name="container-add-version-gs"></a>

Es posible que el producto tenga varias versiones a lo largo de su vida útil. Cada versión tiene un conjunto de imágenes de contenedor que son específicas de esa versión. Para agregar una versión inicial del producto, consulte [Añadir una nueva versión de su producto contenedor en AWS Marketplace](container-add-version.md). 

## Paso 4: (solo para productos de pago) integración de la medición o los precios por contrato
<a name="getting-started-integrate-metering"></a>

Para los productos basados en contenedor con precio de uso, utilice el [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) tanto para comprobar el derecho a utilizar el producto como para el uso de medición para facturación. Debe medir el modelo de precios que creó al configurar la información de precios. Para obtener más información, consulte [Medición horaria y personalizada con AWS Marketplace Metering Service](container-products-billing-integration.md#entitlement-and-metering-for-paid-products).

### Precios contractuales
<a name="container-integrate-LM"></a>

En el caso de los productos basados en contenedores con precios por contrato, utilice AWS License Manager para asociar las licencias a su producto. 

Para obtener más información sobre la integración con AWS License Manager, consulte[Contrata los precios de los productos en contenedores con AWS License Manager](container-license-manager-integration.md).

## Paso 5: actualización de la visibilidad del producto
<a name="container-product-visibility-allowlist"></a>

Cuando creas un producto en AWS Marketplace, se publica inicialmente con una visibilidad limitada para que las cuentas de la lista de usuarios permitidos puedan verlo, incluida la cuenta que creó el producto. Puede actualizar la visibilidad del producto para que los compradores puedan suscribirse y comprar el producto. También puedes actualizar la lista de productos permitidos para Cuentas de AWS añadirlos. En este tema se muestra cómo administrar qué compradores pueden ver el producto en AWS Marketplace.

Para obtener más información acerca de la visibilidad y el ciclo de vida del producto, consulte [Ciclo de vida del producto](#container-product-lifecycle).

**Topics**
+ [Actualiza la visibilidad del producto](#container-product-visibility)
+ [Actualización de la lista de permitidos de Cuenta de AWS IDs](#container-update-allowlist)

### Actualiza la visibilidad del producto
<a name="container-product-visibility"></a>

**Para actualizar la visibilidad**

1. Abre el anuncio y[https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/), AWS Marketplace Management Portal a continuación, inicia sesión en tu cuenta de vendedor.

1. Vaya a la página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server) y, en la pestaña **Producto de servidor actual**, seleccione el producto basado en contenedor que desee modificar.

1. En el menú desplegable **Solicitar cambios**, seleccione **Actualizar visibilidad**.
**nota**  
Puede solicitar que el producto pase del estado **Limitado** al estado **Público** mediante esta solicitud de cambio. Sin embargo, la solicitud de cambio debe pasar por un proceso de aprobación del equipo de operaciones de AWS Marketplace vendedores para pasar a ser **pública**.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado pasará a ser **Correcto**.

### Actualización de la lista de permitidos de Cuenta de AWS IDs
<a name="container-update-allowlist"></a>

Puedes cambiar la Cuenta de AWS IDs lista para ver tu producto en un estado limitado. Las cuentas que figuran en la lista de usuarios permitidos muestran un distintivo de Limitado junto a la versión del producto en la página de detalles del producto.

1. Abre AWS Marketplace Management Portal at [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e inicia sesión en tu cuenta de vendedor.

1. En la página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), seleccione el producto de contenedor que desea modificar.

1. En la lista desplegable **Solicitar cambios**, seleccione **Actualizar la lista de permitidos**. Se muestra la lista actual de cuentas permitidas.

1. En el Cuentas de AWS campo **Permitidos,** introduce las letras Cuenta de AWS IDs y sepáralas con una coma.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado se actualizará a **Correcto** o **Error**.

## Siguientes pasos
<a name="container-next-steps"></a>

Tras crear un producto de contenedor, puede utilizar la información de los siguientes temas para configurarlo y administrarlo:
+ [Actualización de la información del producto de su envase en AWS Marketplace](update-container-product-info.md)
+ [Añadir una nueva versión de su producto contenedor en AWS Marketplace](container-add-version.md)
+ [Administrar los precios de los productos de contenedores en AWS Marketplace](container-pricing.md)
+ [Actualización de la disponibilidad de los productos de contenedores por país en AWS Marketplace](container-update-offer-avail-country.md)
+ [Actualización del acuerdo de licencia de usuario final (EULA) para productos de contenedor en AWS Marketplace](container-update-eula.md)
+ [Probar y lanzar su producto en envase en AWS Marketplace](test-release-product.md)

## Los contenedores escanean los productos para detectar problemas de seguridad
<a name="container-security"></a>

Cuando crea una solicitud de cambio para agregar una nueva versión a su producto de contenedor, escaneamos las imágenes del contenedor incluidas en esa nueva versión y comprobamos si hay vulnerabilidades de seguridad. Para ello, realizamos un escaneo layer-by-layer estático de la imagen. Si encontramos vulnerabilidades críticas con vectores de riesgo explotables de forma remota, le proporcionamos la lista de problemas encontrados. Le recomendamos encarecidamente que realice su propio análisis de seguridad usando un analizador de imágenes de contenedor como Clair, Twistlock, Aqua Security o Trend Micro para evitar retrasos en el proceso de adquisición y publicación. 

Su elección de la imagen base para la creación de imágenes de contenedor puede influir enormemente en el perfil de seguridad de la imagen final. Si elige una imagen base que ya tiene vulnerabilidades críticas conocidas, se marcarán debido a la capa base, incluso aunque las capas de software de su aplicación estén limpias. Le recomendamos que compruebe que está empezando con un contenedor base que esté libre de vulnerabilidades antes de crear las imágenes y enviarlas a él AWS Marketplace. 

# Actualización de la información del producto de su envase en AWS Marketplace
<a name="update-container-product-info"></a>

Una vez que haya creado el ID del producto y haya fijado el precio, puede editar la información del producto, incluidos qué clientes verán el producto de contenedor en el AWS Marketplace. Por ejemplo, si una nueva versión modifica la descripción o los aspectos más destacados del producto, puede editar la información del producto con los nuevos datos. También puede actualizar otra información del producto, como el título del producto, la descripción del SKU, las categorías, las palabras clave, etc. El siguiente procedimiento describe la creación de los detalles del producto.

**Para crear o actualizar los detalles del producto de contenedor**

1. Inicie sesión en la [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

1. Seleccione **Servidor** en el menú **Productos**. 

1. En la pestaña **Productos de servidor**, seleccione el producto que desee modificar.

1. En el menú desplegable **Solicitar cambios**, seleccione **Actualizar la información del producto**.

1. Actualice cualquiera de los siguientes campos que desee cambiar:
   + **Título del producto**
   + **SKU**
   + **Descripción breve**
   + **Descripción larga**
   + **URL de la imagen del logotipo del producto**
   + **Resaltados**
   + **Categorías de productos**
   + **Palabras clave**
   + **URL del vídeo del producto**
   + **Recursos**
   + **Información de soporte**
**nota**  
La imagen URLs debe estar en un bucket de Amazon S3 que sea de acceso público. Para obtener más información sobre el formato del logotipo, consulte [Requisitos y logotipo de la empresa y el producto](product-submission.md#seller-and-product-logos).

1. Elija **Enviar**.

1. Compruebe que la solicitud aparezca en la pestaña **Solicitudes** con el estado **En proceso de revisión**. Puede que tenga que actualizar la página para ver la solicitud en la lista.

Puede comprobar el estado de su solicitud en cualquier momento desde la pestaña **Solicitudes** de la página de [Productos de servidor](https://aws.amazon.com/marketplace/management/products/server).

# Añadir una nueva versión de su producto contenedor en AWS Marketplace
<a name="container-add-version"></a>

Como AWS Marketplace vendedor, puedes añadir nuevas versiones de tu producto de contenedor, gestionar las versiones y actualizar la información de las versiones. Es posible que el producto tenga varias versiones a lo largo de su vida útil. Cada versión tiene un conjunto de imágenes de contenedor que son específicas de esa versión. En los siguientes temas, se explica cómo administrar las versiones de los productos de contenedor.

**nota**  
No puede agregar una versión a su producto hasta que haya creado el ID del producto y el precio de su producto. Para obtener más información sobre estos pasos, consulte [Paso 1: creación del ID de producto y el código de producto para el producto de contenedor](container-product-getting-started.md#create-initial-container-product). 

**Topics**
+ [Paso 1: agregación de repositorios](#add-repositories)
+ [Paso 2: carga de imágenes y artefactos de contenedores a repositorios](#upload-resources)
+ [Paso 3: agregación de una nueva versión del producto de contenedor](#add-new-version)
+ [Paso 4: actualización de la información de la versión](#container-product-updating-version)
+ [Restricción de una versión del complemento de Amazon EKS](#restriciting-version-eks-addon)

## Paso 1: agregación de repositorios
<a name="add-repositories"></a>

Las imágenes del contenedor y otros artefactos del producto se almacenan en repositorios de AWS Marketplace. Normalmente, se crea un repositorio para cada artefacto necesario, pero el repositorio puede almacenar varias versiones del artefacto (con etiquetas diferentes). 

**nota**  
Todas las imágenes de la implementación del producto deben usar imágenes de los repositorios de AWS Marketplace .

El siguiente procedimiento describe cómo añadir los repositorios necesarios. AWS Marketplace

**Para agregar repositorios**

1. Inicie sesión en la [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

1. Seleccione **Servidor** en el menú **Productos**.

1. En la pestaña **Productos de servidor**, seleccione el producto que desea modificar y, a continuación, seleccione **Agregar repositorios** en el menú desplegable **Solicitar cambios**.

1. Introduzca el nombre del repositorio que desea crear. Si desea crear más de un nuevo repositorio:
   + Seleccione **Agregar nuevo repositorio** para cada repositorio adicional.
   + Introduzca un nombre único. El nombre único que elija debe figurar en todos los productos de su cuenta de vendedor.
**nota**  
El repositorio tendrá esta estructura: `<repositoryID>.dkr.ecr.us-east-1.amazonaws.com/<sellerName>/<repositoryName>`. Cuando agregue elementos al repositorio (en el siguiente procedimiento), obtendrán una etiqueta y tendrán esta estructura: `<repositoryID>.dkr.ecr.us-east-1.amazonaws.com/<sellerName>/<repositoryName>:<tag>`.   
`repositoryID`Es un identificador interno de AWS Marketplace.
El `sellerName` se basa en el nombre que ha creado para su cuenta de vendedor. Cuando el nombre `sellerName` para mostrar del vendedor genera un prefijo de repositorio no válido, AWS Marketplace sustituye automáticamente el nombre del vendedor por un UUID (identificador único universal). Para cambiar el prefijo UUID del nombre de su repositorio, póngase en contacto con el equipo de operaciones de AWS Marketplace.
El `respositoryName` se define en este paso.
La `tag` se establece al cargar un artefacto en el repositorio.

1. Seleccione **Enviar**.

**nota**  
Puedes tener hasta 70 repositorios por producto.

Se crea una nueva solicitud y se muestra en la pestaña **Solicitudes**. Cuando se complete, en cuestión de minutos podrá empezar a agregar imágenes de contenedores y otros artefactos a los repositorios que haya creado.

## Paso 2: carga de imágenes y artefactos de contenedores a repositorios
<a name="upload-resources"></a>

**Para cargar imágenes y artefactos de contenedores a los repositorios**

1. Inicie sesión en la [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

1. En el menú **Productos**, seleccione **Servidor**.

1. En la pestaña **Productos de servidor**, seleccione el producto que desee modificar.

1. Seleccione **Agregar repositorios** en el menú desplegable **Solicitar cambios**.

1. Seleccione **Ver los repositorios existentes**.

1. Seleccione el repositorio en el que desea cargar.

1. Seleccione **Ver comandos push** para abrir una lista de instrucciones, incluidos los comandos que puede usar para enviar imágenes de contenedores de Docker y gráficos de Helm a ese repositorio. 

   Para obtener información general sobre cómo enviar imágenes de contenedores y otros artefactos a los repositorios, consulte [Envío de una imagen](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-push.html) en la *Guía del usuario de Amazon Elastic Container Registry*.
**nota**  
Puede usar las siguientes operaciones de API de Amazon Elastic Container Registry (Amazon ECR) cuando se llama a `docker pull` o a `docker push`:  
`DescribeImages`: úselo para revisar los metadatos sobre las imágenes de un repositorio.
`GetAuthorizationToken`: úselo para autenticarse antes de cargar los artefactos en el repositorio y, a continuación, utilice nuestros comandos `docker pull` o `docker push`.
`ListImages`: úselo para ver una lista de las imágenes que ha introducido.

1. Utilice los comandos de la lista para enviar los artefactos necesarios de su repositorio local al AWS Marketplace repositorio de su producto.
**nota**  
La **tag** que proporciona en los comandos `push` se utiliza para diferenciar la versión del artefacto que está cargando en el repositorio. Use una etiqueta que tenga sentido para la versión de la que forman parte los artefactos.

1. Repita el procedimiento para cada imagen o artefacto del contenedor que necesite en su versión.
**nota**  
Su versión puede incluir hasta 50 imágenes o artefactos de contenedores en cada opción de entrega. Consulte el siguiente procedimiento para obtener más información sobre las opciones de entrega.

Una vez que haya subido sus artefactos, estará listo para crear la versión de su producto. 

**nota**  
Las imágenes de su contenedor se escanean automáticamente para comprobar si cumplen [Requisitos de productos basados en contenedores para AWS Marketplace](container-product-policies.md). Para obtener más información, consulte [Los contenedores escanean los productos para detectar problemas de seguridad](container-product-getting-started.md#container-security).

### Agregar una nueva opción de entrega
<a name="add-delivery-option"></a>

Cada versión del producto de contenedor requeriría una opción de entrega. La opción de entrega especifica las opciones de implementación disponibles para el comprador. En función de una de las siguientes opciones de entrega, tendrá que cargar los artefactos correspondientes en los repositorios.
+ Si **opta** por una opción de entrega de imágenes de contenedores, cargue todas las imágenes de contenedores necesarias para la instalación del producto en el repositorio de Amazon Elastic Container Registry (Amazon ECR) creado en la consola. AWS Marketplace 
+ Para una opción de envío de **Helmcartas**, cargue las imágenes del Helm gráfico y del contenedor en el repositorio de Amazon ECR creado en la AWS Marketplace consola.
+ Para la opción de entrega de un **complemento de consola Amazon EKS**, cargue las imágenes del Helm gráfico y del contenedor en el repositorio de Amazon ECR creado en la AWS Marketplace consola.

## Paso 3: agregación de una nueva versión del producto de contenedor
<a name="add-new-version"></a>

**nota**  
Si se genera algún error al añadir una nueva versión al contenedor, consulte la [tabla Asynchronous Errors en Add a new version](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version), en la *Referencia de AWS Marketplace Catalog API *.

**Para agregar una nueva versión de su producto de contenedor**

1. Inicie sesión en la [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

1. Elija **Servidor** en el menú **Archivo**.

1. En la pestaña **Productos de servidor**, seleccione el producto al que desee agregar una versión. A continuación, seleccione **Agregar nueva versión** en el menú desplegable **Solicitar cambios**.

1. En la página **Agregar nueva versión**, introduzca el **Título de la versión** y las **Notas de la versión** de su versión.

1. Tras introducir los detalles de la versión, el siguiente paso es agregar las opciones de entrega. Las opciones de entrega son conjuntos de instrucciones e información que los compradores pueden utilizar para lanzar el software desde la versión de su producto. Los compradores conocen las opciones de entrega como *opciones de tramitación de producto*.
**nota**  
Su producto puede ser compatible con varias plataformas con diferentes imágenes de contenedor (por ejemplo, implementaciones de Kubernetes y Ubuntu). Puede crear una opción de entrega para cada forma en que los clientes puedan configurar su producto, hasta cuatro opciones de entrega por versión del producto.

   1. Si el producto ya tiene opciones de entrega en otras versiones, puede usar la opción existente como plantilla para agregar una opción de entrega a la nueva versión. En **Opciones de envío**, seleccione la opción de envío que desee agregar de la lista. Puede editar la opción siguiendo las instrucciones de los pasos siguientes.

   1. Para agregar una nueva opción de envío, seleccione **Nueva opción de envío**. Después de agregar una opción, siga las instrucciones de los siguientes pasos para configurarla.

1. Elija un método de entrega para la opción de entrega. El método de entrega determina la forma en que los compradores lanzarán su software.
   + Para obtener una opción de entrega de **imágenes de contenedores**, proporcione rutas a imágenes de contenedores en un repositorio de Amazon Elastic Container Registry (Amazon ECR) que se creó en la consola de AWS Marketplace . Los compradores utilizan las rutas de imágenes de contenedor para lanzar el software, ya que llevan las imágenes directamente a sus entornos.
   + Si opta por una opción de entrega de **Gráfico de Helm**, proporcione rutas a los gráficos de Helm en un repositorio de Amazon ECR creado en la consola de AWS Marketplace . Los compradores instalan los gráficos de Helm en su entorno de implementación para lanzar el software.
   + Si opta por una opción de entrega de **Complemento de consola de Amazon EKS**, proporcione rutas a los gráficos de Helm en un repositorio de Amazon ECR creado en la consola de AWS Marketplace . Los compradores instalan el contenedor mediante la consola Amazon EKS o el complemento nativo de Amazon EKS APIs para lanzar el software. Para obtener más información, consulte [Complementos de Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html#workloads-add-ons-available-eks).

   1. Para agregar una opción de entrega de **Imagen de contenedor**, lleve a cabo los siguientes pasos:

      1. En **Imágenes de contenedor**, agregue la URL de Amazon ECR a las imágenes del contenedor que contienen la versión del software del producto.

      1. En **Título de la opción de entrega** y en **Descripción de la opción de implementación**, introduzca un título y una descripción para esta opción de entrega.

      1. En **Instrucciones de uso**, introduzca información detallada para ayudar a los compradores a utilizar el software después de lanzarlo.

      1. En **Servicios compatibles**, seleccione los entornos en los que los compradores pueden lanzar el software.

      1. En **Plantillas de implementación**, agregue recursos que los compradores puedan utilizar para lanzar el software. Introduzca un título y una URL del recurso para cada plantilla.

   1. Para agregar una opción de entrega de **Gráfico de Helm**, lleve a cabo los siguientes pasos:

      1. En **Gráfico de Helm**, agregue la URL de Amazon ECR al gráfico de Helm que los compradores instalarán en su entorno de implementación para lanzar su software.

      1. En **Imágenes de contenedor**, agregue la URL de Amazon ECR a las imágenes del contenedor que contienen la versión del software del producto.

      1. En **Título de la opción de entrega** y en **Descripción de la opción de implementación**, introduzca un título y una descripción para esta opción de entrega.

      1. En **Instrucciones de uso**, introduzca información detallada para ayudar a los compradores a utilizar el software después de lanzarlo.

      1. En **Servicios compatibles**, seleccione los entornos en los que los compradores pueden lanzar el software.

      1. *Opcional: * en **Nombre de la versión de Helm**, introduzca el nombre del espacio de nombres de Kubernetes en el que se instalará el gráfico de Helm.

      1. *Opcional:* en **Espacio de nombres de instalación de Helm**, introduzca el nombre de la versión de Helm que utilizará el comando `helm install`.

      1. *Opcional:* en **KubernetesNombre de la cuenta de servicio de **, introduzca el nombre de la cuenta de servicio de Kubernetes que se utilizará para conectarse a AWS Identity and Access Management (IAM). La cuenta de servicio de Kubernetes llama a servicios de AWS como la concesión de licencias o la medición.

      1. En **Anular parámetros**, introduzca los parámetros que se utilizarán en los comandos de la CLI de Helm que inician el software. Estos parámetros permiten a los compradores anular los valores predeterminados proporcionados. Hay un límite de 15 parámetros cuando se usa la consola AWS Marketplace de administración, pero no hay límite cuando se usa la AWS Marketplace Catalog API. Para obtener más información, consulte [Agregar una nueva versión a un producto basado en contenedores](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version).
**nota**  
Se requieren una serie de **parámetros de anulación**. Los productos Amazon EKS Anywhere requieren un **parámetro de anulación** para el secreto de licencia con un `DefaultValue` de `"${AWSMP_LICENSE_SECRET}"`. En el caso de los productos de pago, debe proporcionar un **parámetro de anulación** para la configuración de la cuenta de servicio con el `DefaultValue` de `"${AWSMP_SERVICE_ACCOUNT}"`.

      1. Seleccione **Ocultar contraseñas y secretos** para ocultar la información confidencial en las consolas, las herramientas de línea de comandos y APIs. Para obtener más información, consulte la documentación sobre el parámetro `NoEcho` en la sección [Parámetros](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html) de la *Guía del usuario de AWS CloudFormation *.

   1. Para añadir una opción de entrega de **Complemento de consola de Amazon EKS**, asegúrese de que los artefactos cumplen con [Requisitos de los productos complementarios de Amazon EKS](container-product-policies.md#publishing-eks-add-on) y, a continuación, lleve a cabo los siguientes pasos:
**nota**  
Solo se admite una opción de entrega de complemento de Amazon EKS por versión. No podrá añadir una versión nueva hasta que la versión actual con la que está trabajando esté publicada en la consola de Amazon EKS.

      1. En **Gráfico de Helm**, agregue la URL de Amazon ECR al gráfico de Helm que los compradores instalarán en su entorno de implementación para lanzar su software.

      1. En **Imágenes de contenedor**, agregue la URL de Amazon ECR a las imágenes del contenedor que contienen la versión del software del producto. Asegúrese de que todas las imágenes del gráfico de Helm estén recopiladas.

      1. En **Título de la opción de entrega** y en **Descripción de la opción de implementación**, introduzca un título y una descripción para esta opción de entrega.

      1. En **Visibilidad**, mantenga el valor predeterminado de **Limitado seleccionado**.

      1. En **Nombre del complemento**, introduzca un nombre único para este complemento. El nombre del complemento que introduzca se adjuntará al nombre del vendedor al mostrarse en la consola de Amazon EKS.

      1. En **Versión del complemento**, introduzca la versión del complemento que estará visible al instalar o actualizar este complemento. Siga el formato `major.minor.patch`.

      1. En **Tipo de complemento**, seleccione una categoría para el complemento en la lista desplegable.

      1. En **Versión de Kubernetes**, seleccione todas las versiones de Kubernetes compatibles con el complemento.

      1. En **Arquitectura**, seleccione las arquitecturas de plataforma compatibles con el complemento. Las opciones son **AMD64** y **ARM64**. Recomendamos admitir ambas arquitecturas para maximizar la compatibilidad. Si su complemento no es compatible con ARM64 dispositivos, debe especificar una fecha planificada para añadir soporte antes de que su producto pueda publicarse en todos los anuncios comerciales Regiones de AWS.

      1. En **Espacio de nombres**, introduzca un espacio de nombres de Kubernetes único en el que se instalará el complemento. Los espacios de nombres `default`, `kube-system` y `kube-public` no son compatibles para la instalación de complementos de terceros.

      1. En **Parámetros de anulación del entorno**, puede seleccionar hasta 2 parámetros de entorno del marco de complementos de Amazon EKS. Puede asignar los nombres de los parámetros del values.yaml a estas variables de entorno, que son `${AWS_REGION}` y `${AWS_EKS_CLUSTER_NAME}`.

1. Para agregar opciones de entrega adicionales, elija **Nueva opción de entrega** y siga las instrucciones de los pasos anteriores para configurarlas.

1. Seleccione **Enviar**.

## Paso 4: actualización de la información de la versión
<a name="container-product-updating-version"></a>

Una vez creada una versión, puede resultar útil proporcionar información actualizada a los compradores modificando la información asociada a la versión. Por ejemplo, si piensa restringir la versión 1.0 después del lanzamiento de la versión 1.1, puede actualizar la descripción de la versión 1.0 para dirigir a los compradores a la versión 1.1. Indique la fecha en la que se restringirá la versión 1.0. Actualiza la información de la versión desde el AWS Marketplace Management Portal.

**Para actualizar la información de la versión**

1. Inicie sesión en la [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

1. Seleccione **Servidor** en el menú **Productos**. 

1. En la pestaña **Productos de servidor**, seleccione el producto que desee modificar.

1. En el menú desplegable **Solicitar cambios**, seleccione **Actualizar la información de la versión**.

1. En la página **Actualizar la versión**, seleccione la versión que desea actualizar.

1. Actualice la versión seleccionada. Los campos que están disponibles para la actualización dependen del estado de la versión del producto o de la opción de entrega.

   1. Para todas las versiones, puede actualizar las **Notas de la versión**.

   1. En el caso de las versiones que aún no están disponibles públicamente, puede actualizar el **Título de la versión**.

   1. Para las opciones de entrega que no están restringidas, puede actualizar los siguientes campos:
      + **Descripción**
      + **Instrucciones de uso**
      + **Servicios admitidos**

   1. Para las opciones de entrega en las versiones que aún no están disponibles públicamente, puede actualizar los siguientes campos:
      + **Títulos de las opciones de entrega**
      + **Gráfico de Helm** (solo para las opciones de entrega de **Gráfico de Helm**)
      + **Imágenes de contenedor**
      + **Recursos de implementación**
      + **AddOn Nombre**
      + **AddOn Versión**
      + **AddOn Tipo**
      + **URI del gráfico de Helm**
      + **CompatibleKubernetesVersions**
      + **SupportedArchitectures**
      + **Namespace**
      + **EnvironmentOverrideParameters**

   1. Para ver las opciones de entrega en las versiones que están disponibles públicamente, puedes actualizarlas **SupportedArchitectures**.

1. Elija **Enviar**.

1. Compruebe que la solicitud aparezca en la pestaña **Solicitudes** con el estado **En proceso de revisión**.

Puede comprobar el estado de su solicitud en cualquier momento desde la pestaña **Solicitudes** de la página de [Productos de servidor](https://aws.amazon.com/marketplace/management/products/server).

## Restricción de una versión del complemento de Amazon EKS
<a name="restriciting-version-eks-addon"></a>

Para restringir una versión del producto de contenedor publicada como complemento, póngase en contacto con el equipo de operaciones de AWS Marketplace mediante el formulario de contacto que aparece en la parte inferior del [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

# Administrar los precios de los productos de contenedores en AWS Marketplace
<a name="container-pricing"></a>

Como AWS Marketplace vendedor, puedes gestionar y actualizar los precios de los productos en contenedores. Para productos de contenedores, puede publicar productos gratuitos, productos de modelo Bring Your Own License (BYOL) y productos de pago para Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) y AWS Fargate. Solo puede definir un precio por producto. Puede agregar o actualizar las dimensiones de precios. Según el modelo de precios, puede añadir dimensiones de contrato y de uso. También puede actualizar las condiciones de precios o la política de reembolsos. Para obtener más información, consulte las siguientes secciones.

 Para obtener más información sobre los modelos de precios de los productos de contenedores AWS Marketplace, consulte[Precios de productos de contenedores para AWS Marketplace](pricing-container-products.md).

**Topics**
+ [Agregar una dimensión de precios](#container-add-pricing-dimensions)
+ [Actualizar información de dimensiones](#container-update-dimensions-information)
+ [Actualización de las condiciones de precios](#container-update-pricing-terms)
+ [Actualización de la política de devoluciones de un producto](#container-update-refund-policy)

## Agregar una dimensión de precios
<a name="container-add-pricing-dimensions"></a>

Puede agregar una dimensión de precios al modelo de precios que utiliza para la facturación de sus productos. Para obtener más información acerca de los precios, consulte [Modelos de precio de contenedores](pricing-container-products.md#pricing-models-for-server-products).

**nota**  
La adición de una dimensión de precios a un contrato con precios de consumo (por ejemplo, pay-as-you-go precios para usos adicionales) no está disponible en el AWS Marketplace Management Portal.  
No puede cambiar su modelo de precios entre los precios por contrato, por uso y por contrato con precios de consumo. Póngase en contacto con el equipo de [operaciones de vendedores de AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/) para obtener ayuda.

1. Abre el enlace AWS Marketplace Management Portal [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e inicia sesión en tu cuenta de vendedor.

1. En la página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), seleccione el producto de contenedor que desea modificar.

1. En la lista desplegable **Solicitar cambios**, seleccione **Actualizar dimensiones de precios** y, a continuación, seleccione **Agregar dimensiones de precios**.

1. Según el modelo de precios, puede agregar dimensiones de contrato o dimensiones de uso proporcionando información para **ID de la API**, **Nombre de visualización** y **Descripción**.

1. Seleccione **Siguiente** e introduzca los precios de las dimensiones de su contrato.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado se actualizará a **Realizado con éxito** o **Error**. 

## Actualizar información de dimensiones
<a name="container-update-dimensions-information"></a>

Puede cambiar la información de dimensiones de su producto. Para obtener más información acerca de los precios, consulte [Modelos de precio de contenedores](pricing-container-products.md#pricing-models-for-server-products).

1. Abre AWS Marketplace Management Portal at [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e inicia sesión en tu cuenta de vendedor.

1. En la página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), seleccione el producto de contenedor que desea modificar.

1. En la lista desplegable **Solicitar cambios**, seleccione **Actualizar dimensiones de precios** y, a continuación, seleccione **Actualizar información de dimensiones**.

1. Para agregar información sobre las dimensiones, proporcione información sobre el **Nombre de visualización** y la **Descripción** de la dimensión que desea actualizar.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado se actualizará a **Realizado con éxito** o **Error**. 

## Actualización de las condiciones de precios
<a name="container-update-pricing-terms"></a>

Puede cambiar las condiciones de precios de su producto. Es posible que sea necesario actualizar las condiciones de precios si cambia los países en los que se ofrece su producto.

1. Abre AWS Marketplace Management Portal at [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e inicia sesión en tu cuenta de vendedor.

1. En la página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), seleccione el producto de contenedor que desea modificar.

1. En la lista **Solicitar cambios**, seleccione **Actualizar oferta pública** y, a continuación, seleccione **Actualizar condiciones de precios**.

1. Los precios actuales se rellenan automáticamente para que los edite. Puede eliminar el precio actual y agregar el nuevo. Le recomendamos que revise los precios que solicite antes de enviar su solicitud de revisión.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado se actualizará a **Realizado con éxito** o **Error**.

**nota**  
Si aumenta el precio de una dimensión mediante la opción **Actualizar condiciones de precios**, no podrá actualizar los precios durante 90 días. Un aumento de precio bloquea el precio durante 90 días a partir del día en que se inicie el cambio. Este bloqueo de precios solo está en vigor para un aumento de precio, no para una disminución de precio.

## Actualización de la política de devoluciones de un producto
<a name="container-update-refund-policy"></a>

Puede actualizar la política de devoluciones de su producto. Las actualizaciones de la política de reembolsos entran en vigor para todos los usuarios. Para obtener más información, consulte [Reembolsos y cancelaciones en AWS Marketplace](refunds.md). 

1. Abre AWS Marketplace Management Portal at [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e inicia sesión en tu cuenta de vendedor.

1. En la página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), seleccione el producto de contenedor que desea modificar.

1. En la lista desplegable **Solicitar cambios**, seleccione **Actualizar oferta pública** y, a continuación, seleccione **Actualizar política de reembolsos**.

1. La política de reembolsos actual se rellena automáticamente para que la edite. Puede eliminar la política de reembolsos actual y agregar la nueva política. Le recomendamos que revise la política de reembolsos que solicite antes de enviar su solicitud de revisión. Al enviar la solicitud, se sobrescribe la política de reembolsos actual.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado se actualizará a **Correcto** o **Error**. 

# Actualización de la disponibilidad de los productos de contenedores por país en AWS Marketplace
<a name="container-update-offer-avail-country"></a>

Como AWS Marketplace vendedor, puedes cambiar los países en los que se puede ofrecer tu producto en contenedor y a los que se puede suscribir. Para obtener más información, consulte [Países](regions-and-countries.md#product-countries). El siguiente procedimiento muestra cómo actualizar la disponibilidad de los productos de contenedor por país.

1. Abre la AWS Marketplace Management Portal dirección [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e inicia sesión en tu cuenta de vendedor.

1. En la página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), seleccione el producto de contenedor que desea modificar.

1. En la lista desplegable **Solicitar cambios**, seleccione **Actualizar oferta pública** y, a continuación, seleccione **Actualizar disponibilidad por país**.

1. Seleccione una de las siguientes tres opciones: 
   + **Todos los países**: disponible en todos los países admitidos.
   + **Todos los países con exclusiones**: disponible en todos los países admitidos, excepto en algunos países.
   + **Solo los países de la lista de permitidos**: disponible para que los compradores compren solo en los países que especifique.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado se actualizará a **Correcto** o **Error**. 

# Actualización del acuerdo de licencia de usuario final (EULA) para productos de contenedor en AWS Marketplace
<a name="container-update-eula"></a>

Como vendedor de AWS Marketplace, puede actualizar el acuerdo de licencia de usuario final (EULA) para usar el [Contrato estándar para AWS Marketplace](standardized-license-terms.md#standard-contracts) o un EULA personalizado. Las actualizaciones del EULA se aplican a los nuevos usuarios que se suscriban a su producto y a las renovaciones de productos. Utilice el siguiente procedimiento para actualizar el EULA.

1. Abra AWS Marketplace Management Portal en [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e inicie sesión en su cuenta de vendedor.

1. En la página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), seleccione el producto de contenedor que desea modificar.

1. En la lista desplegable **Solicitar cambios**, seleccione **Actualizar oferta pública** y, a continuación, seleccione **Actualizar EULA**.

1. Seleccione **Contrato estándar para AWS Marketplace** o envíe su EULA personalizado. Para obtener un EULA personalizado, debe proporcionar el contrato desde un bucket de Amazon S3.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado se actualizará a **Correcto** o **Error**. 

# Actualización de la política de reembolsos de tu producto basado en contenedores en AWS Marketplace
<a name="update-container-refund-policy"></a>

Como AWS Marketplace vendedor, puedes establecer la política de reembolsos para tu producto basado en contenedores. Si quiere cambiar la política de devoluciones de su producto, puede utilizar **Actualizar la política de devoluciones**. En el siguiente procedimiento se muestra cómo actualizar la política de reembolsos.

**Actualizar la política de reembolsos**

1. Abre el anuncio y[https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/), AWS Marketplace Management Portal a continuación, inicia sesión en tu cuenta de vendedor.

1. Vaya a la página [Productos de servidor](https://aws.amazon.com/marketplace/management/products/server) y seleccione el producto que desee modificar.

1. En el menú desplegable **Solicitar cambios**, seleccione **Actualizar oferta pública** y, a continuación, **Actualizar política de devoluciones**.

1. Los detalles de la política de reembolso actual se proporcionan en el cuadro de texto para que lo edite. Al enviar la solicitud, se sobrescribe la política de reembolsos actual.

1. Seleccione **Enviar** para enviar su solicitud de revisión.

1. Compruebe que la pestaña **Solicitudes** muestre el **Estado de la solicitud** como **En proceso de revisión**. Cuando se complete la solicitud, el estado pasará a ser **Correcto**.

# Probar y lanzar su producto en envase en AWS Marketplace
<a name="test-release-product"></a>

Después de añadir una nueva versión de tu producto en contenedor AWS Marketplace, puedes probarlo y luego lanzarlo al público. En este tema se describen los pasos y el proceso específicos necesarios para probar y publicar el producto.

**Topics**
+ [Opciones de entrega de imagen de contenedor y gráfico de Helm](#container-helm-delivery)
+ [Opción de entrega del complemento de Amazon EKS](#eks-addon-delivery)

## Opciones de entrega de imagen de contenedor y gráfico de Helm
<a name="container-helm-delivery"></a>

En esta sección se proporcionan instrucciones para lanzar la imagen del contenedor y el gráfico de Helm.

Se crea la solicitud de una nueva versión y debería completarse en cuestión de minutos. Puede realizar un seguimiento de la solicitud desde la pestaña **Solicitudes** de la página **Productos del servidor**. Si se genera algún error al probar o lanzar el complemento, consulte la tabla Asynchronous Errors en [Add a new version](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version), en la *Referencia de AWS Marketplace Catalog API *.

**nota**  
Si el producto tiene actualmente una disponibilidad limitada, solo pueden acceder a la versión del producto los compradores para los que esté disponible el producto. Si tu producto está actualmente disponible para el público, todos los AWS Marketplace compradores pueden acceder a la versión del producto.

Si esta fue su primera versión establecida, su producto ya está listo para publicarse.

## Opción de entrega del complemento de Amazon EKS
<a name="eks-addon-delivery"></a>

En esta sección se proporcionan instrucciones para probar y lanzar su complemento de Amazon EKS.

**Probar el complemento**
+ Tras enviar el complemento, AWS Marketplace procesa la solicitud y publica el complemento en un estado limitado para que lo valide en el catálogo de complementos de Amazon EKS. Puede realizar un seguimiento de la solicitud desde la pestaña **Solicitudes** de la página **Productos del servidor** en el AWS Marketplace Management Portal. Los tiempos de ingesta variarán entre 5 y 10 días laborables, según el volumen de solicitudes que estemos tramitando.

  Si tu solicitud está en **proceso de revisión**, el AWS equipo sigue publicando el complemento desde AWS Marketplace el catálogo de complementos de Amazon EKS. El estado de la solicitud cambiará a **Correcto** una vez que el complemento se publique en estado **Limitado**. Después de esto, puede empezar a probar el complemento.
+ Cuando tu complemento esté disponible, podrás encontrarlo en la región de Asia Pacífico (Seúl) para probarlo. AWS Marketplace confía en su experiencia para verificar el funcionamiento de su software. Para probar el complemento, debe crear un clúster de Amazon EKS en la región de Asia Pacífico (Seúl) en su cuenta de vendedor donde el complemento esté incluido en la lista de permitidos. Para probar el complemento, siga [estas instrucciones detalladas](https://aws.amazon.com/blogs/awsmarketplace/deploy-third-party-software-add-ons-aws-marketplace-amazon-eks-clusters/). Asegúrese de probarlo en todas las versiones de Kubernetes compatibles con el software.
+ Si ofrece un producto de pago, cree una oferta privada para las siguientes Cuentas de AWS internas. Estas cuentas ayudan a integrar el software en la consola de Amazon EKS en todas las Regiones de AWS comerciales.

  ```
  288092140294, 288092140294, 408202761791
  ```
+ Mantén el clúster de pruebas con el complemento activo hasta que se AWS Marketplace apruebe y pase a ser pública la versión del complemento.
**nota**  
AWS Marketplace no asumirá los costes de AWS infraestructura incurridos durante las pruebas de su producto contenedor en sus clústeres de Amazon EKS. Puede seguir los mecanismos de dimensionamiento adecuados para reducir el tamaño de los nodos a un costo operativo mínimo mientras verificamos los resultados de las pruebas.

**Publicar el complemento**

Una vez que haya validado el software mediante el clúster de Amazon EKS como complemento, puede enviar una solicitud para publicar la versión del complemento de Amazon EKS mediante el [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/) o AWS Marketplace Catalog API.

 Para obtener más información, consulte [Update the visibility for an Amazon EKS add-on](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#update-delivery-option-visibility) en la *AWS Marketplace Catalog API Reference*.

Puede realizar un seguimiento de la solicitud desde la pestaña **Solicitudes** de la página **Productos del servidor** en el AWS Marketplace Management Portal. Los tiempos de ingesta variarán.

# Requisitos de productos basados en contenedores para AWS Marketplace
<a name="container-product-policies"></a>

AWS Marketplace mantiene los siguientes requisitos para todos los productos y ofertas basados en contenedores en. AWS Marketplace Estos requisitos ayudan a promover un catálogo seguro y fiable para nuestros clientes. También animamos a los vendedores a revisar la implementación de controles y protocolos adicionales, según proceda, para satisfacer las necesidades de sus productos específicos.

Todos los productos y sus metadatos relacionados se revisan cuando se envían para garantizar que cumplen o superan las políticas actuales AWS Marketplace . Estas políticas se actualizan periódicamente para adaptarlas a las directrices de seguridad en constante evolución. AWS Marketplace analiza continuamente los productos para comprobar que los listados existentes siguen cumpliendo los cambios en estos requisitos. Si un producto no cumple con los requisitos, AWS Marketplace contactaremos con el vendedor para actualizarlo y adaptarlo a las nuevas normas. En algunos casos, es posible que los productos no estén disponible temporalmente para los nuevos suscriptores hasta que se resuelvan los problemas. Este proceso ayuda a mantener la seguridad y la confiabilidad de la AWS Marketplace plataforma para todos los usuarios.

**Topics**
+ [Políticas de seguridad](#container-security-requirements)
+ [Requisitos de información del cliente](#container-customer-info-requirements)
+ [Requisitos de uso del producto](#container-usage-requirements)
+ [Requisitos relativos a la arquitectura](#container-architecture-requirements)
+ [Requisitos para estructura de gráfico de Helm](#helm-chart-structure-requirements)
+ [Instrucciones de uso del producto de contenedor](#container-product-usage-instructions)
+ [Requisitos de los productos complementarios de Amazon EKS](#publishing-eks-add-on)

## Políticas de seguridad
<a name="container-security-requirements"></a>

 Todos los productos basados en contenedores deben cumplir los siguientes requisitos de seguridad:
+ Las imágenes de los contenedores no deben contener vulnerabilidades conocidas, software malicioso o paquetes de software End-of-Life (EoL) ni sistemas operativos.
+ Los contenedores no deben solicitar AWS credenciales para acceder a AWS los servicios. Cuando su producto necesite acceder a AWS los servicios, debe usar uno de los siguientes:
  + Roles de IAM para cuentas de servicio y cargas de trabajo de Amazon Elastic Kubernetes Service (Amazon EKS).
  + Roles de IAM para tareas y para cargas de trabajo de Amazon Elastic Container Service (Amazon ECS).
+ Los productos basados en contenedores solo requerirán privilegios mínimos para funcionar. Para obtener más información, consulte [Seguridad en Amazon Elastic Container Service](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/security.html) y [Seguridad en Amazon EKS](https://docs.aws.amazon.com//eks/latest/userguide/security.html).
+ De forma predeterminada, las imágenes de contenedor deben configurarse para que se ejecuten con privilegios que no sean de tipo raíz.
+ Los contenedores no deben contener ningún secreto codificado, como contraseñas (ni siquiera codificadas) para los usuarios y servicios del sistema, ni claves privadas, credenciales, etc.
+ La autenticación de cualquier servicio que se esté ejecutando en el contenedor no debe usar un acceso con contraseña, aunque sea el usuario quien la genere, restablezca o defina en el momento del lanzamiento. Tampoco se permiten contraseñas nulas o en blanco.
+ Las imágenes del contenedor no deben incluir capas con arquitecturas no compatibles (por ejemplo, metadatos integrados en Attestation Framework).

## Requisitos de información del cliente
<a name="container-customer-info-requirements"></a>

 Todos los productos basados en contenedores deben cumplir los siguientes requisitos de información del cliente: 
+ El software no debe recopilar ni exportar datos del cliente sin su conocimiento y consentimiento expreso, tal y como exige BYOL (Bring Your Own License). Las aplicaciones que recopilan o exportan datos de clientes deben seguir estas pautas: 
  + La recopilación de los datos de los clientes debe ser de tipo autoservicio, automatizada y segura. Los compradores no deben tener que esperar a que los vendedores aprueben la implementación del software. 
  + La recopilación de datos de los clientes debe ser coherente con sus acuerdos con AWS, entre otros, los [Términos y condiciones de AWS Marketplace, los Términos](https://aws.amazon.com/legal/seller-terms/) de [AWS servicio](https://aws.amazon.com/service-terms/), el [Aviso de AWS privacidad](https://aws.amazon.com/privacy/) y el [Acuerdo con el AWS cliente](https://aws.amazon.com/agreement/).
  + No se debe recopilar información de pago.

## Requisitos de uso del producto
<a name="container-usage-requirements"></a>

 Todos los productos basados en contenedores deben cumplir los siguientes requisitos de uso del producto: 
+ Los vendedores solo pueden publicar productos que funcionen correctamente. No se permiten productos con una versión beta o con una versión preliminar para prueba o evaluación. Se admiten las ediciones para desarrolladores, comunitarias y BYOL del software comercial si el vendedor proporciona una versión de pago equivalente en un AWS Marketplace plazo de 90 días a partir de la fecha de entrega de la edición gratuita.
+ Las instrucciones de uso de un producto basado en contenedores deben incluir todos los pasos necesarios para implementar los productos basados en contenedores. Las instrucciones de uso deben incluir comandos y recursos de implementación que apunten a las imágenes del contenedor correspondiente en AWS Marketplace.
+ Los productos basados en contenedores deben incluir todas las imágenes de contenedor que el suscriptor necesite para utilizar el software. Además, los productos basados en contenedores no deben requerir que el usuario lance el producto con imágenes externas AWS Marketplace (por ejemplo, imágenes de contenedores de repositorios de terceros).
+ Los contenedores y su software deben poder implementarse en forma de autoservicio y no deben requerir métodos de pago ni costes adicionales. Las aplicaciones que requieren dependencias externas durante la implementación deben seguir estas pautas:
  + El requisito debe indicarse en la descripción o en las instrucciones de uso del listado. Por ejemplo, *este producto requiere una conexión a Internet para implementarse correctamente. Los siguientes paquetes se descargan durante la implementación: <lista de paquetes>.* 
  + Los vendedores son responsables del uso, y de garantizar la disponibilidad y seguridad de todas las dependencias externas. 
  + Si las dependencias externas ya no están disponibles, también se debe eliminar el producto. AWS Marketplace 
  + Las dependencias externas no deben requerir métodos de pago ni costos adicionales.
+ Los contenedores que requieran una conexión continua con recursos externos que no estén bajo el control directo del comprador (por ejemplo, externos APIs o Servicios de AWS gestionados por el vendedor o un tercero) deben seguir estas pautas:
  + El requisito debe indicarse en la descripción o en las instrucciones de uso del listado. Por ejemplo, *Este producto requiere una conexión a Internet continua. Se requieren los siguientes servicios externos continuos para funcionar correctamente: <lista de recursos>.* 
  + Los vendedores son responsables del uso, y de garantizar la disponibilidad y seguridad de todos los recursos externos.
  + Si los recursos externos ya no están disponibles, también debes retirar el producto. AWS Marketplace 
  + Los recursos externos no deben requerir métodos de pago ni costos adicionales y la configuración de la conexión debe ser automática.
+ El software y los metadatos del producto no deben contener lenguaje que redirija a los usuarios a otras plataformas de nube, productos adicionales ni servicios de venta incremental que no estén disponibles en AWS Marketplace.
+ Si su producto es un complemento de otro producto o de un producto de otro proveedor de software independiente, la descripción del producto debe indicar que amplía la funcionalidad del otro producto y que, sin él, su utilidad es muy limitada. Por ejemplo, *Este producto amplía la funcionalidad de <nombre del producto> y, sin él, su utilidad es muy limitada. Tenga en cuenta que es posible que <nombre del producto> necesite su propia licencia para obtener todas las funciones de este listado.*

## Requisitos relativos a la arquitectura
<a name="container-architecture-requirements"></a>

 Todos los productos basados en contenedores deben cumplir los siguientes requisitos relacionados con la arquitectura: 
+ Las imágenes del contenedor de origen AWS Marketplace deben enviarse al repositorio Amazon Elastic Container Registry (Amazon ECR) propiedad de. AWS Marketplace Puede crear estos repositorios en AWS Marketplace Management Portal en la sección de productos del servidor para cada uno de sus listados de productos de contenedor.
+ Las imágenes de contenedor deben estar basadas en Linux.
+ Los productos de pago basados en contenedores deben poder implementarse en [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html), [Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) o [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html).
+ Los productos de pago basados en contenedores con precios contractuales y una integración AWS License Manager deberían implementarse en Amazon EKS, Amazon ECS, Amazon EKS Anywhere AWS Fargate, Amazon ECS Anywhere, Red Hat OpenShift Service on AWS (ROSA), en clústeres de Kubernetes autogestionados de forma local o en Amazon Elastic Compute Cloud.
+ En el caso de los productos con gráfico de Helm, las referencias a las imágenes contenedor deben estructurarse de acuerdo con los [Requisitos para estructura de gráfico de Helm](#helm-chart-structure-requirements) para permitir su implementación en distintas regiones.
+ Si tu producto basado en contenedores requiere que el comprador despliegue una Amazon Machine Image (AMI), debe ser una AMI AWS gestionada o una AMI independiente publicada en. AWS Marketplace Si publica su propia AMI en AWS Marketplace, debe cumplir con la [Requisitos de producto basados en AMI para AWS Marketplace](product-and-ami-policies.md) y usted debe indicar que se trata de un producto complementario, tal como se exige en la[Políticas de uso del producto](product-and-ami-policies.md#product-usage). Puede fijar el precio de BYOL a su producto basado en AMI porque es una extensión de su oferta basada en contenedores. AWS Marketplace escanea los productos basados en AMI en busca de vulnerabilidades y exposiciones comunes sin parches (CVEs) y requisitos de seguridad. Sus compradores también deben suscribirse a su producto basado en AMI antes de implementarlo.

## Requisitos para estructura de gráfico de Helm
<a name="helm-chart-structure-requirements"></a>

Todos los productos Helm Chart que se envíen AWS Marketplace deben cumplir los siguientes requisitos de estructura para garantizar una regionalización y un despliegue adecuados en AWS todas las regiones:
+ Las referencias a las imágenes de contenedor deben definirse exclusivamente en el archivo `values.yaml` y no estar codificadas en ningún otro archivo del gráfico de Helm. Esto permite AWS Marketplace reemplazar automáticamente estas referencias al replicar el producto en diferentes regiones.
+ El `values.yaml` archivo debe usar variables para todas las referencias a las imágenes del contenedor.
+ Si lo desea, puede dividirlos `registry` y `tag` dividirlos en campos separados en el mismo nivel que el repositorio para crear la referencia de imagen.
+ Las plantillas de Helm deben hacer referencia a estas variables utilizando la sintaxis de plantillas de Helm estándar (por ejemplo, `{{ .Values.image.repository }}:{{ .Values.image.tag }}`).
+ Evite utilizar la lógica condicional en las plantillas, ya que podría omitir las referencias a las imágenes definidas en `values.yaml`.
+ Cuando pruebes tu diagrama de Helm con diferentes AWS regiones, asegúrate de que al cambiar la región `values.yaml` correctamente se actualicen todas las referencias a imágenes de los recursos desplegados.

AWS Marketplace valida que todas las referencias a las imágenes de los contenedores estén definidas correctamente en el `values.yaml` archivo durante el proceso de envío del producto. Los productos que no cumplan estos requisitos serán rechazados.

### Requisitos para las referencias de imágenes de contenedores en los gráficos de Helm
<a name="helm-chart-best-practices"></a>

A continuación se muestran los enfoques para estructurar las referencias a imágenes de contenedores en los gráficos de Helm:

**`values.yaml` (formatos recomendados):**

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

**nota**  
Recomendamos el enfoque anterior para la estructura de su `values.yaml`, pero los métodos alternativos que se muestran a continuación también son válidos.

**`values.yaml`(formato alternativo):**

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

**`values.yaml`(formato alternativo):**

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

**nota**  
Para la plantilla de implementación, el siguiente formato es el único formato válido disponible.

**Plantilla de implementación:**

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

**Enfoque incorrecto (no lo utilice):**

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

### Posibles errores de validación de los gráficos de Helm
<a name="helm-chart-validation-errors"></a>

Durante el proceso de envío del producto, AWS Marketplace realiza comprobaciones de validación de los productos de Helm Chart para garantizar que cumplen con los requisitos de referencia de las imágenes de los contenedores. Si tu diagrama de Helm no cumple estos requisitos, es posible que te encuentres con los siguientes errores de validación:


| Error | Explicación | 
| --- | --- | 
| INCOMPATIBLE\$1HELM\$1OBJECTS | Los objetos de Helm especificados no son compatibles con los complementos de EKS. Consulte [Requisitos de los productos complementarios de Amazon EKS](#publishing-eks-add-on). | 
| INVALID\$1DEPENDENT\$1HELM\$1CHARTS | Los gráficos de Helm dependientes deben estar contenidos en el directorio de gráficos principal y no ser de origen externo. | 
| INVALID\$1HELM\$1SENSITIVE\$1CONFIG | El esquema de configuración no puede contener campos que recopilen información confidencial. Los esquemas de configuración no deben aceptar contraseñas, claves de API, certificados ni secretos. En su lugar, proporciona campos para los nombres secretos de Kubernetes que los clientes crearán por separado. | 
| INVALID\$1HELM\$1CHART\$1IMAGES | [Todas las imágenes, incluidas las dependencias de código abierto, deben enviarse a los repositorios de AWS Marketplace Amazon ECR creados mediante la solicitud Add Repository.](container-add-version.md#add-repositories) | 
| INVALID\$1HELM\$1UNDECLARED\$1IMAGES | [Todas las referencias a las imágenes del contenedor deben figurar de forma explícita en la solicitud de adición de versiones.](container-add-version.md#add-new-version) | 
| INVALID\$1HELM\$1LINT | No se pudo helm lint validar el gráfico de Helm. Ejecute helm lint localmente para identificar y corregir problemas estructurales o sintácticos. Utilice la versión Helm 3.19.0 o posterior. | 
| INVALID\$1HELM\$1TEMPLATE | No se pudo helm template validar el gráfico de Helm. El gráfico no se puede representar en manifiestos de Kubernetes válidos. Realice pruebas locales helm template para identificar los errores lógicos o de sintaxis de la plantilla. Utilice la versión Helm 3.19.0 o posterior. | 
| MISSING\$1HELM\$1DEPLOYMENT\$1CONFIG | El gráfico de Helm de un complemento de Amazon EKS debe contener una implementación o un DaemonSet recurso. Amazon EKS requiere al menos uno de estos tipos de carga de trabajo para la administración del ciclo de vida de los complementos. Consulte [Requisitos de los productos complementarios de Amazon EKS](#publishing-eks-add-on). | 
| INCOMPATIBLE\$1CONFIGURATION\$1SCHEMA\$1VERSION | No se admite la versión actual aws\$1mp\$1configuration\$1schema.json del esquema JSON. Consulte [Requisitos de esquema](#schema-requirements) las versiones de esquema compatibles. | 
| INVALID\$1IMAGE\$1REFERENCE | Todas las imágenes se deben definir como variables values.yaml y se debe hacer referencia a ellas mediante la sintaxis de plantillas de Helm, tal y como se describe en[Requisitos para estructura de gráfico de Helm](#helm-chart-structure-requirements). | 
| MISSING\$1VALUES\$1IMAGE\$1REFERENCE | Cada referencia de imagen de contenedor debe tener una entrada correspondientevalues.yaml. | 
| MISSING\$1IMAGE\$1TAG | Las referencias a las imágenes del contenedor values.yaml deben incluir valores de etiqueta explícitos o utilizar de forma predeterminada la versión del gráficoChart.yaml. | 

## Instrucciones de uso del producto de contenedor
<a name="container-product-usage-instructions"></a>

Al crear las instrucciones de uso para su producto de contenedor, siga los pasos y las instrucciones de [Creación de una AMI y de instrucciones de uso de productos de contenedor para AWS Marketplace](ami-container-product-usage-instructions.md). 

### Instrucciones de uso de gráfico de Helm
<a name="helm-chart-usage-instructions"></a>

Al crear las instrucciones de uso para los productos de gráfico de Helm:
+ Documente con claridad todos los parámetros configurables de su archivo `values.yaml`, incluidos los parámetros del repositorio de imágenes, la etiqueta y el registro.
+ Proporcione ejemplos de cómo anular estos parámetros al instalar el gráfico de Helm.
+ No indique a los usuarios que modifiquen ningún archivo que no sea `values.yaml` ni que utilicen parámetros `--set` al instalar el gráfico.
+ Incluye información sobre cómo gestiona su producto la regionalización de las imágenes de contenedor.

## Requisitos de los productos complementarios de Amazon EKS
<a name="publishing-eks-add-on"></a>

Un complemento de Amazon EKS es un software que proporciona capacidades operativas para aplicaciones de Kubernetes, pero no es específico de la aplicación. Por ejemplo, un complemento de Amazon EKS incluye agentes o Kubernetes controladores de observabilidad que permiten que el clúster interactúe con AWS los recursos subyacentes para redes, procesamiento y almacenamiento.

Como vendedor de productos de contenedor, puede elegir entre varias opciones de implementación, incluido Amazon EKS. Puedes publicar una versión de tu producto como AWS Marketplace complemento en el catálogo de complementos de Amazon EKS. El complemento aparece en la consola de Amazon EKS junto a los complementos mantenidos por AWS otros proveedores. Sus compradores pueden implementar el software como complemento de la misma manera que lo hacen con otros complementos.

Para obtener más información, consulte [Complementos de Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html) en la *Guía del usuario de Amazon EKS*.

### Preparar su producto contenedor como AWS Marketplace complemento
<a name="preparing-eks-addon"></a>

Para publicar tu producto de contenedor como AWS Marketplace complemento, debe cumplir los siguientes requisitos:
+ Tu producto en contenedor debe estar publicado en AWS Marketplace.
+ Su producto contenedor debe estar diseñado de forma compatible con ambas AMD64 ARM64 arquitecturas.
+ Su producto de contenedor no debe usar el [modelo de precios](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-container-products.html) Bring Your Own License (BYOL).
**nota**  
BYOL no es compatible para la entrega de complemento de Amazon EKS.
+ Debes cumplir con todos los [requisitos de los productos basados en contenedores](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-policies.html), incluido el envío de todas las imágenes y Helm gráficos de los contenedores a los repositorios gestionados de AWS Marketplace Amazon ECR. Este requisito incluye imágenes de código abierto, por ejemplo, `nginx`. Las imágenes y los gráficos no se pueden alojar en otros repositorios externos, incluidos, entre otros, [Amazon ECR Public Gallery](https://docs.aws.amazon.com/AmazonECR/latest/public/public-repositories.html), Docker Hub y Quay.
+ **Gráficos de Helm**: prepare y compacte su software como un gráfico de Helm. El marco de complementos de Amazon EKS convierte un gráfico de Helm en un manifiesto de Kubernetes. Algunas características de Helm no son compatibles con los sistemas de Amazon EKS. En la siguiente lista se describen los requisitos que deben cumplirse antes de incorporar el software como complemento de Amazon EKS. En esta lista, todos los Helm comandos utilizan la versión 3.19.0: Helm
  + Se admiten todos los `Capabilities` objetos, con la excepción de. `.APIVersions` `.APIVersions`no se admite en la versión non-built-in personalizada Kubernetes APIs.
  + Solo se admiten los objetos ``, `Release.Name` y `Release.Namespace`.
  + Los enlaces de Helm y la función de `lookup` no se admiten.
  + Todos los gráficos dependientes deben estar ubicados dentro del gráfico principal de Helm (especificado con la ruta del repositorio archivo://...).
  + El gráfico de Helm debe superar correctamente Helm Lint y Helm Template sin errores. Los comandos son los siguientes:
    + Helm Lint: `helm lint helm-chart`

      Entre los problemas más habituales se incluyen gráficos no declarados en los metadatos del gráfico principal. Por ejemplo, `chart metadata is missing these dependencies: chart-base Error: 1 chart(s) linted, 1 chart(s) failed`
    + Helm Template: `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`

      Apruebe cualquier configuración anulada con el indicador `-f`.
  + Guarde todos los archivos binarios de los contenedores en los AWS Marketplace repositorios de Amazon ECR. Para crear un manifiesto, utilice el comando de plantilla Helm que se muestra anteriormente. Busque en el manifiesto cualquier referencia a imágenes externas, como imágenes `busybox` o imágenes `gcr`. Cargue todas las imágenes del contenedor junto con las dependencias en los repositorios de AWS Marketplace Amazon ECR creados mediante la opción **Añadir repositorio** en el menú desplegable de solicitudes.
+ **Configuración personalizada**: puede añadir variables personalizadas durante la implementación. Para obtener información sobre cómo identificar la experiencia del usuario final, asignar un nombre al software `aws_mp_configuration_schema.json` y empaquetarlo en un contenedor con el gráfico de Helm, consulte [Amazon EKS add-ons: Advanced configuration](https://aws.amazon.com/blogs/containers/amazon-eks-add-ons-advanced-configuration/).

  Según [la palabra clave “\$1schema”](https://json-schema.org/draft/2020-12/json-schema-core#name-the-schema-keyword), `$schema` debe ser un URI que apunte a un recurso de `application/schema+json` válido.

  Este archivo no debe aceptar información confidencial, como contraseñas, claves de licencia y certificados.

  Para gestionar las instalaciones secretas y certificadas, puede proporcionar a los usuarios finales los pasos posteriores a la instalación o posterior a pre-Add-on la instalación. El producto no debe depender de ninguna licencia externa. El producto debe funcionar en función de los derechos de AWS Marketplace .

  Para obtener más información acerca de las limitaciones de `aws_mp_configuration_schema.json`, consulte [Requisitos de configuración de complementos y mejores prácticas para proveedores de complementos](#eks-addon-configuration).
+ **Identifique y cree el espacio de nombres en el que se implementará el software**: en la primera versión del producto, debe identificar el espacio de nombres en el que se implementará el software añadiendo un espacio de nombres con plantilla.
+ **Definiciones de recursos personalizadas (CRDs)**: el marco de complementos Amazon EKS no admite la instalación ni las declaraciones de CRDs recursos personalizadas basadas en la CRDs aplicación con el mismo complemento. Si su complemento tiene recursos personalizados y se basa en ellos CRDs, puede hacer lo siguiente: 
  + **Publique dos complementos:** divida la definición de CRD en un complemento independiente (gráfico de Helm independiente) y la propia instalación de [recursos personalizada](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) también en un complemento independiente.
  + **Publica un único complemento con instrucciones manuales adicionales:** publica un único complemento que instale CRDs el clúster. Proporcione instrucciones de uso junto con los archivos de manifiesto de Kubernetes para que los usuarios finales puedan configurar los recursos personalizados que dependan de ellas. CRDs
+ **Cree el `serviceAccount` que corresponda**: si el software es de pago AWS Marketplace o debe conectarse con otro Servicios de AWS, asegúrese de que el Helm gráfico se cree `serviceAccount` de forma predeterminada. Si la creación de `serviceAccount` la gestiona un parámetro de un archivo `values.yaml`, defina el valor del parámetro en `true`. Por ejemplo, `serviceAccount.create = true`. Esto es necesario porque el cliente podría optar por instalar el complemento heredando los permisos de la instancia del nodo subyacente, que ya tiene los permisos necesarios. Si el gráfico de Helm no crea la `serviceAccount`, los permisos no se pueden vincular a la `serviceAccount`.
+ **Implementaciones o daemonsets rastreables**: asegúrese de que el gráfico de Helm tenga un daemonset o una implementación. El marco de complementos de Amazon EKS realiza un seguimiento de la implementación de los recursos de Amazon EKS que los usan. Sin una implementación o un daemonset rastreable, el complemento será objeto de un error de implementación. Si el complemento no tiene una implementación o un daemonset, por ejemplo, si despliega varios recursos personalizados o un trabajo de Kubernetes que no se puede rastrear, añada una implementación o un objeto de daemonset ficticio.
+ **Soporte para arquitecturas AMD y ARM**: muchos clientes de Amazon EKS utilizan ARM64 actualmente instancias AWS Graviton. El software de terceros debe ser compatible con ambas arquitecturas.
+ **Intégrelo con la licencia o la medición APIs desde AWS Marketplace**: AWS Marketplace admite varios modelos de facturación. Para obtener más información, consulte [Integraciones de facturación, medición y licencias de productos de contenedor](container-products-billing-integration.md). Si desea vender el producto mediante los mecanismos de PAYG, consulte [Configuración de medición personalizada para productos de contenedores con AWS Marketplace Metering Service](container-metering-meterusage.md). Si desea vender el producto mediante un modelo por adelantado o por contrato, consulte [Contrata los precios de los productos en contenedores con AWS License Manager](container-license-manager-integration.md). 
+ **Cargue el software y todos los artefactos y dependencias**: el gráfico de Helm debe ser independiente y no debe requerir dependencias de orígenes externos, por ejemplo. GitHub. Si el software requiere dependencias externas, las dependencias deben enviarse a los repositorios privados de AWS Marketplace Amazon ECR que se encuentren en la misma lista. AWS Marketplace 
+ **Proporcione instrucciones de implementación en el sitio web**: le pedimos que aloje una guía de implementación para que los clientes identifiquen cómo implementar el software mediante el comando [create-addon](https://docs.aws.amazon.com/cli/latest/reference/eks/create-addon.html).
+ ** permissions/IAM Funciones complementarias**: si el complemento publicado desde el que se publica AWS Marketplace requiere acceso a un AWS servicio, el software debe tener una cuenta de servicio de Kubernetes con las políticas de IAM para acceder a los servicios. AWS Puedes elegir entre dos opciones para tu cuenta de servicio para realizar solicitudes de API a los servicios: AWS 
  + Credenciales mediante IRSA: esta opción permite al software obtener credenciales ficticias del Access Role Service (IRSA) de Identity and Access Management (IAM). Para obtener más información, consulte [Roles de IAM para cuentas de servicio](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html). 
  + Identidad del pod de Amazon EKS: esta opción permite que el software utilice la identidad del pod de Amazon EKS para realizar solicitudes de API a AWS los servicios. Para obtener más información, consulte [Descubra cómo EKS Pod Identity otorga a los pods acceso a AWS los servicios](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)

  El complemento debe tener un archivo de configuración adicional denominado `aws_mp_addon_parameters.json` en el nivel superior del gráfico de Helm, en el mismo directorio que el esquema de configuración personalizado actual (`aws_mp_configuration_schema.json`). Actualmente, este archivo solo gestiona los permisos compatibles con Pod Identity. El archivo tiene el formato siguiente: 

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

  **Nombre de archivo: `aws_mp_addon_parameters.json`**
**nota**  
El archivo `aws_mp_addon_parameters.json` habilita la sección **Acceso al complementos** en la página **Ajustes de configuración de complementos** de la consola Amazon EKS    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/marketplace/latest/userguide/container-product-policies.html)
**nota**  
Pay-as-you-go Los productos complementarios (PAYG) de Amazon EKS Pod Identity no AWS Marketplace pueden usar Amazon EKS Pod Identity y deben usar las funciones de IAM para las cuentas de servicio (IRSA) para el control de acceso.
+ **Actualizaciones de versiones**: Amazon EKS publica nuevas versiones de Kubernetes unas semanas después de la versión anterior. A medida que las nuevas versiones del clúster de Amazon EKS estén disponibles de forma general, los proveedores disponen de 45 días para certificar o actualizar su software para que sea compatible con la nueva versión del clúster de Amazon EKS. Si sus versiones actuales del complemento son compatibles con la nueva versión de Kubernetes, valide y certifique las mismas para que podamos actualizar la matriz de compatibilidad de versiones. Si se necesita una nueva versión del complemento que sea compatible con el lanzamiento de la nueva versión de Kubernetes, envíe la nueva versión para su incorporación.
+ El software del socio debe pertenecer a uno de los siguientes tipos o ser un software operativo que mejore Kubernetes o Amazon EKS: Gitops \$1 monitoring \$1 logging \$1 cert-management \$1 policy-management \$1 costes-management \$1 autoscaling \$1 storage \$1 kubernetes-management \$1 service-mesh \$1 etcd-backup \$1 load-balancer \$1 local-registry\$1 networking \$1 Security \$1 backup \$1 ingress-controller \$1 observability ingress-service-type
+ El software no puede ser [una interfaz de red de contenedores (CNI).](https://github.com/containernetworking/cni)
+ El software debe venderse AWS Marketplace e integrarse con las licencias y la medición de APIs los productos de pago. No se aceptan productos BYOL.

### Requisitos de configuración de complementos y mejores prácticas para proveedores de complementos
<a name="eks-addon-configuration"></a>

Amazon EKS requiere la configuración como una cadena de [esquema JSON de Helm](https://helm.sh/docs/topics/charts/#schema-files) para los proveedores de complementos. Los complementos que necesiten configuraciones obligatorias o que permitan configuraciones opcionales deben incluir un `aws_mp_configuration_schema.json` archivo en el Helm Chart enviado a AWS Marketplace. Amazon EKS utilizará este esquema para validar la entrada de configuración de los clientes y rechazar las llamadas a la API con valores de entrada que no se ajusten al esquema. Las configuraciones de complementos suelen clasificarse en dos categorías:
+ Configuración de propiedades generales de Kubernetes, como etiquetas, tolerancias, nodeSelector, etc.
+ Configuraciones que son específicas del complemento, como la clave de licencia, la habilitación de funciones URLs, etc.

Esta sección se centra en la primera categoría relacionada con las propiedades generales de Kubernetes.

Amazon EKS recomienda seguir las prácticas recomendadas en relación con la configuración de los complementos de Amazon EKS.
+ [Requisitos de esquema](#schema-requirements)
+ [Parámetros comunes que se permiten para la configuración](#parameters-allowed)
+ [Parámetros comunes que no se permiten para la configuración](#parameters-not-available)

#### Requisitos de esquema
<a name="schema-requirements"></a>

Al definir el esquema json, asegúrese de utilizar una versión de jsonschema compatible con los complementos de Amazon EKS. 

La lista de esquemas compatibles:
+ 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

El uso de cualquier otra versión del esquema json no es compatible con los complementos de Amazon EKS y provocará que el complemento no se pueda lanzar hasta que se solucione este problema.

**Ejemplo de archivo de esquema de 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**  
Los parámetros de configuración deben ser CamelCase y se rechazarán si no se sigue este formato.

**Las descripciones son obligatorias**  
Incluya siempre descripciones significativas de las propiedades del esquema. Esta descripción se utilizará para representar los nombres de las etiquetas en la consola de Amazon EKS para cada parámetro de configuración.

**Definición de RBAC**  
Los proveedores de complementos deben definir y proporcionar los permisos de RBAC necesarios para instalar correctamente el complemento utilizando el principio del privilegio mínimo. Si es necesario cambiar los permisos de RBAC para las versiones más recientes del complemento o correcciones para abordar un CVE, los proveedores de complementos deberán informar al equipo de Amazon EKS acerca de este cambio. Los permisos necesarios para cada recurso de Kubernetes deben restringirse al nombre del recurso del objeto.   

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

**Administración de secretos**  
Esta sección solo se aplica a los complementos que requieren que los clientes configuren información secreta, como la clave de la aplicación, la clave de API, la contraseña, etc. Actualmente, Amazon EKS APIs no admite la transmisión de información secreta en texto plano debido a las implicaciones de seguridad. Sin embargo, los clientes pueden usar la configuración para pasar el nombre del Kubernetes Secret que contiene las claves que necesita el complemento. Como requisito previo, los clientes deberán crear objetos de Kubernetes Secret que contengan las claves con el mismo espacio de nombres y, a continuación, pasar el nombre del objeto Secret mediante el blob de configuración al crear el complemento. Recomendamos que los proveedores de complementos asignen un nombre a las propiedades del esquema para que los clientes no lo confundan accidentalmente con la clave real. Por ejemplo: appSecretName, connectionSecretName etc.   
En resumen, los proveedores de complementos pueden aprovechar el esquema para permitir a los clientes introducir el nombre del secreto, pero no las claves que realmente contienen el secreto. 

**Valores de configuración de ejemplo**  
Puede incluir ejemplos de configuración en su esquema para ayudar a los clientes con la configuración de los complementos. El siguiente ejemplo es del esquema de AWS Distro for OpenTelemetry Add-on.  

```
"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": []
      }
    ]
```

#### Parámetros comunes que se permiten para la configuración
<a name="parameters-allowed"></a>

A continuación se indican los parámetros recomendados en un archivo de esquema de Helm orientado al cliente.


| Parámetro | Description (Descripción) | ¿Debería tener un valor predeterminado? | 
| --- | --- | --- | 
| additionalLabels | Añada etiquetas de Kubernetes a todos los objetos de Kubernetes administrados por el complemento. | No | 
| additionalAnnotations | Añada anotaciones de Kubernetes a todos los objetos de Kubernetes administrados por el complemento. | No | 
| podLabels | Añada etiquetas de Kubernetes a los pods administrados por el complemento. | No | 
| podAnnotations | Añada anotaciones de Kubernetes a los pods administrados por el complemento. | No | 
| logLevel | Registre nivel para los componentes administrados por el complemento. | Sí | 
| nodeSelector | La forma más sencilla recomendada de restricción de selección de nodos. Puede agregar el campo nodeSelector a la especificación del Pod y especificar las etiquetas de nodo que quiere que tenga el nodo de destino. | Potencialmente, por ejemplo, solo nodos de Linux | 
| toleraciones | Las tolerancias se aplican a los pods. Las tolerancias permiten al programador programar los pods con taints correspondientes. Las tolerancias permiten la programación, pero no garantizan la programación. | Tal vez, más común con daemonsets | 
| affinity | La característica de afinidad consta de dos tipos de afinidad: la afinidad de nodo funciona como el campo nodeSelector, pero es más expresiva y permite especificar reglas flexibles; la afinidad/antiafinidad entre pods permite restringir los pods según las etiquetas de otros pods. | Quizás | 
| topologySpreadConstraints | Puede utilizar restricciones de propagación de topología para controlar cómo se distribuyen los pods en el clúster entre dominios de error, como regiones, zonas, nodos y otros dominios de topología que define el usuario. Esto puede ayudar a lograr una alta disponibilidad, así como una utilización eficiente de los recursos. | Quizás | 
| resource request/limits | Especifique cuánto necesita cpu/memory cada contenedor. Se recomienda encarecidamente configurar las solicitudes. Los límites son opcionales. | Sí | 
| replicas | Número de réplicas de los pods administrados por el complemento. No se aplica a daemonsets. | Sí | 

**nota**  
Para los parámetros de configuración de programación de la carga de trabajo, es posible que necesite separar los componentes de nivel superior del esquema cuando sea necesario. Por ejemplo, el controlador CSI de Amazon EBS contiene dos componentes principales, el controlador y el agente de nodo; los clientes requieren un nodo diferente selectors/tolerations para cada componente. 

**nota**  
Los valores predeterminados definidos en el esquema JSON son únicamente para fines de documentación del usuario y no eliminan la necesidad de tener el valor predeterminado legítimo en el archivo `values.yaml`. Si utiliza la propiedad predeterminada, asegúrese de que la propiedad en `values.yaml` coincida con la del esquema y de que los dos artefactos (`values.schema.json` y `values.yaml`) permanezcan sincronizados siempre que se realicen cambios en el gráfico 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"
            ]
          }
```

### Parámetros comunes que no se permiten para la configuración
<a name="parameters-not-available"></a>

Puede que varios complementos (por ejemplo, el controlador de Elastic Load Balancing) requieran parámetros de metadatos de clúster como `clusterName`, `region`, `vpcId`, `accountId` y otros. Los complementos de Amazon EKS inyectarán automáticamente cualquier parámetro similar a estos que conozca el servicio Amazon EKS y no será responsabilidad del usuario especificarlo como opción de configuración. Entre estos parámetros se incluyen los siguientes:
+ AWS región
+ Nombre de clúster de Amazon EKS
+ ID de VPC del clúster
+ Registro de contenedores, específicamente para las cuentas de build-prod, que utilizan los complementos de red
+ IP del clúster de DNS, específicamente para el complemento coredns
+ Punto de conexión de API de clúster de Amazon EKS
+ IPv4 habilitado en el clúster
+ IPv6 habilitado en el clúster
+ Delegación de prefijos para IPv6 habilitada en el clúster

Los proveedores de complementos deben asegurarse de tener definidas las plantillas para dichos parámetros aplicables. Cada uno de los parámetros anteriores tendrá un atributo `parameterType` predefinido por Amazon EKS. Los metadatos de la versión especificarán el mapeo entre el parámetro `parameterType` y el parámetro name/path de la plantilla. De esta forma, Amazon EKS puede transferir los valores de forma dinámica sin necesidad de que los clientes los especifiquen mediante las configuraciones y, además, aporta flexibilidad a los proveedores de complementos para definir su propio nombre/ruta de plantilla. Los parámetros como los anteriores que Amazon EKS necesita inyectar de forma dinámica deben excluirse del archivo de esquema.

**Ejemplo de asignación a partir de metadatos de la versión**

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

A continuación se indican los parámetros que no se recomienda que puedan configurarse en un archivo de esquema de Helm orientado al cliente. Los parámetros deben tener valores predeterminados no modificables, o bien no incluirse en absoluto en la plantilla del complemento.


| Parámetro | Description (Descripción) | ¿Debería tener un valor predeterminado? | 
| --- | --- | --- | 
| imagen | Imagen de contenedor que se implementará en el clúster de Kubernetes. | No, se administra mediante la definición del complemento | 
| imagePullSecrets | Configuración de un pod para usar un secreto y extraerlo de un registro privado. | N/A | 
| livenessProbe | El proceso de Kubelet utiliza sondeos de estado para saber cuándo reiniciar un contenedor. Por ejemplo, los sondeos de estado podrían detectar un bloqueo en el que una aplicación se está ejecutando pero no progresa. Reiniciar un contenedor en ese estado puede contribuir a que la aplicación esté más disponible a pesar de los errores. | Sí | 
| readinessProbe | Es importante que tenga un sondeo de preparación para sus contenedores. De esta forma, el proceso de Kubelet que se ejecuta en el plano de datos sabrá cuándo el contenedor está listo para atender el tráfico. Un pod se considera listo preparado cuando todos sus contenedores están listos. Uno de los usos de esta señal es controlar qué pods se utilizan como backends para los servicios. Cuando un pod no está listo, se elimina de los equilibradores de carga del servicio. | Sí | 
| startupProbe | El kubelet usa sondeos de inicio para saber cuándo se ha iniciado una aplicación de contenedor. Si se configura un sondeo de este tipo, deshabilita las comprobaciones de actividad y preparación hasta que se realice correctamente, asegurándose de que esos sondeos no interfieran con el inicio de la aplicación. Esto se puede utilizar para adoptar comprobaciones de actividad de los contenedores que se inician lentamente y evitar que el kubelet los elimine antes de que estén en funcionamiento. | Opcional | 
| podDisruptionBudget | Defina un presupuesto de interrupción de pods (PDB) para garantizar que un número mínimo de PODS sigan funcionando durante las interrupciones voluntarias. Un PDB limita la cantidad de pods de una aplicación replicada que están inactivos simultáneamente debido a interrupciones voluntarias. Por ejemplo, una aplicación basada en quórum quiere asegurarse de que el número de réplicas en ejecución nunca sea inferior al número necesario para un quórum. Es posible que un frontend web quiera asegurarse de que la cantidad de réplicas que sirvan a la carga nunca descienda por debajo de un porcentaje determinado del total. | Sí, si el valor predeterminado es de más de dos réplicas | 
| serviceAccount (name) | Nombre de la cuenta de servicio bajo la que funcionarán los pods. | Sí | 
| serviceAccount (annotations) | Anotaciones aplicadas a la cuenta de servicio. Normalmente se utiliza para la característica de roles de IAM para cuentas de servicio | No, el ARN del rol de la cuenta de servicio de IAM está configurado en la API de complementos de Amazon EKS de nivel superior. Una excepción a esta regla es si el complemento tiene varios deployments/controllers (como Flux) y requiere una función ARNs IRSA independiente. | 
| priorityClassName | La prioridad indica la importancia de un pod en relación con otros pods. Si no se puede programar un pod, el programador intenta evitar (expulsar) los pods de menor prioridad para poder programar el pod pendiente. | Sí. La mayoría de los complementos son fundamentales para la funcionalidad del clúster y deberían tener una clase de prioridad establecida de forma predeterminada. | 
| podSecurityContext | Un contexto de seguridad define la configuración de privilegios y control de acceso un pod o un contenedor. Normalmente se utilizaba para configurar fsGroup, que era necesario para IRSA en los clústeres de la versión 1.19 y versiones anteriores. | Es poco probable, dado que Amazon EKS ya no es compatible con Kubernetes v1.19 | 
| securityContext | Un contexto de seguridad define la configuración de privilegios y control de acceso un pod o un contenedor. | Sí | 
| updateStrategy | Especifica la estrategia utilizada para reemplazar los Pods antiguos por otros nuevos. | Sí | 
| nameOverride | Anula el nombre de los pods. | No | 
| podSecurityPolicy |  Aplica restricciones a los parámetros.  | No, PSPs están en desuso | 
| extraVolumeMounts/Volúmenes adicionales |  Se utiliza para IRSA en clústeres que no son de Amazon EKS.   | No | 

# Precios de productos de contenedores para AWS Marketplace
<a name="pricing-container-products"></a>

En AWS Marketplace, puedes publicar productos gratuitos, productos del modelo Bring Your Own License (BYOL) y productos de pago para Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) y. AWS Fargate Solo puede definir un precio por producto. En esta sección se describen los modelos de precios disponibles para los productos de contenedores. 

**nota**  
Se utiliza el [Servicio de medición de AWS Marketplace](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) para exigir los derechos y medir el uso de los productos de pago. Para los precios por tarea o por pod, AWS mide automáticamente el uso.

El precio que establezcas para un producto de contenedor se aplica a todos. Regiones de AWS Cada vez que baje el precio de un producto de contenedor, el nuevo precio se implementa para sus compradores inmediatamente. Para los aumentos de precios, los compradores existentes reciben una notificación sobre el cambio 90 días antes de que afecte a su facturación. A los nuevos compradores se les factura la nueva cantidad.

**nota**  
Para los nuevos suscriptores, el cambio de precio entra en vigor de forma inmediata. Para los suscriptores actuales, el cambio de precio entra en vigor el primer día del mes siguiente a un período de 90 días que comienza en la fecha en que se envía la notificación de cambio de precio. Por ejemplo, supongamos que envía una notificación de cambio de precio el 16 de marzo. El 16 de junio es aproximadamente 90 días después del 16 de marzo. Como el cambio de precio se produce el primer día del mes siguiente al período de 90 días, la fecha de entrada en vigor del cambio es el 1 de julio.

**Topics**
+ [Modelos de precio de contenedores](#pricing-models-for-server-products)

## Modelos de precio de contenedores
<a name="pricing-models-for-server-products"></a>

AWS Marketplace tiene varios modelos de precios para los productos en contenedores. 

La tabla siguiente proporciona información general acerca de los modelos de precios de productos basados en contenedor.


**Modelos de precios para productos de contenedores**  

| Modelo de precios | Description (Descripción) | 
| --- | --- | 
| Traiga su propia licencia (BYOL) | BYOL se gestiona de forma externa o AWS Marketplace mediante una relación de facturación externa que mantienes con el comprador. El software del contenedor no se integra con el AWS Marketplace de facturación. | 
| Mensual | **Precio mensual fijo**Un precio mensual fijo que ofrece a los usuarios un uso ilimitado de los productos durante el mes siguiente.Ejemplo: establece el precio de su producto en 99 USD al mes. El producto incluye tres imágenes de contenedores diferentes que se implementan mediante una definición de tarea de Amazon ECS.Una vez que un comprador se suscribe a su producto, se le cobran inmediatamente 99 USD, que se repite cada mes hasta que cancela la suscripción. El comprador también obtiene un uso ilimitado del producto. El comprador también paga por separado cualquier infraestructura en la que se ejecuten las tareas. Mientras están suscritos, pueden acceder a las imágenes del contenedor. Pueden lanzar y ejecutar cualquier cantidad de contenedores desde esas imágenes de Amazon ECS o Amazon EKS con cualquier configuración.Si el comprador cancela su suscripción a mediados de mes, pierde el acceso al repositorio de Amazon ECR donde se AWS Marketplace almacenan las imágenes del contenedor. Es posible que el comprador haya extraído y guardado las imágenes originales. Sin embargo, ya no podrá acceder a las nuevas versiones de imágenes de contenedores a través de las que tú pongas a disposición. AWS Marketplace Se reembolsará al comprador la parte no utilizada del último mes. Se te paga en función del uso que haga el comprador menos la tarifa acordada AWS Marketplace . | 
| Dimensiones de precios medidas personalizadas |  Precios medidos personalizados basados en las dimensiones que defina (por ejemplo, usuarios, nodos, repositorios o GB), hasta 24 dimensiones por producto.  Ejemplo: los cargos de productos por parte de los usuarios. Tiene usuarios de administración y usuarios normales y define el precio como 2 USD para los usuarios de administración y 1 USD para los usuarios normales. Puede configurarlos como dimensiones independientes cuando publique su producto. Se cobra por usuarios que se han conectado por día y mide ese uso por día. Para obtener más información sobre la medición personalizada para precios basados en uso, consulte. [Configuración de medición personalizada para productos de contenedores con AWS Marketplace Metering Service](container-metering-meterusage.md)  | 
| Precio por hora por tarea o por pod |  **Tarea de Amazon ECS o pod de Amazon EKS** El precio por tarea de Amazon ECS o pod de Amazon EKS que medimos hasta el segundo con el precio establecido por hora. Ejemplo: su producto incluye tres imágenes de contenedor diferentes: un nodo de controlador, un nodo de trabajo y un nodo de análisis. Puesto que el producto no es funcional o útil sin el nodo de controlador, decide que desea cobrar por el uso de la imagen. Establece un precio de 6 USD por hora. Modifica el software en la imagen de contenedor para que el nodo de controlador se integre con la [API de AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html)`RegisterUsage`. De este modo, se garantiza que solo los compradores que tengan una suscripción activa pueden lanzar y ejecutar esa imagen de contenedor y que su uso se mide en función del tiempo que se ejecuta. Al comprador se le cobra 6 USD por hora de uso por cada pod de controlador de Amazon EKS en ejecución. Si el comprador lanza cinco pods de controlador de Amazon EKS que incluyen el contenedor del nodo de controlador, se les cobrará 30 USD por hora (6 USD por pod). El comprador también paga por separado por cualquier infraestructura en la que se ejecuten los pods. En los precios por hora, la facturación se realiza por segundo, con un mínimo de 1 minuto. Si el cliente ejecuta este contenedor de controladores durante 20 minutos y 30 segundos, se le cobrarán `20 x ($6/60) + 30 x ($6/60/60) = $2 + $0.05 = $2.05`. Se te paga en función del uso que haga el comprador menos la tarifa acordada AWS Marketplace . Para obtener más información sobre los precios por hora por tarea o por módulo, consulta. [Configuración de medición por hora con AWS Marketplace Metering Service](container-metering-registerusage.md)  | 
| Precios por hora o precios de medición personalizados con contrato a largo plazo |  Un contrato a largo plazo, a un precio reducido, pagado por adelantado o en cuotas periódicas. Se puede agregar un contrato a largo plazo a un producto existente que tenga precios medidos personalizados, o precios por tarea y por pod. Los compradores pagan los precios medidos cuando consumen una cantidad superior a la comprada en el contrato a largo plazo. Ejemplo: para los modelos de precios medidos, puede agregar un precio de contrato a largo plazo para que los compradores obtengan un descuento por comprometerse por adelantado. Supongamos que normalmente cobra 1 USD por unidad consumida. Un comprador que utilice 1 unidad por hora pagaría 8760 USD al año (`365 days x 24 hours x $1 per hour`). Podría habilitar un contrato que permita al comprador utilizar 1 unidad por hora durante esos 365 días a mitad de precio (4380 USD). En este caso, el comprador se compromete a pagar por adelantado el contrato de un año y el precio bajará de 1 USD por unidad a 0,5 USD por unidad. También puede permitir que el comprador adquiera varios de estos contratos. Si la cantidad medida indica que el comprador consumió 10 unidades en una hora y tenía dos contratos, se incluirán 2 unidades en los 2 contratos. Las 8 unidades adicionales se facturarían al precio normal de 1 USD por hora, lo que supone un total de 8 USD en esa hora. En el ejemplo por tarea o por módulo, también puede añadir un precio de contrato a largo plazo para que los compradores obtengan un descuento si se comprometen por adelantado. Si normalmente cobras 6 USD por cápsula, podrías fijar un contrato a largo plazo de 365 días con un precio de 13.140 USD (`365 days x 24 hours x $3 per pod per hour`). En ese caso, un contrato daría derecho al cliente a 1 cápsula por hora durante esos 365 días. Los clientes pueden optar por comprar varios contratos. Por ejemplo, un cliente puede comprar dos contratos que le dan derecho a 2 cápsulas por hora. Si el cliente utiliza más cápsulas por hora de las contratadas, el exceso de cápsulas se facturará al precio por hora normal. En ambos casos, a los compradores que adquieran contratos a largo plazo se les factura por adelantado, ya sea en pago único o en pagos futuros programados periódicamente. A los compradores también se les factura cualquier uso adicional que supere su contrato a la tarifa medida.   | 
| Precio de contratos de contenedores |  **Contenedor con precio contractual**: un producto basado en contenedores por el que el comprador paga una tarifa por adelantado. Para obtener más información sobre precios, consulte [Contrata los precios de los productos en contenedores con AWS License Manager](container-license-manager-integration.md).  | 

# Integraciones de facturación, medición y licencias de productos de contenedor
<a name="container-products-billing-integration"></a>

AWS Marketplace se integra con otros Servicios de AWS para proporcionar precios tanto de medición como basados en contratos para su producto de contenedor. Para los productos basados en contenedor con precio de uso, utilice el [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) tanto para comprobar el derecho a utilizar el producto como para el uso de medición para facturación. En el caso de los productos basados en contenedores con precios contractuales, puede utilizarlos para asociar las licencias AWS License Manager a su producto. En las siguientes secciones, se ofrece más información sobre la medición por hora y personalizada con AWS Marketplace Metering Service y los precios por contrato con AWS License Manager.

**Topics**
+ [Medición horaria y personalizada con AWS Marketplace Metering Service](#entitlement-and-metering-for-paid-products)
+ [Contrata los precios con AWS License Manager](#container-products-contracts-license-manager)
+ [Configuración de medición por hora con AWS Marketplace Metering Service](container-metering-registerusage.md)
+ [Configuración de medición personalizada para productos de contenedores con AWS Marketplace Metering Service](container-metering-meterusage.md)
+ [Contrata los precios de los productos en contenedores con AWS License Manager](container-license-manager-integration.md)

## Medición horaria y personalizada con AWS Marketplace Metering Service
<a name="entitlement-and-metering-for-paid-products"></a>

El [servicio de medición de AWS Marketplace](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) se utiliza tanto para comprobar el derecho a utilizar el producto como para el uso de medición para la facturación. Si quieres definir tus propias unidades de precios y contarnos ese uso a efectos de facturación, intégralo mediante la operación de la [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. Si quieres fijar el precio de tu producto en función del número de tareas o módulos utilizados y AWS medir ese uso automáticamente, intégralo mediante la operación de la [RegisterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_RegisterUsage.html)API. Para ambos tipos de precios, puede agregar un precio por contrato a largo plazo sin cambiar la forma en que se integra en AWS Marketplace Metering Service.

Cuando creas un nuevo producto contenedor en el AWS Marketplace Management Portal, te proporcionamos un conjunto de identificadores de producto (el código del producto y la clave pública) que se utilizan para integrar tu producto con el AWS Marketplace Metering Service.

### Concesión de derechos
<a name="seller-container-entitlement"></a>

La integración con el AWS Marketplace Metering Service le permite verificar que el cliente que utiliza su software de pago está suscrito a su producto AWS Marketplace, lo que le evita el uso no autorizado al iniciar el contenedor. Para verificar la idoneidad, utilice las operaciones de la [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)o de la API, en función de su modelo de precios. Para modelos de precios mensuales fijos y por hora, utilice la operación de API `RegisterUsage`. Para modelos de precios de medición personalizada, utilice la operación de API `MeterUsage`.

Si un comprador no tiene derecho a su producto, estas operaciones de la API devuelven la excepción `CustomerNotEntitledException`.

**nota**  
Si un comprador cancela la suscripción a su producto mientras lo ejecuta, tiene derecho a seguir ejecutándolo. Sin embargo, no puede lanzar contenedores adicionales para su producto.

### Directrices de integración
<a name="integration-guidelines"></a>

Tenga en cuenta las siguientes directrices a la hora de crear y publicar sus productos de contenedor y utilizar las operaciones de API `MeterUsage` o `RegisterUsage` para la autorización y la medición:
+ No configure AWS las credenciales en el software ni en la imagen del contenedor de Docker. AWS las credenciales del comprador se obtienen automáticamente en tiempo de ejecución cuando la imagen del contenedor se ejecuta en una tarea de Amazon ECS o en un pod de Amazon EKS.
+  Para llamar a las operaciones de `RegisterUsage` API `MeterUsage` o a las operaciones de Amazon EKS, debe [usar un AWS SDK compatible](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html). Para probar la integración de `MeterUsage` o de `RegisterUsage`, debe ejecutar un clúster de Amazon EKS que ejecute Kubernetes 1.13.x o una versión posterior. Se requiere Kubernetes 1.13 para los roles AWS Identity and Access Management (de IAM) para la compatibilidad con los pods. Las funciones de IAM son necesarias para que el pod en ejecución obtenga las AWS credenciales necesarias para invocar estas acciones en Amazon EKS. 
+ Puede hacer el desarrollo local, pero recibirá una excepción `PlatformNotSupportedException`. Esta excepción no se producirá al lanzar el contenedor en servicios de AWS contenedores (Amazon ECS, Amazon EKS y Fargate).

### Compatible Regiones de AWS
<a name="supported-regions-metering"></a>

Para obtener una lista de todos los AWS Marketplace compatibles Regiones de AWS, consulte [la tabla de regiones](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/) en el sitio web de infraestructura global.

#### Obtener el Región de AWS para medir
<a name="metering-aws-region-configuration"></a>

Al integrar el contenedor de medición con la operación `MeterUsage` o con la `RegisterUsage` API, no configure el AWS SDK para que utilice una operación específica. Región de AWS La región se debe obtener de forma dinámica en el tiempo de ejecución. 

**Example**  
Por ejemplo, un cliente lanza una tarea de Amazon ECS o un pod de Amazon EKS. La operación de API `RegisterUsage` se invoca en una región diferente de la región en la que se lanzó la tarea de Amazon ECS o el pod de Amazon EKS. Por lo tanto, la operación de API `RegisterUsage` arroja un error `InvalidRegionException`.



AWS Los lenguajes del SDK no lo determinan `AWS_REGION` de forma coherente. Si su SDK no detecta automáticamente la `AWS_REGION`, el software debe escribirse manualmente para determinar la `AWS_Region`. Por ejemplo, AWS SDK para Java utiliza automáticamente los [metadatos de instancia de Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) (concretamente, `ec2InstanceMetadata`) para obtener la región cuando no hay presentes variables de entorno u otro tipo de configuración. En este caso, llame solo a `ec2InstanceMetadata` si la variable de entorno `AWS_REGION` no está presente.

Para obtener información sobre cómo obtener dinámicamente una Región de AWS en tiempo de ejecución, consulta la [Guía del desarrollador del AWS SDK](https://aws.amazon.com/tools) correspondiente a tu lenguaje de programación.

### Impedir la modificación de la medición
<a name="prevent-metering-modification"></a>

La introducción de métodos para que los compradores modifiquen o anulen las llamadas a `RegisterUsage` o `MeterUsage` podría dar lugar a problemas de facturación y pago no deseados. Recomendamos encarecidamente que integre la lógica de medición y derechos.

Tenga en cuenta lo siguiente al diseñar su producto para evitar la modificación de la medición:
+ Si los compradores pueden insertar nuevas capas de imagen que contengan instrucciones `CMD` o `ENTRYPOINT`, integre directamente `RegisterUsage` o `MeterUsage` en el software que el comprador ejecuta a través de la imagen del contenedor. De lo contrario, las llamadas a `RegisterUsage` o `MeterUsage` ejecutadas a través de `CMD` o `ENTRYPOINT` desde la imagen base probablemente serán anuladas por el comprador.
+ Te recomendamos que administres los códigos de AWS Marketplace producto que tu software utiliza como entrada `RegisterUsage` o `MeterUsage` de forma que los compradores no puedan modificarlos. *Sin embargo, si tu producto gestiona los códigos de producto de forma que los clientes puedan anularlos (por ejemplo, mediante un gráfico de Helm o un manifiesto de Kubernetes), debes mantener una lista de códigos de producto fiables. AWS CloudFormation* AWS Marketplace El objetivo es garantizar que el código de producto que el software envía como entrada a `RegisterUsage` o `MeterUsage` sea válido.
+  Si alguno de los códigos de producto de confianza corresponde a productos gratuitos, asegúrese de que no puedan utilizarse en lugar de un código de producto de pago.

## Contrata los precios con AWS License Manager
<a name="container-products-contracts-license-manager"></a>

En el caso de los productos basados en contenedores con precios por contrato, se utilizan AWS License Manager para asociar las licencias a su producto. 

AWS License Manager es una herramienta de administración de licencias que permite a su aplicación realizar un seguimiento y actualizar las licencias (también conocidas como derechos) que haya adquirido un cliente. En esta sección se ofrece información sobre cómo integrar el producto en AWS License Manager. Una vez completada la integración, puede publicar su listado de productos en AWS Marketplace.

Para obtener más información al respecto AWS License Manager, consulte la [Guía del AWS License Manager usuario](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) y la [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)sección de la Referencia de *AWS CLI comandos*.

**nota**  
Los clientes no pueden lanzar nuevas instancias del contenedor después del periodo de vencimiento del contrato. Sin embargo, durante la vigencia del contrato, pueden lanzar cualquier cantidad de instancias. Estas licencias no están vinculadas a un nodo o instancia específicos. Cualquier software que se ejecute en cualquier contenedor de cualquier nodo puede retirar la licencia siempre que tenga las credenciales asignadas de AWS .
**Creación de ofertas privadas**: los vendedores pueden generar ofertas privadas para los productos mediante la herramienta de creación de ofertas privadas en AWS Marketplace Management Portal.
**Informes**: puede configurar fuentes de datos configurando un bucket de Amazon S3 en la sección **Informes** en AWS Marketplace Management Portal. Para obtener más información, consulte [Informes, fuentes de datos y paneles de control del vendedor en AWS Marketplace](reports-and-data-feed.md).

### Integración de flujos de trabajo
<a name="container-LM-LM-workflow"></a>

Los siguientes pasos muestran el flujo de trabajo para integrar su producto de contenedor en AWS License Manager:

1. El vendedor crea un producto con AWS License Manager integración.

1. El vendedor publica el producto en AWS Marketplace.

1. El comprador encuentra el producto AWS Marketplace y lo compra.

1. Se envía una licencia al comprador en su Cuenta de AWS.

1. El comprador utiliza el software lanzando la instancia de Amazon EC2, la tarea de Amazon ECS o el software de pod de Amazon EKS. El cliente realiza la implementación mediante un rol de IAM.

1. El software lee la licencia en la AWS License Manager cuenta del comprador, descubre los derechos adquiridos y aprovisiona las funciones en consecuencia. 
**nota**  
License Manager no realiza ningún seguimiento ni actualización. De ello se encarga la aplicación del vendedor.

# Configuración de medición por hora con AWS Marketplace Metering Service
<a name="container-metering-registerusage"></a>

**nota**  
 Para las implementaciones de EKS, el software debe usar los [roles de IAM para las cuentas de servicio (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) a fin de firmar la llamada a la API para la operación de la API de [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). No se admite el uso de [EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), el rol de nodo ni las claves de acceso a largo plazo.  
En el caso de las implementaciones de ECS, el software debe utilizar el rol de [IAM de tareas de Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) a fin de firmar la llamada a la API para la operación de la API de [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). No se admite el uso del rol de nodo ni de claves de acceso a largo plazo.

Si el producto de contenedor utiliza precios de tareas o por pod por hora en lugar de dimensiones de precios medidos personalizadas, no es necesario definir dimensiones de medición personalizadas. Puede utilizar AWS Marketplace Metering Service para la medición por hora con productos de contenedores en AWS Marketplace. En las siguientes secciones, se muestra cómo configurar la medición por hora con AWS Marketplace Metering Service.

La operación de API `RegisterUsage` mide el uso del software por tarea de Amazon Elastic Container Service (Amazon ECS) o por pod de Amazon Elastic Kubernetes Service (Amazon EKS), por hora, con el uso prorrateado al segundo. En el caso de las tareas o los pods que tienen una vida útil muy corta, se aplica un uso mínimo de un minuto. La medición continua para el uso del software es gestionada automáticamente por el AWS Marketplace Metering Control Plane. No es necesario que su software realice ninguna acción específica de medición, excepto llamar una vez a `RegisterUsage` para medir el uso del software para comenzar.

Se debe llamar a `RegisterUsage` inmediatamente al momento de lanzar un contenedor. Si no registra el contenedor en las primeras 6 horas desde su lanzamiento, el servicio de medición de AWS Marketplace no ofrece ninguna garantía de medición respecto a los meses anteriores. Sin embargo, la medición continuará durante el mes en curso hasta que finalice el contenedor.

Siguen AWS Marketplace Metering Control Plane facturando a los clientes por la ejecución de las tareas de Amazon ECS y los pods de Amazon EKS, independientemente del estado de la suscripción del cliente. Esto elimina la necesidad de que el software realice comprobaciones de derechos tras el lanzamiento inicial correcto de la tarea o el pod. 

Para obtener más información sobre la integración de la AWS Marketplace Metering Service API con productos de contenedores con precios por hora, consulte el laboratorio sobre cómo [integrar la medición por hora](https://catalog.workshops.aws/mpseller/en-US/container/integrate-hourly) del *taller para AWS Marketplace vendedores*. 

**Topics**
+ [Requisitos previos de medición por hora](#hourly-metering-prereqs)
+ [Prueba de la integración para `RegisterUsage`](#testing-integration-for-registerusage)
+ [Control de errores para `RegisterUsage`](#hourly-metering-entitlement-error-handling)
+ [Integración de su producto de contenedor con el servicio de medición de AWS Marketplace mediante AWS SDK para Java](java-integration-example-registerusage.md)

## Requisitos previos de medición por hora
<a name="hourly-metering-prereqs"></a>

Antes de publicar el producto, debe hacer lo siguiente:

1. Cree un nuevo producto contenedor en el AWS Marketplace Management Portal y anote su código de producto.

   Para obtener más información, consulte [Descripción general: creación de un producto de contenedor](container-product-getting-started.md#create-container-product).

1. Utilice un rol AWS Identity and Access Management (IAM) para la tarea o el pod que ejecuta la aplicación con los permisos de IAM necesarios para realizar la llamada. `RegisterUsage` La política administrada de `AWSMarketplaceMeteringRegisterUsage` tiene estos permisos. Para obtener más información sobre la política, consulte la Referencia [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)de *políticas AWS gestionadas*.

1. (Opcional) Si desea ver el registro, le recomendamos que habilite el AWS CloudTrail registro en la definición de la tarea o el módulo.

1. Realice una llamada de prueba a la operación de API `RegisterUsage` con un registro para todas las dimensiones de precios que defina.

## Prueba de la integración para `RegisterUsage`
<a name="testing-integration-for-registerusage"></a>

Usa la operación de la `RegisterUsage` API para probar la integración antes de enviar la imagen AWS Marketplace para su publicación.

Llame `RegisterUsage` desde la imagen del contenedor ejecutando su producto en Amazon ECS o Amazon EKS. Usa la AWS cuenta en la que estás publicando el producto AWS Marketplace. Su integración de medición debe configurarlo de forma dinámica Región de AWS, en lugar de codificarlo de forma rígida. Sin embargo, al realizar las pruebas, lance al menos una tarea de Amazon ECS o un pod de Amazon EKS que contenga su contenedor de pago en la región del Este de EE. UU. (Virginia del Norte). De este modo, el equipo de AWS Marketplace operaciones puede verificar su trabajo con los registros de esa región.

**nota**  
Si el producto es compatible con Amazon ECS y con Amazon EKS, bastará con que realice el lanzamiento solo en Amazon EKS para que podamos validar la integración.

No puede probar totalmente la integración hasta que el producto se publique con todos los metadatos y la información de precios correspondiente. Si se solicita, el equipo de operaciones del AWS Marketplace catálogo puede verificar la recepción de sus registros de medición.

## Control de errores para `RegisterUsage`
<a name="hourly-metering-entitlement-error-handling"></a>

Si la imagen del contenedor se integra con el contenedor AWS Marketplace Metering Service y recibe una excepción que no sea `ThrottlingException` al arrancar el contenedor, debe cerrar el contenedor para evitar su uso no autorizado.

Las excepciones distintas de `ThrottlingException` se lanzan solo en la llamada inicial a la operación de API `RegisterUsage`. Las llamadas posteriores desde la misma tarea de Amazon ECS o pod de Amazon EKS no iniciarán la excepción `CustomerNotSubscribedException`, ni siquiera aunque el cliente cancele la suscripción mientras la tarea se está ejecutando. A estos clientes se les sigue cobrando la ejecución de los contenedores después de darse de baja y se realiza un seguimiento de su uso.

En la siguiente tabla se describen los errores que la operación de API `RegisterUsage` podrían lanzar. Cada lenguaje de programación del AWS SDK tiene un conjunto de pautas de gestión de errores que puedes consultar para obtener información adicional. 


|  **Error**  |  **Descripción**  | 
| --- | --- | 
|  InternalServiceErrorException  |  RegisterUsage no está disponible.  | 
|  CustomerNotEntitledException  |  El cliente no tiene una suscripción válida para el producto.  | 
|  InvalidProductCodeException  |  El valor de ProductCode que se pasa como parte de la solicitud no existe.  | 
|  InvalidPublicKeyException  |  El valor de PublicKeyVersion que se pasa como parte de la solicitud no existe.  | 
|  PlatformNotSupportedException  |  AWS Marketplace no admite la medición del uso de la plataforma subyacente. Solo se admiten Amazon ECS y AWS Fargate Amazon EKS.  | 
|  ThrottlingException  |  Las llamadas a RegisterUsage están restringidas.  | 
|  InvalidRegionException  |  RegisterUsagedebe llamarse de la misma manera en Región de AWS que se lanzó la tarea de Amazon ECS o el pod de Amazon EKS. Esto impide que un contenedor elija una región (por ejemplo, withRegion(“us-east-1”)) al llamar a RegisterUsage.  | 

# Integración de su producto de contenedor con el servicio de medición de AWS Marketplace mediante AWS SDK para Java
<a name="java-integration-example-registerusage"></a>

Puede utilizarla AWS SDK para Java para integrarse con el servicio de medición de AWS Marketplace. La medición continua del uso del software la gestiona automáticamente el. AWS Marketplace Metering Control Plane No es necesario que su software realice ninguna acción específica de medición, excepto llamar una vez a `RegisterUsage` para medir el uso del software para comenzar. En este tema se proporciona un ejemplo de implementación AWS SDK para Java que se utiliza para integrarse con la acción del [Servicio de AWS Marketplace`RegisterUsage` Medición](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html). 

Se debe llamar a `RegisterUsage` inmediatamente al momento de lanzar un contenedor. Si no registra el contenedor en las primeras 6 horas desde su lanzamiento, el servicio de medición de AWS Marketplace no ofrece ninguna garantía de medición respecto a los meses anteriores. Sin embargo, la medición continuará durante el mes en curso hasta que finalice el contenedor.

Para obtener el código fuente completo, consulte [RegisterUsage Ejemplo de Java](#registerusage-java-example). Muchos de estos pasos se aplican independientemente del idioma del AWS SDK. 



**Pasos de ejemplo para la integración del servicio de medición de AWS Marketplace**

1. Inicie sesión en el [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/tour).

1. En **Assets (Recursos)**, elija **Containers (Contenedores)** para comenzar a crear un nuevo producto de contenedor. Cuando se crea un producto, se genera un código para que dicho producto pueda integrarse con la imagen del contenedor. Para obtener más información sobre el establecimiento de permisos de IAM, consulte [AWS Marketplace permisos de API de medición y asignación de derechos](iam-user-policy-for-aws-marketplace-actions.md).

1.  Descargue el [AWS Java SDK](https://aws.amazon.com/sdk-for-java/) público. 
**importante**  
 Para llamar a la medición APIs desde Amazon EKS, debe [usar un AWS SDK compatible y ejecutarlo en un](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) clúster de Amazon EKS que ejecute Kubernetes 1.13 o una versión posterior. 

1.  (Opcional) Si se está integrando con la `RegisterUsage` acción y desea realizar una verificación de firma digital, debe configurar la biblioteca de verificación de [BouncyCastle](https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on)firmas en la ruta de clases de la aplicación.

   Si desea utilizar JSON Web Token (JWT), también debe incluir en la classpath de su aplicación las bibliotecas [JWT Java](https://jwt.io/). El uso de JWT proporciona un enfoque más sencillo para la verificación de firmas, pero no es obligatorio y, en su lugar, puede usarlo de forma independiente. BouncyCastle Tanto si utilizas JWT como si BouncyCastle necesitas usar un sistema de compilación como Maven para incluir las dependencias transitivas de JWT en la ruta de clases de BouncyCastle tu aplicación.

   ```
   // 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.  Llame a `RegisterUsage` desde cada imagen de contenedor de pago en su oferta de producto. `ProductCode` y `PublicKeyVersion` son parámetros obligatorios y el resto de las entradas son opcionales. A continuación, se muestra un ejemplo de carga para `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
   }
   ```
**nota**  
Es posible que se detecten problemas transitorios al conectarse al Servicio de medición de AWS Marketplace. AWS Marketplace recomienda encarecidamente implementar los reintentos durante un máximo de 30 minutos, con una reducción exponencial, para evitar interrupciones de corta duración o problemas de red.

1.  `RegisterUsage` genera un firma digital RSA-PSS con SHA-256 que puede utilizar para verificar la autenticidad de la solicitud. La firma incluye los siguientes campos: `ProductCode`, `PublicKeyVersion` y `Nonce`. Para verificar la firma digital, debe conservar estos campos de la solicitud. El siguiente código es una respuesta de ejemplo a una llamada a `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. Vuelva a crear una nueva versión de la imagen de contenedor que incluya la llamada a `RegisterUsage`, etiquete el contenedor y envíelo a cualquier registro de Docker que sea compatible con Amazon ECS o Amazon EKS, como Amazon ECR o Amazon ECR Public. Si utiliza Amazon ECR, asegúrese de que la cuenta que va a lanzar la tarea de Amazon ECS o el pod de Amazon EKS tiene permisos en el repositorio de Amazon ECR. De lo contrario, el lanzamiento devuelve un error.

1.  Cree un rol de [IAM](https://aws.amazon.com/iam/) que conceda permiso al contenedor para llamar a `RegisterUsage`, tal y como se define en el siguiente código. Debe proporcionar este rol de IAM en el parámetro [Rol de tarea](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) de la definición de la tarea de Amazon ECS o del pod de Amazon ECS.

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

****  

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

------

1. Cree una definición de tarea de Amazon ECS o de pod de Amazon EKS que haga referencia al contenedor que se ha integrado AWS Marketplace y haga referencia a la función de IAM que creó en el paso 7. Debe habilitar el AWS CloudTrail registro en la definición de la tarea si quiere ver el registro. 

1. Cree un clúster de Amazon ECS o Amazon EKS para ejecutar la tarea o el pod. Para obtener más información acerca de cómo crear un clúster de Amazon ECS, consulte [Creación de un clúster](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html) en la *Guía para desarrolladores de Amazon Elastic Container Service*. Para obtener más información acerca de la creación de un clúster de Amazon EKS (con Kubernetes versión 1.1.3.x o posterior), consulte [Creación de un clúster de Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html).

1. Configure el clúster de Amazon ECS o Amazon EKS y lance la definición de tareas de Amazon ECS o el pod de Amazon EKS que creó, en el us-east-1 Región de AWS. Es solo durante este proceso de prueba, antes de que el producto esté en funcionamiento, cuando debe utilizar esta región.

1. Cuando obtenga una respuesta válida de `RegisterUsage`, podrá comenzar a crear su producto de contenedor. Si tiene alguna pregunta, póngase en contacto con el equipo de [Operaciones de vendedores de AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/). 

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

En el siguiente ejemplo, se utiliza el servicio AWS SDK para Java and AWS Marketplace Metering para llamar a la `RegisterUsage` operación. La verificación de la firma es opcional, pero si desea realizarla, debe incluir las bibliotecas de verificación de firmas digitales necesarias. Este ejemplo solo tiene fines ilustrativos. 

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

# Configuración de medición personalizada para productos de contenedores con AWS Marketplace Metering Service
<a name="container-metering-meterusage"></a>

**nota**  
 Para las implementaciones de EKS, el software debe usar los [roles de IAM para las cuentas de servicio (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) a fin de firmar la llamada a la API para la operación de la API de [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). No se admite el uso de [EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), el rol de nodo ni las claves de acceso a largo plazo.  
En el caso de las implementaciones de ECS, el software debe utilizar el rol de [IAM de tareas de Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) a fin de firmar la llamada a la API para la operación de la API de [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). No se admite el uso del rol de nodo ni de claves de acceso a largo plazo.  
En el caso de las implementaciones AgentCore de Amazon Bedrock Runtime, el software debe utilizar la [función de ejecución en AgentCore tiempo de ejecución](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html#runtime-permissions-execution) para firmar la llamada a la API para la operación de la [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. No se admiten claves de acceso a largo plazo.

AWS Marketplace Los productos en contenedores pueden tener una medición personalizada en hasta 24 dimensiones de precios diferentes por producto. Cada dimensión puede tener asociada un precio de contrato a largo plazo. Para habilitar la medición personalizada, integre su producto de contenedor en el servicio de medición de AWS Marketplace. Puedes definir tus propias unidades de precios y una medición personalizada para ese uso o para la facturación mediante la operación de la [https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. AWS En las siguientes secciones se muestra cómo configurar la medición personalizada para el producto de contenedor.

Las dimensiones de los precios se definen en dos ubicaciones, una al crear el producto en el AWS Marketplace Management Portal (portal del vendedor) y otra en su software para realizar la operación de `MeterUsage`. Este método de dos factores garantiza que las ofertas posteriores funcionen según lo previsto antes de que se pongan a disposición del público.

Para configurar la medición personalizada, deberá elegir la categoría de uso, el tipo de unidad y las dimensiones de precios: 
+ **Categoría de uso**: la categoría de uso ayuda a los compradores a entender cuál es su producto y cómo usarlo. 
+ **Tipo de unidad**: el tipo de unidad define la unidad de medida para la facturación. Por ejemplo, el ancho de banda medido en GBps o MBps, el número de hosts o los datos medidos en MB, GB o TB.
+ **Dimensiones de precios**: las dimensiones de precios representan una función o servicio para el que has establecido un precio por unidad (por ejemplo, usuarios, escaneosCPUs, v o agentes desplegados). Las dimensiones de los precios son públicas. Sin embargo, aún puede definir ofertas privadas y de tipo Bring Your Own License (BYOL) para productos públicos. No envíe precios en los registros de medición. Usted mide la cantidad de unidades y la usamos junto con los precios que definió al crear su producto para calcular la factura del comprador. 

  Si los precios del producto no se ajustan a ninguna de las categorías o tipos de unidades predefinidos, puede elegir la categoría **Unidades** genérica. A continuación, utilice la descripción de la dimensión para describir qué es la unidad.

Si lo desea, puede distribuir el uso en las asignaciones por propiedades de las que realiza un seguimiento. Las asignaciones se representan como etiquetas para el comprador. Estas etiquetas permiten al comprador ver sus costes divididos por el uso y los valores de las etiquetas. Por ejemplo, si cobra por usuario y los usuarios tienen la propiedad “Departamento”, puede crear asignaciones de uso con etiquetas que tengan la clave "Departamento" y una asignación por valor. Esto no cambia el precio, las dimensiones ni el uso total que declara, pero permite a su cliente ver sus costes por categorías adecuadas a su producto.

Le recomendamos que envíe un registro de medición cada hora. Sin embargo, también puede agregar el uso a lo largo de periodos diarios o mensuales. Si experimenta una interrupción, puede agregar el uso del software del comprador y enviarlo en la medición de las horas siguientes. No puede enviar más de un registro por hora.

*Para obtener más información sobre cómo integrar la AWS Marketplace Metering Service API para productos en contenedores con los precios de medición personalizados, consulta el laboratorio de [integración con contadores personalizados](https://catalog.workshops.aws/mpseller/en-US/container/integrate-custom) del AWS Marketplace taller para vendedores.*

**importante**  
La versión de prueba gratuita y los derechos de prepago se registran cada hora. Por lo tanto, enviar estos registros por separado puede conllevar que se le cobre de más al comprador.

**Topics**
+ [Requisitos previos de medición personalizada](#custom-metering-prereqs)
+ [Probando la integración de `MeterUsage` para ECS y EKS](#testing-meterusage-integration)
+ [Probando la MeterUsage integración para AgentCore](#testing-agentcore-metering)
+ [Control de errores para `MeterUsage`](#custom-metering-entitlement-error-handling)
+ [(Opcional) Etiquetado medido por el vendedor](#container-vendor-metered-tagging)
+ [Ejemplo de código](#container-meter-code-example)
+ [Integrar su producto de contenedor mediante una medición personalizada con y AWS Marketplace Metering Service AWS SDK para Java](java-integration-example-meterusage.md)

## Requisitos previos de medición personalizada
<a name="custom-metering-prereqs"></a>

Antes de publicar el producto, debe hacer lo siguiente:

1. Cree un nuevo producto contenedor en el AWS Marketplace Management Portal y anote su código de producto.

1. Utilice un rol AWS Identity and Access Management (IAM) para la tarea, el pod o el terminal de tiempo de AgentCore ejecución que ejecuta la aplicación con los permisos de IAM necesarios para realizar la llamada. `MeterUsage` La política administrada de `AWSMarketplaceMeteringRegisterUsage` tiene estos permisos. Para obtener más información sobre la política, consulte la Referencia [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)de *políticas AWS administradas*.

1. (Opcional) Se recomienda activar el AWS CloudTrail registro en la definición de la tarea o del módulo si desea ver el registro.

1. Realice una llamada de prueba a la operación de API `MeterUsage` con un registro para todas las dimensiones de precios que defina.

## Probando la integración de `MeterUsage` para ECS y EKS
<a name="testing-meterusage-integration"></a>

Utilice la `MeterUsage` operación para probar la integración antes de enviar la imagen AWS Marketplace para su publicación.

Para llamar `MeterUsage` desde las imágenes del contenedor, ejecuta tu producto en Amazon Elastic Container Service (Amazon ECS) o Amazon Elastic Kubernetes Service (Amazon Cuenta de AWS EKS) con el que usas para publicar el producto. AWS Marketplace Su integración de medición debe configurarlo de forma dinámica Región de AWS, en lugar de codificarlo de forma rígida. Sin embargo, cuando realices las pruebas, lanza al menos una tarea de Amazon ECS o un pod de Amazon EKS que contenga tu contenedor de pago en la región EE.UU. Este (Virginia del Norte) para que el equipo de AWS Marketplace operaciones pueda verificar tu trabajo con los registros de esa región.

**nota**  
Si el producto es compatible con Amazon ECS y con Amazon EKS, bastará con que realice el lanzamiento solo en Amazon EKS para que podamos validar la integración.
Pruebe todas las dimensiones antes de lanzar el producto al público y después de añadir una nueva dimensión. Si no envía un registro de medición para cada dimensión asociada a un producto de contenedor, se producirá un error y la solicitud fallará.

No puede probar totalmente la integración hasta que el producto se publique con todos los metadatos y la información de precios correspondiente. Si lo solicita, el equipo de operaciones del AWS Marketplace catálogo puede verificar la recepción de sus registros de medición.

## Probando la MeterUsage integración para AgentCore
<a name="testing-agentcore-metering"></a>

Utilice la `MeterUsage` operación para probar la integración antes de enviar la imagen AWS Marketplace para su publicación.

Para llamar `MeterUsage` desde las imágenes del contenedor, ejecuta tu producto en Amazon Bedrock AgentCore con la AWS cuenta en la que publicaste el AWS Marketplace producto. Su integración de medición debe establecer la AWS región de forma dinámica, en lugar de codificarla de forma rígida. Sin embargo, cuando realices las pruebas, lanza al menos un AgentCore agente de Amazon Bedrock que contenga tu contenedor de pago en la región EE.UU. Este (Virginia del Norte) para que el equipo de AWS Marketplace operaciones pueda verificar tu trabajo con los registros de esa región. 

 No necesita agregar registros de uso por hora. Llame a `MeterUsage` en todas las invocaciones de agentes con el uso para esa invocación.

Debe usar la última versión publicada del AWS SDK para su idioma. Esto rellena automáticamente el parámetro de `ClientToken` con un valor generado de forma automática para ayudar con la idempotencia. Las versiones anteriores del SDK que no rellenen este campo no funcionarán para `MeterUsage` las llamadas desde Amazon Bedrock AgentCore. Debido a un problema de red, debe volver a utilizar exactamente la misma solicitud al volver a intentarlo. De este modo, se garantiza que las solicitudes se traten de forma idempotente.

Debido a las diferencias en el comportamiento de medición esperado entre Amazon Bedrock AgentCore y otros productos de contenedores, no recomendamos compartir la misma imagen de contenedor para usarla en Amazon Bedrock y AgentCore en Amazon ECS o EKS.

## Control de errores para `MeterUsage`
<a name="custom-metering-entitlement-error-handling"></a>

Llame a `MeterUsage` para establecer el parámetro de `DryRun` en verdadero al iniciar el contenedor para comprobar así que la integración de la medición funciona. Si su imagen de contenedor se integra con la operación `MeterUsage` y recibe una excepción que no sea `ThrottlingException` al arrancar el contenedor, debe finalizar el contenedor para evitar su uso no autorizado.

Las excepciones distintas de `ThrottlingException` se lanzan solo en la llamada inicial a `MeterUsage`. Las llamadas posteriores desde la misma tarea de Amazon ECS o desde el mismo pod de Amazon EKS o desde el mismo punto de conexión AgentCore Runtime no se generan`CustomerNotSubscribedException`, incluso si el cliente cancela la suscripción mientras la tarea o el pod aún están en ejecución. A estos clientes se les sigue cobrando la ejecución de los contenedores después de darse de baja y se realiza un seguimiento de su uso.

Consulte [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)la *referencia de la AWS Marketplace Metering Service API* para obtener descripciones detalladas de los errores más comunes. `MeterUsage` Cada lenguaje de programación del AWS SDK tiene un conjunto de pautas de gestión de errores que puedes consultar para obtener información adicional. 

## (Opcional) Etiquetado medido por el vendedor
<a name="container-vendor-metered-tagging"></a>

El etiquetado medido por el proveedor ayuda a los proveedores de software independientes (ISVs) a ofrecer al comprador una visión más detallada del uso que hacen del software y puede ayudarle a asignar los costes.

**nota**  
El etiquetado medido por el proveedor no es compatible con las solicitudes de medición de los productos de Amazon Bedrock. AgentCore 

Existen varias formas de etiquetar el uso del software de un comprador. Una consiste en preguntar primero a los compradores qué es lo que quieren ver en su asignación de costos. A continuación, puede dividir el uso entre las propiedades de las que haga un seguimiento para la cuenta del comprador. Entre los ejemplos de propiedades se incluyen `AccountId`, `Business Unit`, `Cost Centers` y otros metadatos relevantes para su producto. Estas propiedades se exponen al comprador en forma de etiquetas. Con las etiquetas, los compradores pueden ver sus costes divididos en consumo según los valores de las etiquetas en su consola de facturación (). AWS [https://console.aws.amazon.com/costmanagement/](https://console.aws.amazon.com/costmanagement/) El etiquetado medido por el proveedor no cambia el precio, las dimensiones ni el uso total que declara. Permite a sus clientes ver sus costes por categorías adecuadas a su producto.

En un caso de uso común, un comprador se suscribe a su producto con una Cuenta de AWS. El comprador también tiene varios usuarios asociados a la misma suscripción de producto. Puede crear asignaciones de uso con etiquetas que tengan una clave de `AccountId` y, a continuación, asignar el uso a cada usuario. En este caso, los compradores pueden activar la etiqueta `AccountId` en su consola de administración de costes y facturación, y analizar el uso individual de los usuarios.

### Experiencia del vendedor
<a name="container-vendor-metered-tag-seller"></a>

Los vendedores pueden agregar los registros de medición de los recursos con el mismo conjunto de etiquetas en lugar de agregar el uso de todos los recursos. Por ejemplo, los vendedores pueden crear un registro de medición que incluya diferentes buckets de `UsageAllocations`. Cada bucket representa la `UsageQuantity` para un conjunto de etiquetas, como `AccountId` y `BusinessUnit`. 

En el siguiente diagrama, **Recurso 1** tiene un conjunto único de etiquetas `AccountId` y `BusinessUnit`, y aparece en el **Registro de medición** como una entrada única. 

Tanto **Recurso 2** como **Recurso 3** tienen la misma etiqueta de `AccountId`, `2222`, y la misma etiqueta de `BusinessUnit`, `Operations`. Como resultado, se combinan en una sola entrada de `UsageAllocations` en el **Registro de medición**.

![\[Diagrama que muestra cómo las etiquetas de medición de los vendedores combinan los datos de uso. Tres recursos (los recursos 1, 2 y 3) BusinessUnits son diferentes AccountIds y se consolidan en un solo registro de medición UsageAllocations agrupados por AccountId y BusinessUnit antes de enviarlos al AWS Marketplace Metering Service.\]](http://docs.aws.amazon.com/es_es/marketplace/latest/userguide/images/seller-vendor-meter-tag.png)


Los vendedores también pueden combinar los recursos sin etiquetas en una sola `UsageAllocation` con la cantidad de uso asignada y enviarlos como una de las entradas en `UsageAllocations`.

Los límites incluyen:
+ Número de etiquetas: 5
+ Tamaño de `UsageAllocations` (cardinalidad): 2500

La validación incluye lo siguiente:
+ Se admiten caracteres para la clave y el valor de la etiqueta: 0-9\$1 -= a-zA-Z . \$1:\$1 /@
+ Número máximo de etiquetas en la lista de `UsageAllocation`: 5
+ Dos `UsageAllocations` no pueden tener las mismas etiquetas (es decir, la misma combinación de claves y valores de etiqueta). Si ese es el caso, deben usar la misma `UsageAllocation`.
+ La suma de `AllocatedUsageQuantity` de `UsageAllocation` debe ser igual a `UsageQuantity`, que es el uso agregado.

### Experiencia del comprador
<a name="container-vendor-metered-tag-buyer"></a>

En la siguiente tabla se muestra un ejemplo de la experiencia del comprador después de activar las etiquetas de proveedor `AccountId` y `BusinessUnit`. 

En este ejemplo, el comprador puede ver el uso asignado en su **Informe de uso de costes**. Las etiquetas medidas por el proveedor utilizan el prefijo `“aws:marketplace:isv”`. Los compradores pueden activarlas en la consola de administración de costes y facturación, en **Etiquetas de asignación de costes**, **Etiquetas de asignación de costes generadas por AWS**.

La primera y la última fila del **Informe de uso de costes** son relevantes para lo que el vendedor envía al servicio de medición (como se muestra en el ejemplo [Experiencia del vendedor](#container-vendor-metered-tag-seller)).


**Informe de uso de costes (simplificado)**  

| ProductCode  | Comprador | UsageDimension | UsageQuantity | `aws:marketplace:isv:AccountId ` | `aws:marketplace:isv:BusinessUnit` | 
| --- | --- | --- | --- | --- | --- | 
| xyz | 111122223333 | Red: por (GB) inspeccionado  | 70 | 2222 | Operaciones | 
| xyz | 111122223333 | Red: por (GB) inspeccionado  | 30 | 3333 | Finanzas | 
| xyz | 111122223333 | Red: por (GB) inspeccionado  | 20 | 4444 | TI | 
| xyz | 111122223333 | Red: por (GB) inspeccionado  | 20 | 5555 | Marketing | 
| xyz | 111122223333 | Red: por (GB) inspeccionado  | 30 | 1111 | Marketing | 

Para ver un ejemplo del código, consulte [Ejemplo de código de `MeterUsage` con etiquetado de asignación de uso (opcional)](#container-meterusage-code-example).

## Ejemplo de código
<a name="container-meter-code-example"></a>

El siguiente ejemplo de código se proporciona para ayudarlo a integrar su producto contenedor con lo AWS Marketplace APIs necesario para la publicación y el mantenimiento de su producto.

### Ejemplo de código de `MeterUsage` con etiquetado de asignación de uso (opcional)
<a name="container-meterusage-code-example"></a>

El siguiente ejemplo de código es relevante para los productos de contenedor con modelos de precio por consumo. El ejemplo de Python envía un registro de medición con las etiquetas de asignación de uso adecuadas AWS Marketplace para cobrar pay-as-you-go las tarifas a sus clientes.

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

Para obtener más información al respecto`MeterUsage`, consulta [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)la *referencia de la AWS Marketplace Metering Service API*.

### Ejemplo de respuesta
<a name="container-meterusage-code-response"></a>

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

# Integrar su producto de contenedor mediante una medición personalizada con y AWS Marketplace Metering Service AWS SDK para Java
<a name="java-integration-example-meterusage"></a>

AWS Marketplace Los productos en contenedores pueden tener una medición personalizada en hasta 24 dimensiones de precios diferentes por producto. Para habilitar la medición personalizada, integre el producto de contenedor en el AWS Marketplace Metering Service. Puede definir sus propias unidades de precios y una medición personalizada para ese uso de AWS para facturar mediante la operación de API [https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html). El siguiente ejemplo describe una implementación que utiliza la AWS SDK para Java para integrarse con la operación del [servicio `MeterUsage` de AWS Marketplace medición](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html). 

Para ver todos los detalles, consulte [Ejemplos de Java `MeterUsage`](#meterusage-java-example). Muchos de los siguientes pasos se aplican independientemente del lenguaje. 

**Ejemplo: integración del AWS Marketplace servicio de medición**

1. Inicie sesión en la [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/tour).

1. En **Recursos**, elija **Contenedores** para comenzar a crear un nuevo producto de contenedor. Cuando se crea un producto, se genera un código para que dicho producto pueda integrarse con la imagen del contenedor. Para obtener información sobre cómo configurar los permisos AWS Identity and Access Management (IAM), consulte. [AWS Marketplace permisos de API de medición y asignación de derechos](iam-user-policy-for-aws-marketplace-actions.md)

1.  Descargue el [AWS Java SDK](https://aws.amazon.com/sdk-for-java/) público. 
**importante**  
 Para llamar a las operaciones de la API de medición desde Amazon Elastic Kubernetes Service (Amazon EKS), [debe usar un SDK](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) de AWS compatible y ejecutarlo en un clúster de Amazon EKS que ejecute Kubernetes 1.13 o una versión posterior. 

1. Llame la acción de `MeterUsage` desde la tarea o pod una vez cada hora para el uso de cada dimensión. La operación de la API acepta un registro de medición para una combinación única de `Dimension`, `Resource` y `Hour`. El recurso es una tarea de Amazon Elastic Container Service (Amazon ECS) o un pod de 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.
   }
   ```
**nota**  
Es posible detectar problemas transitorios al conectarse al. AWS Marketplace Metering Service AWS Marketplace recomienda encarecidamente implementar los reintentos durante un máximo de 30 minutos, con una reducción exponencial, para evitar interrupciones a corto plazo o problemas de red.

1. Vuelva a crear una nueva versión de la imagen de contenedor que incluya la llamada a `MeterUsage`, etiquete el contenedor y envíelo a cualquier registro de Docker que sea compatible con Amazon ECS o Amazon EKS, como Amazon Elastic Container Registry (Amazon ECR). Si utiliza Amazon ECR, asegúrese de que la cuenta que va a lanzar la tarea de Amazon ECS o el pod de Amazon EKS tiene permisos en el repositorio de Amazon ECR. De lo contrario, la operación no se llevará a cabo correctamente.

1. Cree un rol de [IAM](https://aws.amazon.com/iam/) que conceda permiso al contenedor para llamar a `MeterUsage`, tal y como se define en el siguiente ejemplo de código. Debe proporcionar esta función AWS Identity and Access Management (IAM) en el parámetro [Función de tarea](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) de la definición de la tarea de Amazon ECS o del pod de Amazon EKS.

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

****  

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

------

1. Cree una definición de tarea de Amazon ECS o de pod de Amazon EKS que haga referencia al contenedor que se ha integrado AWS Marketplace y haga referencia a la función de IAM que creó en el paso 6. Si desea ver el registro, active el AWS CloudTrail registro en la definición de la tarea. 

1. Cree un clúster de Amazon ECS o Amazon EKS para ejecutar la tarea o el pod. Para obtener más información acerca de cómo crear un clúster de Amazon ECS, consulte [Creación de un clúster](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html) en la *Guía para desarrolladores de Amazon Elastic Container Service*. Para obtener más información acerca de la creación de un clúster de Amazon EKS (con Kubernetes versión 1.1.3.x o posterior), consulte [Creación de un clúster de Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html).

1. Configure el clúster de Amazon ECS o Amazon EKS y lance la definición de tareas de Amazon ECS o el pod de Amazon EKS que creó en el paso 8, en la región AWS us-east-1. Es solo durante este proceso de prueba, antes de que el producto esté en funcionamiento, cuando debe utilizar esta región.

1. Cuando reciba una respuesta válida de `MeterUsage` para cada una de las dimensiones que se publican para el producto, puede comenzar a crear el producto contenedor. Si tiene alguna pregunta, póngase en contacto con el equipo de [Operaciones de vendedores de AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/). 

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

Los siguientes ejemplos de código utilizan AWS Marketplace Metering Service para llamar a la `MeterUsage` operación. AWS SDK para Java 

El siguiente código de ejemplo realiza llamadas a la operación de `MeterUsage` sin ningún `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);
    }
}
```

El siguiente código de ejemplo realiza llamadas a la operación de `MeterUsage` con `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();
    }
```

# Contrata los precios de los productos en contenedores con AWS License Manager
<a name="container-license-manager-integration"></a>

En el caso de los productos basados en contenedores con precios por contrato, puede utilizarlos AWS License Manager para asociar licencias a su producto. AWS License Manager es una herramienta de administración de licencias que permite a su aplicación realizar un seguimiento y actualizar las licencias (también conocidas como derechos) que haya adquirido un cliente. En esta sección se proporciona información sobre cómo integrar su producto con. AWS License Manager Una vez completada la integración, puede publicar su listado de productos en AWS Marketplace.

Si va a integrar License Manager con un AWS Marketplace producto de Containers Anywhere para Amazon EKS Anywhere, Amazon ECS Anywhere, Amazon Elastic Compute Cloud (Amazon EC2) o una infraestructura local, siga las instrucciones que se indican en. [Integración de una versión AWS Marketplace para Containers Anywhere con License Manager](container-anywhere-license-manager-integration.md)

Para obtener más información al respecto AWS License Manager, consulte la [Guía del AWS License Manager usuario](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) y la [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)sección de la Referencia de *AWS CLI comandos*.

Para obtener más información sobre la integración AWS License Manager con productos de contenedores con precios contractuales, consulta el laboratorio de [integración con pagos anticipados](https://catalog.workshops.aws/mpseller/en-US/container/integrate-contract) del *taller para AWS Marketplace vendedores*.

**Topics**
+ [Precios contractuales para productos de contenedores](#container-contracts)
+ [Modelos de licencia](#container-LM-license-models)
+ [AWS License Manager requisitos previos de integración](#container-LM-prereqs)
+ [Integración de un producto de contenedor en License Manager](#container-integrate-with-LM)
+ [Operaciones de API del License Manager](#container-LM-API-calls)
+ [Renovaciones y actualizaciones de licencias](#container-LM-lic-renew-upgrade)
+ [Integración de una versión AWS Marketplace para Containers Anywhere con License Manager](container-anywhere-license-manager-integration.md)

## Precios contractuales para productos de contenedores
<a name="container-contracts"></a>

En el caso de los productos basados en contenedores con precios contractuales, AWS Marketplace facture a sus clientes por adelantado o según el calendario de pagos que usted defina, en función del contrato entre usted y su cliente. Desde ese momento, tienen derecho a utilizar esos recursos. 

Para fijar sus precios, elija una o más duraciones de contrato que ofrezca a los clientes. Puede introducir precios diferentes para cada duración de contrato. Sus opciones son duraciones de 1 mes, 12 meses, 24 meses y 36 meses. En el caso de las ofertas privadas, puede especificar una duración personalizada en meses (hasta 60 meses). 

Elija la categoría que mejor describa los precios de su producto. Los clientes pueden ver la categoría de precios en el sitio web. AWS Marketplace Puede elegir entre **ancho de banda** (GB/s, MB/s), **datos** (GB, MB, TB), **hosts**, **solicitudes**, **niveles** o **usuarios**. Si ninguna de las categorías predefinidas se ajusta a sus necesidades, puede elegir la categoría más genérica **unidades** . 

La oferta permite agregar hasta 24 dimensiones.


**Ejemplo: aplicación de almacenamiento de datos**  

|   | Precio de 1 mes | Precio de 12 meses  | Precio de 24 meses  | Precio de 36 meses  | 
| --- | --- | --- | --- | --- | 
|  Datos no cifrados (GB)  |  1,50 USD/GB  |  16,00 USD/GB  |  30,00 USD/GB  |  60,00 USD/GB  | 
|  Datos cifrados (GB)  |  1,55 USD/GB  |  16,60 USD/GB  |  31,20 USD/GB  |  61,20 USD/GB  | 


**Ejemplo: Producto de monitorización de registros**  

|   | Precio de 1 mes | Precio de 12 meses  | Precio de 24 meses | Precio de 36 meses | 
| --- | --- | --- | --- | --- | 
|  Básico (10 hosts supervisados, 5 contenedores supervisados)  |  100 USD  |  1.000 \$1  | 2.000 \$1  | 4.000 \$1 | 
|  Estándar (20 hosts supervisados, 10 contenedores supervisados)  |  \$1200  |  2.000 \$1  | 4.000 \$1  | 8000\$1 | 
|  Profesional (40 hosts supervisados, 20 contenedores supervisados)  |  400 \$1  |  4.000 \$1  | 8000 DÓLARES  | 16.000 DÓLARES | 
|  Hosts adicionales supervisados por hora  | 10 DÓLARES  | 100 USD  |  \$1200 | 400 \$1 | 
|  Contenedores adicionales supervisados por hora  | 10\$1  | 100 USD  |  \$1200 | 400 \$1 | 

**nota**  
Los precios pueden ser para las siguientes duraciones: 1 mes, 12 meses, 24 meses o 36 meses. Puedes optar por ofrecer una o varias de estas opciones para el producto. Las duraciones deben ser las mismas en cada dimensión.   

**Example**  
Por ejemplo, en el caso de que tengas `AdminUsers` dimensiones `ReadOnlyUsers` y dimensiones, si ofreces un precio anual ReadOnlyUsers`AdminUsers`, también debes ofrecer un precio anual.


### Renovaciones automáticas
<a name="ami-contracts-automatic-renewals"></a>

 Cuando los clientes compren tu producto AWS Marketplace mediante contratos de contenedores, pueden aceptar renovar automáticamente las condiciones del contrato. Los clientes siguen pagando los derechos cada mes o durante 1, 2 o 3 años. 

Los clientes pueden cambiar su configuración de renovación en cualquier momento. Para obtener más información, consulte [Modificación de un contrato existente](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-container-contracts.html#modify-existing-contract) en la *Guía del comprador de AWS Marketplace *.

## Modelos de licencia
<a name="container-LM-license-models"></a>

AWS Marketplace la integración AWS License Manager admite dos modelos de licencia:
+ [Modelo de licencia configurable](#container-LM-config-lic-model)
+ [Modelo de licencia por niveles](#container-LM-tiered-lic-model)

### Modelo de licencia configurable
<a name="container-LM-config-lic-model"></a>

El modelo de licencia configurable (también conocido como modelo de licencia cuantificable) da derecho al comprador a una cantidad específica de recursos una vez que haya adquirido una licencia. 

Establezca una dimensión de precios y un precio por unidad. A continuación, el comprador puede elegir la cantidad de recursos que quiere comprar.

**Example de dimensión del precio y del precio por unidad**  
Puede establecer una dimensión de precios (como la copia de seguridad de datos) y un precio por unidad (por ejemplo, 30 USD por unidad).  
El comprador puede elegir entre comprar 5, 10 o 20 unidades.   
Su producto rastrea y mide el uso para medir la cantidad de recursos consumidos.

Con el modelo de configuración, los derechos se cuentan de una de estas dos maneras:
+ [Licencias reducidas](#container-floating-lic)
+ [Licencias flotantes](#container-floating-lic) 

#### Licencia reducidas
<a name="container-drawndown-lic"></a>

 La licencia se extrae del conjunto de licencias permitidas en el momento de su uso. Ese derecho se retira de forma permanente y no se puede devolver al conjunto de licencias.

**Example de procesamiento una cantidad limitada de datos**  
Un usuario tiene derecho a procesar 500 GB de datos. A medida que se siguen procesando los datos, la cantidad se extrae del conjunto de 500 GB hasta que se consuman todas las licencias de 500 GB.

En el caso de las licencias reducibles, puede utilizar la operación de API `CheckoutLicense` para comprobar las unidades de licencia (derechos) que se consumen. 

**Example de respaldo en Amazon S3 durante un número de unidades/año**  
Tiene un producto de almacenamiento que permite realizar copias de seguridad en Amazon Simple Storage Service de hasta 1024 unidades de datos durante un año. Puede lanzar su aplicación mediante varias instancias de Amazon EC2. Su aplicación tiene un mecanismo para rastrear y agregar datos. El software ejecuta la operación de API `CheckoutLicense` con el identificador del producto en cada copia de seguridad o a intervalos fijos para actualizar las cantidades consumidas.   
En este ejemplo, el software llama a la operación de API `CheckoutLicense` para comprobar 10 unidades de datos. Cuando la capacidad total alcanza el límite de copias de seguridad que el cliente ha adquirido, se produce un error en la llamada a la API.

**Solicitud**

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

**Respuesta**

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

#### Licencias flotantes
<a name="container-floating-lic"></a>

 La licencia se devuelve al conjunto de la cantidad permitida de licencias después de su uso.

En el caso de las licencias flotantes, la aplicación retira los derechos del conjunto de derechos mediante la operación de API `CheckoutLicense` cuando se utiliza el recurso. La respuesta de la operación de API `CheckoutLicense` incluye un token de consumo de licencias, que es un identificador único para el proceso de compra. El token de consumo de la licencia se puede utilizar para realizar acciones adicionales con respecto a los derechos retirados, como reintegrarlos en la licencia o prolongar el proceso de retirada.

Para reintegrar los derechos en el conjunto, use la operación de API `CheckInLicense` cuando el recurso ya no esté en uso.

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

Si no se registra el derecho (en caso de que la aplicación se bloquee), el derecho se reintegra automáticamente en el conjunto después de 60 minutos. Si el recurso se usa durante más de 60 minutos, se recomienda mantener el derecho excluido del conjunto mediante la operación de API `ExtendLicenseConsumption` mientras se utilice el recurso.

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

**Example de número de usuarios a partir de un límite superior fijo**  
Un usuario tiene derecho a 500 usuarios simultáneos en la aplicación. A medida que los usuarios inician y cierran sesión, los usuarios se retiran y devuelven al grupo de 500 usuarios. Sin embargo, la aplicación no puede retirar más de 500 usuarios del grupo porque el límite máximo fijado es 500 usuarios simultáneos.

En el caso de derechos variables, puede utilizar la operación de API `CheckInLicense` para devolver las unidades de licencia al conjunto de derechos. 

**Example de número de usuarios simultáneos durante un año**  
El precio de su producto se basa en la cantidad de usuarios simultáneos. El cliente adquiere una licencia para 10 usuarios durante un año. El cliente lanza el software proporcionando permisos (de IAM) de AWS Identity and Access Management . Cuando un usuario inicia sesión, la aplicación llama a la operación de API `CheckoutLicense` para reducir la cantidad en 1. Cuando el usuario cierra sesión, la aplicación devuelve la licencia al conjunto mediante una llamada a la operación de API `CheckInLicense`. Si no llama a `CheckInLicense`, la unidad de licencia se registrará automáticamente después de 1 hora.

**nota**  
En la siguiente solicitud, `key-fingerprint` no es un valor de marcador de posición, sino de valor real de la huella digital con la que se publicarán todas las licencias.

**Solicitud**

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

**Respuesta**

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

### Modelo de licencia por niveles
<a name="container-LM-tiered-lic-model"></a>

El modelo de licencia por niveles da derecho al comprador a un nivel o nivel específico de características de la aplicación una vez que el comprador haya adquirido una licencia. 

Puede crear niveles para su producto, como Básico, Intermedio y Premium. A continuación, el comprador selecciona uno de los niveles predefinidos.

La aplicación no necesita rastrear ni medir el uso de la aplicación.

Con el modelo de licencia por niveles, los derechos no se cuentan, sino que representan un nivel de servicio adquirido por el cliente. 

Si desea ofrecer funciones agrupadas, es preferible utilizar niveles. 

**Example de los niveles Básico, Intermedio y Premium**  
Un cliente puede firmar un contrato para uno de los tres niveles posibles del software: Básico, Intermedio o Premium. Cada uno de estos niveles tiene sus propios precios. El software puede identificar el nivel al que se ha registrado el cliente invocando la operación de API `CheckoutLicense` y especificando todos los niveles posibles en la solicitud.   
La respuesta a la solicitud contiene el derecho correspondiente al nivel que el cliente ha adquirido. En función de esta información, el software puede proporcionar la experiencia de cliente adecuada.

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

#### Respuesta
<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 requisitos previos de integración
<a name="container-LM-prereqs"></a>

Antes de publicar el producto, debe hacer lo siguiente:

1. Cree un nuevo producto contenedor en el AWS Marketplace Management Portal y anote su código de producto.

   Para obtener más información, consulte [Descripción general: creación de un producto de contenedor](container-product-getting-started.md#create-container-product).

1. Utilice un rol de IAM para la tarea o pod que ejecuta la aplicación con los permisos de IAM necesarios para llamar a las operaciones de API `CheckoutLicense`, `ExtendLicenseConsumption` y `CheckInLicense`.

   Los permisos de IAM necesarios se detallan en la siguiente política de IAM.

------
#### [ 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. Realice una llamada de prueba a la operación de API `RegisterUsage` con un registro para todas las dimensiones de precios que defina.

## Integración de un producto de contenedor en License Manager
<a name="container-integrate-with-LM"></a>

**Para integrar su producto basado en contenedores en License Manager**

1. Configure los permisos de IAM para llamar a License Manager. Para obtener más información, consulte [AWS License Manager requisitos previos de integración](#container-LM-prereqs).

1. Descarga el AWS SDK.
**nota**  
No configure AWS las credenciales en su software. AWS las credenciales del comprador se obtienen automáticamente en tiempo de ejecución cuando el contenedor se ejecuta en una instancia de Amazon EC2, una tarea de Amazon ECS o un pod de Amazon EKS.

1. Agregue comprobaciones de licencia a su producto.

   Su producto puede ejecutar la operación de API `CheckoutLicense` en cualquier lugar donde deba realizarse la verificación de la licencia. Para comprobar la licencia, el producto debe saber:

   1. El emisor de confianza de la licencia (AWS Marketplace).

   1. El SKU (ID del producto) del producto de la aplicación

   1. El derecho a comprobar la existencia de esta solicitud

   Las llamadas a la API varían según el tipo de licencias de precios que configure.

1. Publica tu listado de productos en. AWS Marketplace

## Operaciones de API del License Manager
<a name="container-LM-API-calls"></a>

Para administrar las licencias almacenadas en la cuenta de License Manager del cliente, el software puede utilizar las siguientes operaciones de API:
+ `GetLicense`: una API que el software puede consultar. Recupera el estado de una licencia comprada (es decir, vencida o que vence pronto) y envía una notificación de estado al cliente.
+ `CheckoutLicense`: descubre las licencias que el usuario ha adquirido. También puede utilizar la operación de API `CheckoutLicense` para actualizar la cantidad de licencias cuando el usuario haya consumido cierta cantidad de licencias. Con `CheckoutLicense`, puede seguir comprobando las cantidades de licencias que utiliza el cliente. Cuando el cliente agota todas las licencias, esta llamada devuelve un error. Para obtener información sobre la cadencia de ejecución sugerida para ejecutar `CheckoutLicense`, consulte [Renovaciones y actualizaciones de licencias](#container-LM-lic-renew-upgrade).
+ `ExtendLicenseConsumption`: en el caso de dimensiones flotantes, cuando el software retire una licencia, la licencia volverá al conjunto automáticamente transcurridos 60 minutos. Si desea prolongar el tiempo que la licencia permanece retirada, utilice la operación de API `ExtendLicenseConsumption` para ampliarla otros 60 minutos.
+ `CheckInLicense`: en el caso de dimensiones flotantes, cuando desee devolver la licencia al conjunto de derechos, utilice la operación de API `CheckInLicense`.
+ API de `ListReceivedLicenses`: muestra las licencias adquiridas por el comprador.

## Renovaciones y actualizaciones de licencias
<a name="container-LM-lic-renew-upgrade"></a>

Los clientes pueden renovar o actualizar sus licencias en el AWS Marketplace Management Portal. Tras realizar una compra adicional, AWS Marketplace genera una nueva versión de la licencia que refleja los nuevos derechos. El software lee los nuevos derechos mediante las mismas operaciones de API. No tiene que hacer nada diferente en términos de integración de License Manager para administrar las renovaciones y actualizaciones.

Debido a las renovaciones, actualizaciones, vencimientos, etc. de licencias, le recomendamos que su producto ejecute la operación de API `CheckoutLicense` con regularidad mientras esté en uso. Si utiliza la operación de API `CheckoutLicense` de forma regular, el producto puede detectar cambios en los derechos, como las actualizaciones o el vencimiento.

Te recomendamos que realices la llamada a la API `CheckoutLicense` cada 15 minutos. 

# Integración de una versión AWS Marketplace para Containers Anywhere con License Manager
<a name="container-anywhere-license-manager-integration"></a>

Como AWS Marketplace vendedor, puede realizar la integración AWS License Manager con un AWS Marketplace producto de Containers Anywhere para Amazon EKS Anywhere, Amazon ECS Anywhere, Amazon EC2 o una infraestructura local. Las siguientes secciones proporcionan instrucciones para esta integración.

Para obtener información general sobre la integración de License Manager con AWS Marketplace, incluidos los modelos de licencia disponibles, consulte[Contrata los precios de los productos en contenedores con AWS License Manager](container-license-manager-integration.md). Para obtener más información sobre AWS License Manager, consulte la [Guía del usuario de AWS License Manager](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) y la sección [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html) de la *Referencia de comandos de la AWS CLI *.

**Topics**
+ [Integración de un producto AWS Marketplace de for Containers Anywhere con License Manager](#containers-anywhere-integrate-with-LM)
+ [Prueba de la integración de License Manager localmente](#container-testing-LM-integration-locally)
+ [Prueba de la integración de License Manager en Amazon EKS](#container-testing-LM-integration-EKS)
+ [Derechos de licencias flotantes con License Manager](#container-LM-floating-license)
+ [Prácticas recomendadas para la integración en License Manager para implementaciones en las instalaciones](#container-LM-best-practices-on-prem)
+ [`LicenseManagerCredentialsProvider`: implementación de Java](#container-license-manager-cred-provider-java)
+ [`LicenseManagerCredentialsProvider`: implementación de `Golang`](#container-license-manager-cred-provider-golang)

## Integración de un producto AWS Marketplace de for Containers Anywhere con License Manager
<a name="containers-anywhere-integrate-with-LM"></a>

Siga las siguientes instrucciones para integrar su AWS Marketplace producto de Containers Anywhere con AWS License Manager.

**Para integrar su AWS Marketplace producto de Containers Anywhere con License Manager**

1. Abra un navegador web e inicie sesión en [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

1. Cree un ID de producto para su producto de contenedor realizando los siguientes pasos. Utilizará este ID en su imagen del contenedor para comprobar las licencias en un paso posterior.

   1. En la barra de menús, expanda **Recursos** y elija **Contenedor**.

   1. Introduzca un nombre orientado al cliente para su producto y elija **Crear**. Puede cambiar este nombre posteriormente.

   1. Anote el **ID del proyecto**. Lo usará al crear o actualizar los detalles de precios del producto.
**sugerencia**  
Si pierde el identificador de su producto, puede encontrarlo AWS Marketplace Management Portal seleccionando **Container** en el menú **Activos**. La página **Contenedores** muestra una lista de tus productos con el producto asociado IDs.

1. Descarga el último AWS SDK público y, a continuación, instálalo en tu aplicación contenedora. Encontrará las instrucciones de instalación del AWS SDK que prefiera en [Tools to Build on AWS](https://aws.amazon.com/tools/).
**nota**  
Para llamar a las operaciones de la API de License Manager desde Amazon EKS Anywhere o desde un clúster de Kubernetes no proporcionado por AWS, debe usar un SDK compatible. AWS Para ver una lista de los compatibles AWS SDKs, consulte [Uso de un SDK](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) compatible. AWS 

1. Cree un AWS License Manager cliente con un proveedor de credenciales personalizado para que pueda proporcionar credenciales a la aplicación contenedora implementada tanto en las instalaciones AWS como en las instalaciones. Para ver el código fuente completo de un proveedor de credenciales personalizado, `LicenseCredentialProvider`, consulte las siguientes secciones:
   + [`LicenseManagerCredentialsProvider`: implementación de Java](#container-license-manager-cred-provider-java)
   + [`LicenseManagerCredentialsProvider`: implementación de `Golang`](#container-license-manager-cred-provider-golang)

    `LicenseCredentialsProvider`amplía la cadena de proveedores de credenciales predeterminada del AWS SDK para su uso local mediante la adición de. `LicenseManagerTokenCredentialsProvider` Esta acción proporciona credenciales mediante el uso de tokens de identidad emitidos por el OIDC de License Manager en entornos locales. Debe incluir el código fuente para `LicenseCredentialsProvider` en la ruta de clases de su aplicación.
**nota**  
Ampliar el `DefaultCredentialsProvider` permite que la misma aplicación contenedora obtenga credenciales cuando se ejecuta en un entorno local AWS y cuando se ejecuta en él. Si la aplicación de contenedor ya usa una cadena de proveedores de credenciales personalizada en lugar de la predeterminada, también se puede ampliar agregando `LicenseManagerTokenCredentialsProvider` a la cadena personalizada.

   El siguiente fragmento de código es un ejemplo de cómo crear un AWS License Manager cliente con Java.

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

1. Llame a la operación de API `CheckoutLicense` mediante el comando `aws license-manager checkout-license` de cada imagen de contenedor de pago de su oferta de productos. Esto comprueba que el comprador tiene derecho a utilizar una licencia para su aplicación. Si el comprador tiene derecho a la solicitud, `CheckoutLicense` acepta y devuelve los derechos solicitados y sus valores. Si el comprador no tiene derecho a la solicitud, `CheckoutLicense` arroja una excepción.

   Se requieren los siguientes parámetros para llamar a la operación de API `CheckoutLicense`:
   + `CheckoutType`: los valores válidos son `PROVISIONAL` o `PERPETUAL`:
     + Use `PERPETUAL` cuando se agote la cantidad de derechos retirados del conjunto.

       Ejemplo: el comprador tiene derecho a procesar 500 GB de datos. A medida que continúa procesando los datos, la cantidad se descuenta y se agota del conjunto de 500 GB.
     + Utilice `PROVISIONAL` para derechos de licencia flotantes, en los que los derechos se retiran del conjunto y se devuelven después de su uso.

       Ejemplo: el usuario tiene derecho a 500 usuarios simultáneos en la aplicación. A medida que los usuarios inician o cierran sesión, los usuarios son descontados o devueltos al grupo de 500 usuarios. Para obtener más información sobre los derechos de licencia flotantes, consulte [Derechos de licencias flotantes con License Manager](#container-LM-floating-license).
   + `ClientToken`: un identificador único que distingue entre mayúsculas y minúsculas. Recomendamos usar un UUID aleatorio para cada solicitud única.
   + `Entitlements`: una lista de derechos para retirar.
     + En el caso de derechos de características, proporcione las propiedades `Name` y `Unit` como se indica a continuación.

       ```
       {
         "Name": "<Entitlement_Name>",
         "Unit": "None"
       }
       ```
     + Para los derechos contados, proporcione las propiedades `Name`, `Unit` y `Count` de la siguiente manera.

       ```
       {
         "Name": "<Entitlement_Name>",
         "Unit": "<Entitlement_Unit>",
         "Value": <Desired_Count>
       }
       ```
   + `KeyFingerprint`: la huella digital clave de las licencias emitidas por AWS Marketplace es `aws:294406891311:AWS/Marketplace:issuer-fingerprint`. El uso de esta huella digital clave garantiza que la licencia sea emitida por una entidad poco fiable AWS Marketplace y no por ella.
   + `ProductSKU`— El identificador del producto generado AWS Marketplace Management Portal en los pasos anteriores.

   El siguiente fragmento es un ejemplo de una llamada que utiliza la operación de API `CheckoutLicense` mediante la 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"
   ```
**nota**  
Para comprobar las licencias, las aplicaciones de contenedor requieren acceso a la red saliente para poder utilizar License Manager. Es posible que las aplicaciones implementadas en las instalaciones experimenten un acceso lento o poco fiable a la red saliente. Estas aplicaciones deben incluir los reintentos adecuados al llamar a License Manager. Para obtener más información, consulte [Prácticas recomendadas para la integración en License Manager para implementaciones en las instalaciones](#container-LM-best-practices-on-prem).

1. Llame a la operación de API `CheckoutLicense` con regularidad para identificar cualquier cambio en las licencias de los clientes debido a renovaciones, actualizaciones o cancelaciones realizadas en AWS Marketplace. La cadencia depende de la aplicación. Recomendamos comprobar las licencias una vez al día para detectar los cambios automáticamente sin la intervención del comprador.

   Es posible que una aplicación implementada en las instalaciones tenga un acceso a la red saliente poco fiable para comprobar las licencias con regularidad. En esos casos, la aplicación debe utilizar licencias almacenadas en caché para garantizar una resiliencia suficiente. Para obtener más información, consulte [Prácticas recomendadas para la integración en License Manager para implementaciones en las instalaciones](#container-LM-best-practices-on-prem).

1. Tras integrar la llamada a `CheckoutLicense` en la aplicación de contenedor, cree una nueva versión de la imagen del contenedor de Docker con los cambios.

1. Actualice el diagrama de Helm de su aplicación para aceptar un secreto de Kubernetes como entrada opcional que contenga la configuración para acceder a las licencias mediante License Manager. APIs El secreto de configuración contendrá un token de identidad emitido por License Manager y un AWS Identity and Access Management rol que utilizará el proveedor de credenciales personalizadas descrito anteriormente para obtener AWS credenciales para llamar a License Manager APIs cuando la aplicación contenedora se despliegue localmente. Además, agregue la Región de AWS como entrada con un valor predeterminado de `us-east-1`.

   Los compradores que desplieguen la aplicación contenedora de forma local pueden crear el secreto de Kubernetes a través de la AWS Marketplace experiencia de compra de productos en contenedores. Proporcione el nombre del secreto de Kubernetes como entrada al comando `helm install`. El secreto de configuración se configura en el siguiente formato.

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

1. Actualice la plantilla de despliegue de la aplicación en el diagrama de Helm para las imágenes de contenedores integradas con ellas para incluir AWS License Manager lo siguiente:
   + Cuenta de servicio para el pod: la cuenta de servicio es necesaria para las implementaciones de Helm en Amazon EKS. Se utiliza a fin de obtener permisos para llamar a las operaciones de la API de License Manager mediante la configuración de roles de IAM para la cuenta de servicio en la imagen del contenedor. Para obtener más información acerca de los roles de IAM para cuentas de servicio, consulte [Roles de IAM para cuentas de servicio](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html).
   + Acceso con licencia para implementaciones locales: el secreto de configuración de la licencia es necesario para proporcionar las credenciales y los permisos adecuados para llamar a las operaciones de API de License Manager para las implementaciones de Helm en entornos locales. Los compradores generarán y proporcionarán el secreto de licencia a Helm a partir de su experiencia de AWS Marketplace compra.

   El siguiente fragmento de código es un ejemplo de especificación de implementación con el secreto de la cuenta de servicio, la configuración de la licencia y la imagen extraída.

   ```
   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 }}
   ```
**nota**  
El secreto de configuración de la licencia es opcional. Los compradores solo utilizan el valor para las implementaciones locales. Para AWS las implementaciones, la especificación de implementación debe incluir una cuenta de servicio para las imágenes integradas de License Manager.

1. Pruebe la integración de License Manager de forma local y en Amazon EKS siguiendo los pasos de las siguientes secciones:

   1. [Prueba de la integración de License Manager localmente](#container-testing-LM-integration-locally)

   1. [Prueba de la integración de License Manager en Amazon EKS](#container-testing-LM-integration-EKS)

1. Tras comprobar correctamente la integración de License Manager tanto en AWS las instalaciones como en las instalaciones, puede crear su listado de productos de contenedores siguiendo los pasos que se indican en[Descripción general: creación de un producto de contenedor](container-product-getting-started.md#create-container-product).

## Prueba de la integración de License Manager localmente
<a name="container-testing-LM-integration-locally"></a>

Puede usar minikube o cualquier otra configuración para probar la integración de License Manager en clústeres de Kubernetes de forma local. Asegúrese de que el clúster de Kubernetes tenga acceso saliente a Internet para llamar a las operaciones de API de License Manager.

**Para probar una integración de License Manager localmente**

1. Cree una licencia de prueba en una cuenta de vendedor de prueba con los derechos que desee. Para configurar una licencia de prueba, consulte la *referencia [CreateLicense](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_CreateLicense.html)de la AWS License Manager API*. O bien, utilice el siguiente script para crear una licencia de prueba y, a continuación, cree una concesión de licencia a una cuenta de comprador de prueba para consumir la licencia. El siguiente script usa las credenciales de la cuenta de vendedor de prueba.

   ```
   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. Cree un secreto de Kubernetes con el token de licencia y el rol de IAM utilizando el formato secreto definido anteriormente. Utilice la operación de API `CreateToken` de License Manager para generar un token de licencia. A continuación, utilice la operación de API `CreateRole` de IAM para crear un rol de IAM con permisos y una política de confianza. Vea un ejemplo en el siguiente script. El siguiente script utiliza las credenciales de la cuenta de comprador de prueba.

   ```
   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. Configura cualquier clúster de Kubernetes alojado en un entorno externo. AWSÚselo para comprobar que las aplicaciones contenedoras pueden conectarse a la AWS License Manager API desde entornos distintos AWS y que el proveedor de credenciales personalizadas está bien integrado en la aplicación.

1. Implemente el token de licencia y el rol de IAM generados anteriormente en el clúster local de Kubernetes.

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

1. Implemente su aplicación a través de Helm con el nombre del secreto como entrada y compruebe que la aplicación puede llamar a las operaciones de API de License Manager para realizar comprobaciones de derechos. Para ver los cambios en Helm y en las especificaciones de implementación, consulte el paso 9 de [Integración de un producto AWS Marketplace de for Containers Anywhere con License Manager](#containers-anywhere-integrate-with-LM).

## Prueba de la integración de License Manager en Amazon EKS
<a name="container-testing-LM-integration-EKS"></a>

También puede probar la integración de License Manager en Amazon EKS. Compruebe que la aplicación puede llamar a las operaciones de API de License Manager sin el secreto de configuración de la licencia. Asegúrese también de que la cuenta de servicio se pueda utilizar para configurar los roles de IAM para las cuentas de servicio (IRSA) y proporcionar las credenciales pertinentes a la aplicación.

**Para probar la integración de License Manager en Amazon EKS**

1. Cree una licencia de prueba en una cuenta de vendedor de prueba con los derechos que desee. Consulte la [referencia de la CreateLicense API](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_CreateLicense.html) para configurar su licencia de prueba o utilice el siguiente script para crear una y crear una concesión de licencia a una cuenta de comprador de prueba para consumir la licencia. El siguiente script usa las credenciales de la cuenta de vendedor de prueba.

   ```
   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. Cree un clúster de Amazon EKS de prueba con las configuraciones deseadas o ejecute los siguientes comandos para usar una configuración predeterminada.

   ```
   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. Cree una cuenta de servicio para un clúster existente y asócielo a rol de IAM. Ejecute el siguiente comando para crear el rol de IAM con `AWSLicenseManagerConsumptionPolicy`. A continuación, el comando lo adjunta a la cuenta de servicio de `test_sa` del clúster de Amazon EKS donde se deben implementar las imágenes integradas de License Manager. Como resultado, la cuenta de servicio puede obtener las credenciales adecuadas para llamar a las operaciones de la API de 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. Implemente la aplicación mediante Helm en la cuenta de servicio a la que está asociada el rol de IAM desde el comando anterior. Compruebe que la aplicación pueda llamar a las operaciones de la API de License Manager para realizar comprobaciones de derechos.

## Derechos de licencias flotantes con License Manager
<a name="container-LM-floating-license"></a>

En el caso de las licencias flotantes, a medida que los usuarios inician sesión en la aplicación, se extrae una licencia del conjunto de licencias disponibles. A medida que los usuarios cierran sesión, las licencias se vuelven a agregar al conjunto de licencias disponibles.

En el caso de las licencias flotantes, la aplicación utiliza la operación de API `CheckoutLicense` para retirar los derechos del conjunto de derechos cuando se utiliza el recurso. La respuesta de la operación de API `CheckoutLicense` incluye un token de consumo de licencias, que es un identificador único para el proceso de compra. El token de consumo de licencias puede realizar acciones adicionales en los derechos que se retiran, como reintegrarlos al conjunto de licencias o prolongar el proceso de retirada.

Cuando el recurso deja de estar en uso, la aplicación utiliza la operación de API `CheckInLicense` para reintegrar los derechos en el conjunto.

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

Si se produce un error al reintegrar una licencia en el conjunto, por ejemplo, si la aplicación se bloquea durante la operación, el derecho se reintegra automáticamente en el conjunto transcurridos 60 minutos. Por este motivo, si el recurso se utiliza durante más de 60 minutos, se recomienda mantener el derecho retirado del conjunto. Para ello, utilice la operación de API `ExtendLicenseConsumption` siempre que se utilice el recurso.

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

## Prácticas recomendadas para la integración en License Manager para implementaciones en las instalaciones
<a name="container-LM-best-practices-on-prem"></a>

Las implementaciones de aplicaciones de contenedores en un entorno local pueden dar lugar a un acceso a la red saliente poco fiable. Utilice las siguientes prácticas recomendadas para aumentar la resiliencia y evitar que los compradores interrumpan el servicio debido a posibles problemas causados por una mala conectividad a Internet:
+ **Reintento adecuado**: los problemas transitorios de red pueden impedir que la aplicación se conecte a ella. AWS License Manager Implemente reintentos para hasta 30 minutos, con una reducción exponencial. Esta opción puede ayudar a evitar interrupciones a corto plazo o problemas de red.
+ **Evite límites estrictos**: las aplicaciones implementadas en clústeres conectados pueden comprobar periódicamente las licencias para identificar cualquier cambio debido a actualizaciones o renovaciones. Con un acceso saliente poco fiable, es posible que la aplicación no pueda identificar esos cambios. Siempre que sea posible, la aplicación debe evitar la interrupción del servicio a los compradores debido a la imposibilidad de comprobar las licencias a través de License Manager. Las aplicaciones pueden volver a una versión de prueba gratuita o de código abierto cuando la licencia vence y no pueden comprobar si una licencia es válida.
+ **Notifique a los clientes**: cuando se utiliza una licencia en caché, los cambios en la licencia (incluidas las renovaciones o las actualizaciones) no se reflejan automáticamente en la carga de trabajo en curso. Notifique a sus clientes (que deben volver a permitir el acceso saliente a la aplicación de forma temporal) para que la aplicación pueda actualizar su licencia en caché. Por ejemplo, notifique a los clientes a través de la propia aplicación o a través de su documentación. Del mismo modo, cuando recurra a un conjunto más reducido de funcionalidades, notifique a los clientes que sus derechos están agotados o que la licencia ha caducado. Luego, pueden elegir entre actualizar o renovar.

## `LicenseManagerCredentialsProvider`: implementación de Java
<a name="container-license-manager-cred-provider-java"></a>

`LicenseCredentialsProvider`amplía la cadena de proveedores de credenciales predeterminada del AWS SDK para su uso local mediante la adición de. `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` proporciona credenciales mediante el uso de tokens de identidad emitidos por el OIDC de License Manager en entornos en las instalaciones. Debe incluir el código fuente para `LicenseCredentialsProvider` en la ruta de clases de su aplicación.

```
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`: implementación de `Golang`
<a name="container-license-manager-cred-provider-golang"></a>

**`LicenseCredentialsProvider`**

`LicenseCredentialsProvider`amplía la cadena de proveedores de credenciales predeterminada del AWS SDK para su uso local mediante la adición de. `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` proporciona credenciales mediante el uso de tokens de identidad emitidos por el OIDC de License Manager en entornos en las instalaciones. Debe incluir el código fuente para `LicenseCredentialsProvider` en la ruta de clases de su aplicación.

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

# Notificaciones de Amazon SNS para productos de contenedores
<a name="container-notification"></a>

Para recibir notificaciones, puedes suscribirte a los temas del Amazon Simple Notification Service (Amazon SNS) que se te proporcionarán AWS Marketplace durante la creación del producto. Los temas proporcionan notificaciones acerca de los cambios realizados en la suscripción de los clientes para sus productos. Por ejemplo, puede utilizar estas notificaciones para saber cuándo aceptan los clientes una oferta privada. 

**nota**  
Durante el proceso de creación del producto, se crea un tema de Amazon SNS para el producto. Para suscribirse a notificaciones, necesita el nombre de recurso de Amazon (ARN) del tema de Amazon SNS (por ejemplo, `arn:aws:sns:us-east-1:123456789012:aws-mp-subscription-notification-PRODUCTCODE`). El ARN no está disponible en el portal de vendedores de productos de servidor. Póngase en contacto con el [equipo de Operaciones de AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us) para solicitar el ARN.

El siguiente tema de Amazon SNS está disponible para productos en contenedores:
+ [Tema de Amazon SNS: `aws-mp-subscription-notification`](#container-sns-subscription-message-body): este tema le notifica cuando un comprador se suscribe o cancela la suscripción a un producto. Está disponible para los modelos de precios por hora, incluidos los modelos por hora y por hora a largo plazo.

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

Cada mensaje del tema de `aws-mp-subscription-notification` tiene el siguiente formato.

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

Esto *<action-name>* variará en función de la notificación. Las acciones posibles son:
+ `subscribe-success`
+ `subscribe-fail`
+ `unsubscribe-pending`
+ `unsubscribe-success`

El `offer-identifier` se incluye en la notificación solo cuando la acción es `subscribe-success` o`subscribe-fail`. No está incluido en las notificaciones cuando la acción es `unsubscribe-pending` o `unsubscribe-success`. En el caso de las ofertas creadas antes de enero de 2024, este identificador se incluye en la notificación solo en el caso de las ofertas privadas. En el caso de las ofertas creadas a partir de enero de 2024, este identificador se incluye en las notificaciones de todas las ofertas, tanto las privadas como las públicas.

Para obtener información sobre los tipos de ofertas, consulta la respuesta de la [DescribeEntity API](https://docs.aws.amazon.com//marketplace/latest/APIReference/work-with-private-offers.html#describe-entity) o la visibilidad de la oferta de un acuerdo en el [panel de renovaciones de acuerdos](https://docs.aws.amazon.com//marketplace/latest/userguide/agreements-renewals-dashboard.html).

**nota**  
 Cuenta de AWS En el caso de la [DescribeEntity API](https://docs.aws.amazon.com//marketplace/latest/APIReference/work-with-private-offers.html#describe-entity), si encuentras un aspecto de la regla de segmentación de esa oferta en la cuenta, se trata de una oferta privada. Si no hay ninguna regla de segmentación Cuenta de AWS en la cuenta para esa oferta, se trata de una oferta pública.

## Suscripción de una cola de Amazon SQS al tema de Amazon SNS
<a name="subscribing-sqs-queue-to-sns-topic"></a>

Le recomendamos que suscriba una cola de Amazon SQS a los temas SNS proporcionados. *Para obtener instrucciones detalladas sobre la creación de una cola de SQS y la suscripción de la cola a un tema, consulte el tema [Suscripción de una cola de Amazon SQS a un tema de Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/subscribe-sqs-queue-to-sns-topic.html) en la Guía para desarrolladores de Amazon Simple Notification Service*.

**nota**  
Solo puedes suscribirte a los temas AWS Marketplace de redes sociales de los que Cuenta de AWS se utilizan para vender los productos. Sin embargo, puede reenviar los mensajes a una cuenta diferente. Para obtener más información, consulte [Envío de mensajes de Amazon SNS a una cola de Amazon SQS de otra cuenta](https://docs.aws.amazon.com/sns/latest/dg/sns-send-message-to-sqs-cross-account.html) en la *Guía para desarrolladores de Amazon Simple Notification Service*.

### Sondeo de la cola de SQS para notificaciones
<a name="polling-the-sqs-for-notifications"></a>

Tras suscribir la cola de SQS a un tema de SNS, los mensajes se almacenan en SQS. Debe definir un servicio que realice un sondeo continuo de la cola, busque mensajes y los gestione en consecuencia.