

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Produtos baseados em contêiner no AWS Marketplace
<a name="container-based-products"></a>

**Importante**  
Em 1º de março de 2026, o AWS Marketplace interromperá o Quick Launch para implantações de chart do Helm no Amazon EKS. As implantações existentes continuarão funcionando normalmente. Você ainda pode implantar usando comandos do Helm padrão ou imagens de contêiner no Amazon ECS.

AWS MarketplaceO oferece produtos de software que usam contêineres do Docker. Os produtos de contêiner consistem em opções de entrega que são um conjunto de imagens de contêiner e modelos de implantação que funcionam em conjunto. Envie no mínimo uma e no máximo quatro opções de entrega do produto. Para cada opção de entrega, forneça um conjunto de imagens de contêiner, instruções de uso e links para modelos de implantação para que os clientes executem essa opção de entrega. Este tópico fornece informações sobre produtos baseados em contêiner no AWS Marketplace.

Os compradores do AWS Marketplace veem as opções de entrega disponíveis nas páginas de detalhes do produto publicadas que estão disponíveis para eles. Depois de assinar o produto e escolher a opção de entrega preferida, os compradores veem as informações e instruções para executar e usar o produto. Para opções de entrega de imagens de contêiner, os compradores veem links para os modelos de implantação e URLs de imagens de contêiner disponíveis. Eles também recebem instruções sobre como extrair as imagens individuais do contêiner. Para obter as opções de entrega do chart do Helm, os compradores verão instruções passo a passo sobre como executar usando o Helm.

Para ver um resumo da experiência de compra, você pode consultar este vídeo: [Implantação de contêineres do AWS Marketplace em clusters do Amazon ECS](https://www.youtube.com/watch?v=XaiUAiQQJtk) (3:34).

Você pode encontrar, assinar e implantar aplicativos Kubernetes de terceiros no AWS Marketplace em qualquer cluster Kubernetes em qualquer ambiente. Você pode implantar aplicativos de Kubernetes de terceiros no Amazon Elastic Container Service (Amazon ECS), no Amazon Elastic Kubernetes Service (Amazon EKS), AWS Fargate e on-premises usando o Amazon EKS Anywhere (EKS Anywhere). Você também pode implantá-los em clusters autogerenciados do Kubernetes on-premises ou no Amazon Elastic Compute Cloud (Amazon EC2).

É possível executar produtos de contêiner gratuitos e do modelo Traga a sua própria licença (BYOL) em qualquer runtime compatível com Docker.

**Topics**
+ [Como obter ajuda](#container-help)
+ [Conceitos básicos de produtos de contêiner](container-product-getting-started.md)
+ [Requisitos de produtos baseados em contêineres para AWS Marketplace](container-product-policies.md)
+ [Preços de produtos de contêiner para AWS Marketplace](pricing-container-products.md)
+ [Integrações de faturamento, medição e licenciamento de produtos de contêiner](container-products-billing-integration.md)
+ [Notificações do Amazon SNS para produtos de contêiner](container-notification.md)

## Como obter ajuda
<a name="container-help"></a>

Para obter assistência com os produtos de contêiner, entre em contato com seu parceiro de desenvolvimento de negócios do AWS Marketplace ou a equipe de [operações do vendedor do AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/).

# Conceitos básicos de produtos de contêiner
<a name="container-product-getting-started"></a>

Como AWS Marketplace vendedor, você pode criar produtos de software baseados em contêineres. Os produtos de contêiner consistem em opções de entrega que são um conjunto de imagens de contêiner e modelos de implantação que funcionam em conjunto. O tópico a seguir mostra como começar com produtos de contêiner.
+ [Ciclo de vida do produto](#container-product-lifecycle)
+ [Pré-requisitos](#container-prereq)
+  [Etapa 1: criar o ID do produto e do código do produto para seu produto de contêiner](#create-initial-container-product) 
+ [Etapa 2: criar um anúncio inicial](#container-initial-listing)
+ [Etapa 3: adicionar uma versão inicial do produto](#container-add-version-gs)
+ [Etapa 4: (somente para produtos pagos) integrar a medição ou o preço do contrato](#getting-started-integrate-metering)
+ [Próximas etapas](#getting-started-integrate-metering)
+ [O produto de contêiner verifica se há problemas de segurança](#container-security)

## Ciclo de vida do produto
<a name="container-product-lifecycle"></a>

Quando você cria um produto em AWS Marketplace, ele é publicado inicialmente com visibilidade limitada para que as contas na lista de permissões possam vê-lo, incluindo a conta que criou o produto. Quando estiver pronto, você pode publicá-lo no AWS Marketplace catálogo para permitir que os compradores se inscrevam e comprem seu produto.

Na página [Produto de servidor](https://aws.amazon.com/marketplace/management/products/server), você pode ver a lista de seus produtos. Dependendo do estágio em que se encontra, o produto terá um dos seguintes status.
+ **Preparação**: um produto incompleto para o qual você ainda está adicionando informações. No primeiro **Salvar e sair** da experiência de autoatendimento, a solicitação de alteração bem-sucedida cria um produto não publicado com informações das etapas concluídas que você enviou. Nesse status, você pode continuar adicionando informações ao produto ou alterar os detalhes já enviados por meio de solicitações de alteração.
+ **Limitado**: um produto é concluído após ser enviado ao sistema e passar por toda a validação no sistema. Em seguida, o produto é liberado para um status **Limitado**. Nesse momento, o produto tem uma página de detalhes que só pode ser acessada por sua conta e por quem você colocou na lista de permissões. Você pode testar o produto na página de detalhes. Para obter mais informações ou ajuda, entre em contato com a equipe de [Operações do vendedor do AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/).
+ **Público**: quando você estiver pronto para publicar o produto para que os compradores possam ver e assinar o produto, use a solicitação de alteração de **Atualizar visibilidade**. Essa solicitação inicia um fluxo de trabalho para a equipe de operações do AWS Marketplace vendedor revisar e auditar seu produto em relação AWS às políticas. Depois que o produto for aprovado e a solicitação de alteração for processada, o produto será movido do status **Limitado** para **Público**. Para obter informações sobre AWS diretrizes, consulte[Requisitos de produtos baseados em contêineres para AWS Marketplace](container-product-policies.md).
+ **Restrito**: se você quiser impedir que novos usuários assinem seu produto, restrinja o produto usando a solicitação de alteração de **Atualizar visibilidade**. Um status **Restrito** significa que os usuários existentes na lista de permissões podem continuar usando o produto. No entanto, o produto não estará mais visível para o público nem estará disponível para novos usuários. 

## Pré-requisitos
<a name="container-prereq"></a>

Antes de começar, conclua os seguintes pré-requisitos:

1. Acesse e use o [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/). Essa é a ferramenta que você usa para se registrar como vendedor e gerenciar os produtos nos quais você vende AWS Marketplace. Para obter mais informações, consulte [Portal de gerenciamento do AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/user-guide-for-sellers.html#management-portal).

1. Registre-se como vendedor e envie suas informações fiscais e bancárias. Para obter mais informações, consulte [Processo de registro](registration-process.md).

1. Crie pelo menos um contêiner no Amazon Elastic Container Service (Amazon ECS), no Amazon Elastic Kubernetes Service (Amazon EKS) ou no AWS Fargate. Verifique se você tem links para as imagens associadas.

1. Planeje como você criará e integrará seu produto de contêiner no AWS Marketplace.

   Recomendamos que você planeje a estratégia de definição de preço, de autorização e de medição bem antes de publicar o produto de forma pública.
   + Para obter informações sobre os requisitos para produtos baseados em contêiner, consulte [Requisitos de produtos baseados em contêineres para AWS Marketplace](container-product-policies.md).
   + Para obter informações sobre a definição de preço do produto, consulte [Preços de produtos de contêiner para AWS Marketplace](pricing-container-products.md).
   + Para obter informações sobre a medição personalizada para seu produto pago baseado em contêiner, consulte [Medição horária e personalizada com AWS Marketplace Metering Service](container-products-billing-integration.md#entitlement-and-metering-for-paid-products).

## Visão geral: crie um produto em contêiner
<a name="create-container-product"></a>

A criação de um produto de contêiner envolve as seguintes etapas:

1. [Etapa 1: criar o ID do produto e do código do produto para seu produto de contêiner](#create-initial-container-product)

1. [Etapa 2: criar um anúncio inicial](#container-initial-listing)

1. [Etapa 3: adicionar uma versão inicial do produto](#container-add-version-gs)

1. [Etapa 4: (somente para produtos pagos) integrar a medição ou o preço do contrato](#getting-started-integrate-metering)

1. [Atualize a visibilidade do produto](#container-product-visibility)

Para obter informações sobre o ciclo de vida do produto, consulte [Ciclo de vida do produto](#container-product-lifecycle).

## Etapa 1: criar o ID do produto e do código do produto para seu produto de contêiner
<a name="create-initial-container-product"></a>

Para começar a usar um produto em contêiner, você deve criar uma ID do produto e um registro de código do produto em AWS Marketplace. O ID do produto é usado para rastrear seu produto durante todo o ciclo de vida.

Use o procedimento a seguir para criar um novo produto de contêiner no Portal de gerenciamento do AWS Marketplace e gerar a ID do produto.

**nota**  
Esse processo também cria uma chave pública para seu contêiner que combina com seu produto.

**Para criar o ID do produto de contêiner**

1. Abra um navegador da web e faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Na barra de menu, selecione **Produto** e escolha **Servidor**.

1. Escolha **Criar produto de servidor** e, em seguida, escolha **Contêiner**.

1. Gere um ID e um código do produto do contêiner.
**nota**  
(Opcional) Você pode marcar seu produto para autorização com base em tags. Para obter mais informações, consulte [Marcar seus recursos do AWS](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html).

1. Escolha **Continuar** para continuar criando seu produto.

## Etapa 2: criar um anúncio inicial
<a name="container-initial-listing"></a>

Depois de gerar o ID do produto, o código do produto e a chave pública, você usará um assistente para criar uma lista inicial.

1. Forneça informações sobre o produto para sua lista de produtos.

1. Determine o modelo de preços do seu produto.
**nota**  
Para obter mais informações, consulte [Preço de produtos de contêiner](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-container-products.html).
**nota**  
Para produtos pagos, seu produto começará com um preço de USD 0,01 para permitir que você e a equipe de operações do vendedor do AWS Marketplace testem o produto sem incorrer em um alto custo. Você fornecerá o preço real quando abrir o capital.

1. Forneça informações adicionais sobre a oferta, incluindo uma política de reembolso, EULA e disponibilidade da oferta.

1. Adicione um repositório inicial para seu produto de contêiner.

1. Escolha **Enviar** na última etapa para mover o produto para visibilidade limitada.
**nota**  
O produto de contêiner é criado inicialmente com uma versão de espaço reservado. Você adicionará a versão final quando o produto tiver uma visibilidade limitada. 

## Etapa 3: adicionar uma versão inicial do produto
<a name="container-add-version-gs"></a>

Seu produto pode ter várias versões ao longo da vida útil. Cada versão tem um conjunto de imagens de contêiner que são específicas dessa versão. Para adicionar uma versão inicial do produto, consulte [Adicionando uma nova versão do seu produto de contêiner no AWS Marketplace](container-add-version.md). 

## Etapa 4: (somente para produtos pagos) integrar a medição ou o preço do contrato
<a name="getting-started-integrate-metering"></a>

Para produtos de contêiner com preços por uso, use o [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) para verificar a autorização a usar seu produto e para medir o uso para faturamento. Você deve medir o modelo de preços que criou ao definir as informações de preços. Para obter mais informações, consulte [Medição horária e personalizada com AWS Marketplace Metering Service](container-products-billing-integration.md#entitlement-and-metering-for-paid-products).

### Preço do contrato
<a name="container-integrate-LM"></a>

Para produtos baseados em contêiner com preços contratuais, você usa o AWS License Manager para associar licenças ao seu produto. 

Para obter mais informações sobre a integração com AWS License Manager, consulte[Preços contratuais para produtos em contêineres com AWS License Manager](container-license-manager-integration.md).

## Etapa 5: Atualizar a visibilidade do produto
<a name="container-product-visibility-allowlist"></a>

Quando você cria um produto em AWS Marketplace, ele é publicado inicialmente com visibilidade limitada para que as contas na lista de permissões possam vê-lo, incluindo a conta que criou o produto. Você pode atualizar a visibilidade do produto para permitir que os compradores assinem e comprem seu produto. Como alternativa, você pode atualizar a lista de permissões do produto para adicionar. Contas da AWS Este tópico mostra como gerenciar quais compradores podem ver seu produto no AWS Marketplace.

Para obter mais informações sobre visibilidade e ciclo de vida do produto, consulte [Ciclo de vida do produto](#container-product-lifecycle).

**Topics**
+ [Atualize a visibilidade do produto](#container-product-visibility)
+ [Atualizando a lista de permissões do Conta da AWS IDs](#container-update-allowlist)

### Atualize a visibilidade do produto
<a name="container-product-visibility"></a>

**Para atualizar a visibilidade**

1. Abra o endereço e[https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/), Portal de gerenciamento do AWS Marketplace em seguida, faça login na sua conta de vendedor.

1. Vá para a página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), na guia **Produto de servidor atual**, e selecione o produto baseado em contêiner que você deseja modificar.

1. No menu suspenso **Solicitar alterações**, escolha **Atualizar visibilidade**.
**nota**  
Você pode solicitar que o produto seja movido de um status **Limitado** para um status **Público** usando essa solicitação de alteração. No entanto, a solicitação de alteração deve passar por um processo de aprovação da equipe de operações do AWS Marketplace vendedor para ser transferida para **Público**.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status se tornará **Bem-sucedido**.

### Atualizando a lista de permissões do Conta da AWS IDs
<a name="container-update-allowlist"></a>

Você pode alterar a lista do Conta da AWS IDs que pode visualizar seu produto em um estado limitado. As contas listadas como permitidas exibem um selo Limitado ao lado da versão do produto na página de detalhes do produto.

1. Abra o Portal de gerenciamento do AWS Marketplace em [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e faça login na sua conta de vendedor.

1. Na página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), selecione o produto de contêiner que você deseja modificar.

1. Na lista suspensa **Solicitar alterações**, selecione **Atualizar lista de permissões**. A lista atual de contas que estão na lista de permissões é exibida.

1. No Contas da AWS campo Lista de **permissões**, insira Conta da AWS IDs e separe-os usando uma vírgula.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status será atualizado para **Bem-sucedido** ou **Falha**.

## Próximas etapas
<a name="container-next-steps"></a>

Depois de criar um produto de contêiner, você pode usar as informações nos tópicos a seguir para configurá-lo e gerenciá-lo:
+ [Atualizando as informações do produto para seu produto de contêiner em AWS Marketplace](update-container-product-info.md)
+ [Adicionando uma nova versão do seu produto de contêiner no AWS Marketplace](container-add-version.md)
+ [Gerenciando preços de produtos em contêineres em AWS Marketplace](container-pricing.md)
+ [Atualizando a disponibilidade do produto em contêineres por país em AWS Marketplace](container-update-offer-avail-country.md)
+ [Atualizar seu contrato de licença de usuário final (EULA) para produtos de contêineres no AWS Marketplace](container-update-eula.md)
+ [Testando e liberando seu produto de contêiner em AWS Marketplace](test-release-product.md)

## O produto de contêiner verifica se há problemas de segurança
<a name="container-security"></a>

Quando você cria uma solicitação de alteração para adicionar uma nova versão ao produto de contêiner, examinamos as imagens do contêiner incluídas nessa nova versão e verificamos as vulnerabilidades de segurança. Para fazer isso, realizamos uma varredura layer-by-layer estática na imagem. Se encontrarmos vulnerabilidades críticas com vetores de risco exploráveis remotamente, forneceremos uma lista dos problemas encontrados. É altamente recomendável executar a própria análise de segurança usando um scanner de imagem de contêiner, como Clair, Twistlock, Aqua Security ou Trend Micro, para evitar atrasos no processo de inclusão e publicação. 

A opção de imagem base para a criação das imagens de contêiner pode ter uma influência significativa no perfil de segurança da imagem final. Se você escolher uma imagem base que já tenha vulnerabilidades críticas conhecidas, elas serão sinalizadas por causa da camada base, mesmo se as camadas do software aplicativo estiverem limpas. Recomendamos que você verifique se está começando com um contêiner básico livre de vulnerabilidades antes de criar suas imagens e enviá-las AWS Marketplace. 

# Atualizando as informações do produto para seu produto de contêiner em AWS Marketplace
<a name="update-container-product-info"></a>

Depois de criar o ID do produto e definir o preço, você pode editar as informações do produto, incluindo o que os clientes verão sobre o produto de contêiner no AWS Marketplace. Por exemplo, se uma nova versão modificar a descrição ou os destaques do produto, você poderá editar as informações do produto com os novos dados. Você também pode atualizar outras informações do produto, incluindo título do produto, descrição do SKU, categorias, palavras-chave e outros. O procedimento a seguir descreve a criação dos detalhes do produto.

**Para criar ou atualizar detalhes do produto de contêiner**

1. Faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Selecione **Servidor** no menu **Produtos**. 

1. Na guia **Produtos de servidor**, selecione o produto que você deseja modificar.

1. No menu suspenso **Solicitar alterações**, escolha **Atualizar informações do produto**.

1. Atualize qualquer um dos seguintes campos que você queira alterar:
   + **Título do produto**
   + **SKU**
   + **Descrição breve**
   + **Descrição longa**
   + **URL da imagem do logotipo do produto**
   + **Destaques**
   + **Categorias de produtos**
   + **Palavras-chave**
   + **URL do vídeo do produto**
   + **Recursos**
   + **Informações de suporte**
**nota**  
A imagem URLs deve estar em um bucket do Amazon S3 que esteja acessível publicamente. Para obter mais detalhes sobre o formato do logotipo, consulte [Requisitos de logotipo de empresa e produto](product-submission.md#seller-and-product-logos).

1. Selecione **Enviar**.

1. Verifique se a solicitação aparece na guia **Solicitações** com o status **Em análise**. Talvez seja necessário atualizar a página para ver a solicitação na lista.

Você pode verificar o status da solicitação a qualquer momento na guia **Solicitações** da página [Produtos do servidor](https://aws.amazon.com/marketplace/management/products/server).

# Adicionando uma nova versão do seu produto de contêiner no AWS Marketplace
<a name="container-add-version"></a>

Como AWS Marketplace vendedor, você pode adicionar novas versões do seu produto de contêiner, gerenciar versões e atualizar as informações da versão. Seu produto pode ter várias versões ao longo da vida útil. Cada versão tem um conjunto de imagens de contêiner que são específicas dessa versão. Os tópicos a seguir mostram como gerenciar versões de produtos para seus produtos de contêiner.

**nota**  
Você não pode adicionar uma versão ao produto até criar o ID e o preço do produto. Para mais informações sobre essas etapas, consulte [Etapa 1: criar o ID do produto e do código do produto para seu produto de contêiner](container-product-getting-started.md#create-initial-container-product). 

**Topics**
+ [Etapa 1: adicionar repositórios](#add-repositories)
+ [Etapa 2: upload de imagens de contêiner e artefatos para repositórios](#upload-resources)
+ [Etapa 3: adicionar uma nova versão ao produto de contêiner](#add-new-version)
+ [Etapa 4: atualizar as informações da versão](#container-product-updating-version)
+ [Restringir uma versão do complemento do Amazon EKS](#restriciting-version-eks-addon)

## Etapa 1: adicionar repositórios
<a name="add-repositories"></a>

As imagens do contêiner e outros artefatos do produto são armazenados em repositórios no AWS Marketplace. Normalmente, você cria um repositório para cada artefato necessário, mas o repositório pode armazenar várias versões do artefato (com tags diferentes). 

**nota**  
Todas as imagens na implantação do produto devem usar imagens dos repositórios do AWS Marketplace .

O procedimento a seguir descreve como adicionar os repositórios necessários em AWS Marketplace.

**Para adicionar repositórios**

1. Faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Selecione **Servidor** no menu **Produtos**.

1. Na guia **Produtos de servidor**, selecione o produto que você deseja modificar e, em seguida, escolha **Adicionar repositórios** no menu suspenso **Solicitar alterações**.

1. Insira o nome do repositório que você deseja criar. Se você quiser criar mais de um novo repositório:
   + Escolha **Adicionar novo repositório** para cada repositório adicional.
   + Dê a ele um nome exclusivo. O nome exclusivo escolhido por você deve estar em todos os produtos na conta do vendedor.
**nota**  
O repositório terá essa estrutura: `<repositoryID>.dkr.ecr.us-east-1.amazonaws.com/<sellerName>/<repositoryName>`. Quando você adicionar itens ao repositório (no procedimento a seguir), eles receberão uma tag e terão essa estrutura: `<repositoryID>.dkr.ecr.us-east-1.amazonaws.com/<sellerName>/<repositoryName>:<tag>`.   
`repositoryID`É um ID interno para AWS Marketplace.
`sellerName` é baseado no nome que você criou para sua conta de vendedor. Quando o nome de exibição do vendedor gera um prefixo inválido `sellerName` para o repositório, o AWS Marketplace substitui automaticamente um UUID (Identificador Único Universal) no lugar do nome do vendedor. Para alterar o prefixo UUID no nome do seu repositório, entre em contato com a equipe de operações do AWS Marketplace.
O `respositoryName` é definido nesta etapa.
A `tag` é definida quando você carrega um artefato no repositório.

1. Selecione **Submit (Enviar)**.

**nota**  
Você pode ter até 70 repositórios por produto.

Uma nova solicitação é criada e exibida na guia **Solicitações**. Quando estiver concluído, em minutos, você poderá começar a adicionar imagens de contêiner e outros artefatos aos repositórios que criou.

## Etapa 2: upload de imagens de contêiner e artefatos para repositórios
<a name="upload-resources"></a>

**Para fazer upload de imagens de contêiner e artefatos para repositórios**

1. Faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. No menu **Produtos**, escolha **Servidor**.

1. Na guia **Produtos de servidor**, selecione o produto que você deseja modificar.

1. Escolha **Adicionar repositórios** no menu suspenso **Solicitar alterações**.

1. Escolha **Exibir repositórios existentes**.

1. Selecione o repositório para o qual deseja fazer upload.

1. Selecione **Exibir comandos push** para abrir uma lista de instruções, incluindo comandos que você pode usar para enviar imagens de contêiner do Docker e charts do Helm para esse repositório. 

   Para obter informações gerais sobre como enviar por push imagens de contêiner e outros artefatos para repositórios, consulte [Envio por push de uma imagem](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-push.html) no *Guia do usuário do Amazon Elastic Container Registry*.
**nota**  
É possível usar as seguintes operações de API do Amazon Elastic Container Registry (Amazon ECR) ao chamar `docker pull` ou `docker push`:  
`DescribeImages`: use para revisar os metadados sobre as imagens em um repositório.
`GetAuthorizationToken`: use para autenticar antes de enviar artefatos para o repositório e, em seguida, use os comandos `docker pull` ou `docker push`.
`ListImages`: use para ver uma lista de imagens que você enviou.

1. Use os comandos listados para enviar todos os artefatos necessários do seu repositório local para o AWS Marketplace repositório do seu produto.
**nota**  
A **tag** que você fornece nos comandos `push` é usada para diferenciar a versão do artefato que está carregando no repositório. Use uma tag que faça sentido para a versão da qual os artefatos fazem parte.

1. Repita o procedimento para cada imagem de contêiner ou artefato que você precisa em sua versão.
**nota**  
Sua versão pode incluir até 50 imagens de contêiner ou artefatos em cada opção de entrega. Consulte o procedimento a seguir para obter mais informações sobre as opções de entrega.

Depois de fazer o upload dos artefatos, você estará pronto para criar a versão do produto. 

**nota**  
As imagens do contêiner são digitalizadas automaticamente para ver se elas cumprem as [Requisitos de produtos baseados em contêineres para AWS Marketplace](container-product-policies.md). Para obter mais informações, consulte [O produto de contêiner verifica se há problemas de segurança](container-product-getting-started.md#container-security).

### Adição de uma nova opção de entrega
<a name="add-delivery-option"></a>

Cada versão do seu produto de contêiner precisaria de uma opção de entrega. A opção de entrega especifica as opções de implantação disponíveis para o comprador. Dependendo de uma das opções de entrega abaixo, você precisaria carregar os artefatos apropriados nos repositórios.
+ Para uma opção de entrega de **imagens de contêiner**, faça o upload de todas as imagens de contêiner necessárias para a instalação do produto no repositório Amazon Elastic Container Registry (Amazon ECR) criado no console. AWS Marketplace 
+ Para uma opção de entrega de **Helmgráficos**, faça o upload das imagens do Helm gráfico e do contêiner no repositório Amazon ECR criado no AWS Marketplace console.
+ Para uma opção de entrega **complementar do console Amazon EKS**, faça o upload do Helm gráfico e das imagens do contêiner no repositório Amazon ECR criado no console. AWS Marketplace 

## Etapa 3: adicionar uma nova versão ao produto de contêiner
<a name="add-new-version"></a>

**nota**  
Se você receber algum erro ao adicionar uma nova versão ao seu contêiner, consulte a [tabela Adicionar uma nova versão de erros assíncronos](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version) na *Referência AWS Marketplace Catalog API *.

**Para adicionar uma nova versão ao produto de contêiner**

1. Faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Escolha **Servidor** no menu **Produtos**.

1. Na guia **Produtos de servidor**, selecione o produto ao qual você deseja adicionar uma versão. Em seguida, escolha **Adicionar nova versão** no menu suspenso **Solicitar alterações**.

1. Na página **Adicionar nova versão**, insira o **Título da versão** e as **Notas de lançamento** da sua versão.

1. Depois de inserir os detalhes da versão, a próxima etapa é adicionar opções de entrega. As opções de entrega são conjuntos de instruções e informações que os compradores podem usar para executar o software a partir da versão do produto. As opções de entrega são conhecidas como *opções de execução* aos compradores.
**nota**  
O produto pode oferecer suporte a várias plataformas com diferentes imagens de contêiner (por exemplo, implantações de Kubernetes e Ubuntu). Você pode criar uma opção de entrega para cada forma de configuração, até quatro opções de entrega para uma versão do produto.

   1. Se o produto já tiver opções de entrega em outras versões, você poderá usar a opção existente como modelo para adicionar uma opção de entrega à nova versão. Em **Opções de entrega**, escolha a opção de entrega que você deseja adicionar na lista. Você pode editar a opção usando as instruções nas etapas a seguir.

   1. Para adicionar uma nova opção de entrega, escolha **Nova opção de entrega**. Depois de adicionar uma opção, siga as instruções nas etapas a seguir para configurá-la.

1. Escolha um método de entrega para a opção de entrega. O método de entrega determina como os compradores vão executar seu software.
   + Para uma opção de entrega **Imagem de contêiner**, forneça caminhos para imagens de contêiner em um repositório do Amazon Elastic Container Registry (Amazon ECR) que foi criado no console do AWS Marketplace . Os compradores usam os caminhos de imagem do contêiner para executar o software, inserindo as imagens diretamente em seus ambientes.
   + Para uma opção de entrega **Chart do Helm**, forneça caminhos para os charts do Helm em um repositório do Amazon ECR que foi criado no console do AWS Marketplace . Os compradores instalam os charts do Helm no ambiente de implantação para executar o software.
   + Para uma opção de entrega **Complemento do console do Amazon EKS**, forneça caminhos para os charts do Helm do Amazon ECR que foi criado no console do AWS Marketplace . Os compradores instalam o contêiner usando o console Amazon EKS ou o complemento nativo do Amazon EKS APIs para iniciar o software. Para obter mais informações consulte [Complementos do Amazon EKS do Amazon EKS disponível](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html#workloads-add-ons-available-eks).

   1. Para adicionar uma opção de entrega **Imagem de contêiner**, realize as seguintes etapas:

      1. Em **Imagens de contêiner**, adicione o URL do Amazon ECR às imagens de contêiner que possuem o software da versão do produto.

      1. Em **Título da opção de entrega** e **Descrição da opção de implantação**, insira um título e uma descrição para essa opção de entrega.

      1. Em **Instruções de uso**, insira informações detalhadas para ajudar os compradores a usar seu software depois de executá-lo.

      1. Em **Serviços suportados**, selecione os ambientes nos quais os compradores podem executar o software.

      1. Em **Modelos de implantação**, adicione recursos que os compradores possam usar para executar o software. Insira um título e um URL para o recurso para cada modelo.

   1. Para adicionar uma opção de entrega **Chart do Helm**, realize as seguintes etapas:

      1. Em **Chart do Helm**, adicione o URL do Amazon ECR ao chart do Helm que os compradores instalarão no ambiente de implantação para executar seu software.

      1. Em **Imagens de contêiner**, adicione o URL do Amazon ECR às imagens de contêiner que possuem o software da versão do produto.

      1. Em **Título da opção de entrega** e **Descrição da opção de implantação**, insira um título e uma descrição para essa opção de entrega.

      1. Em **Instruções de uso**, insira informações detalhadas para ajudar os compradores a usar seu software depois de executá-lo.

      1. Em **Serviços suportados**, selecione os ambientes nos quais os compradores podem executar o software.

      1. *Opcional:*: em **Nome da versão do Helm**, insira o nome do namespace Kubernetes em que o chart do Helm será instalado.

      1. *Opcional*: em **Namespace de instalação do Helm**, insira o nome da versão do Helm que será usada pelo comando `helm install`.

      1. *Opcional:* em **Nome da conta de serviço do Kubernetes**, insira o nome da conta de serviço do Kubernetes que será usada para se conectar ao AWS Identity and Access Management (IAM). A conta de serviço do Kubernetes chama serviços da AWS como licenciamento ou medição.

      1. Em **Substituir parâmetros**, insira os parâmetros que serão usados nos comandos da CLI do Helm que executam o software. Esses parâmetros permitem que os compradores substituam os valores padrão fornecidos. Há um limite de 15 parâmetros ao usar o AWS Marketplace Management Console, mas não há limite ao usar AWS Marketplace Catalog API o. Para obter mais informações, consulte [Adicionar uma nova versão a um produto baseado em contêiner](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version).
**nota**  
Alguns **Parâmetros de substituição** são obrigatórios. Os produtos Amazon EKS Anywhere exigem um **Parâmetro de substituição** para o segredo da licença com um `DefaultValue` de `"${AWSMP_LICENSE_SECRET}"`. Para produtos pagos, você deve fornecer um **Parâmetro de substituição** para a configuração da conta de serviço com o `DefaultValue` de `"${AWSMP_SERVICE_ACCOUNT}"`.

      1. Escolha **Ocultar senhas e segredos** para mascarar informações confidenciais em consoles, ferramentas de linha de comando e. APIs Para obter mais informações, consulte a documentação do parâmetro `NoEcho` em [Parâmetros](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html) no *Guia do usuário do AWS CloudFormation *.

   1. Para adicionar uma opção de entrega **Complemento do console do Amazon EKS**, verifique se os artefatos estão em conformidade para [Requisitos para produtos complementares do Amazon EKS](container-product-policies.md#publishing-eks-add-on), em seguida, execute as seguintes etapas:
**nota**  
Somente uma opção de entrega complementar do Amazon EKS é suportada por versão. Você não poderá adicionar uma nova versão até que a versão atual com a qual você está trabalhando seja publicada no console do Amazon EKS.

      1. Em **Chart do Helm**, adicione o URL do Amazon ECR ao chart do Helm que os compradores instalarão no ambiente de implantação para executar seu software.

      1. Em **Imagens de contêiner**, adicione o URL do Amazon ECR às imagens de contêiner que possuem o software da versão do produto. Certifique-se de que todas as imagens no chart do Helm estejam listadas.

      1. Em **Título da opção de entrega** e **Descrição da opção de implantação**, insira um título e uma descrição para essa opção de entrega.

      1. Em **Visibilidade**, mantenha o valor padrão de **Limitado selecionado**.

      1. Em **Nome do complemento**, insira um nome exclusivo para esse complemento. O nome do complemento que você inserir será anexado ao nome do vendedor enquanto é exibido no console do Amazon EKS.

      1. Em **Versão do complemento**, insira a versão do complemento que ficará visível ao instalar ou atualizar esse complemento. Ele segue o formato `major.minor.patch`.

      1. Em **Tipo de complemento**, selecione uma categoria para seu complemento na lista suspensa.

      1. Em **Versão do Kubernetes**, selecione todas as versões do Kubernetes que seu complemento suportará.

      1. Em **Arquitetura**, selecione as arquiteturas de plataforma compatíveis com o complemento. As opções são **AMD64** e **ARM64**. Recomendamos oferecer suporte às duas arquiteturas para maximizar a compatibilidade. Se seu complemento não for compatível com ARM64 dispositivos, você deverá especificar uma data planejada para adicionar suporte antes que seu produto possa ser publicado em todos os comerciais Regiões da AWS.

      1. Em **Namespace**, insira um namespace do Kubernetes exclusivo no qual seu complemento será instalado. Os namespaces `default`, `kube-system` e `kube-public` não são compatíveis com a instalação de complementos de terceiros.

      1. No **parâmetro Substituição do ambiente**, você pode selecionar até 2 parâmetros de ambiente da estrutura complementar do Amazon EKS. Você pode mapear os nomes dos parâmetros do seu values.yaml para essas variáveis de ambiente, que são `${AWS_REGION}` e `${AWS_EKS_CLUSTER_NAME}`.

1. Para adicionar outras opções de entrega, escolha **Nova opção de entrega** e realize as instruções nas etapas anteriores para configurá-las.

1. Selecione **Enviar**.

## Etapa 4: atualizar as informações da versão
<a name="container-product-updating-version"></a>

Depois que uma versão é criada, pode ser útil fornecer informações atualizadas aos compradores modificando as informações associadas à versão. Por exemplo, se você planeja restringir a versão 1.0 após o lançamento da versão 1.1, atualize a descrição da versão 1.0 para direcionar os compradores para a versão 1.1. Forneça a data em que a versão 1.0 será restrita. Você atualiza as informações da versão no Portal de gerenciamento do AWS Marketplace.

**Para atualizar as informações da versão**

1. Faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Selecione **Servidor** no menu **Produtos**. 

1. Na guia **Produtos de servidor**, selecione o produto que você deseja modificar.

1. No menu suspenso **Solicitar alterações**, escolha **Atualizar informações da versão**.

1. Na página **Atualizar versão**, selecione a versão que você deseja atualizar.

1. Faça atualizações na versão selecionada. Os campos disponíveis para atualização dependem do status da versão do produto ou da opção de entrega.

   1. Para todas as versões, você pode atualizar as **Notas de lançamento**.

   1. Para versões que ainda não estão disponíveis publicamente, você pode atualizar o **Título da versão**.

   1. Para opções de entrega que não foram restritas, você pode atualizar os seguintes campos:
      + **Descrição**
      + **Instruções de uso**
      + **Serviços com suporte**

   1. Para opções de entrega em versões que ainda não estão disponíveis publicamente, você pode atualizar os seguintes campos:
      + **Títulos das opções de entrega**
      + **Chart do Helm** (somente para opções de entrega **Chart do Helm**)
      + **Imagens de contêiner**
      + **Recursos de implantação**
      + **AddOn Nome**
      + **AddOn Versão**
      + **AddOn Tipo**
      + **URI do chart do Helm**
      + **CompatibleKubernetesVersions**
      + **SupportedArchitectures**
      + **Namespace**
      + **EnvironmentOverrideParameters**

   1. Para opções de entrega em versões que estão disponíveis publicamente, você pode atualizar **SupportedArchitectures**.

1. Selecione **Enviar**.

1. Verifique se a solicitação aparece na guia **Solicitações** com o status **Em análise**.

Você pode verificar o status da solicitação a qualquer momento na guia **Solicitações** da página [Produtos do servidor](https://aws.amazon.com/marketplace/management/products/server).

## Restringir uma versão do complemento do Amazon EKS
<a name="restriciting-version-eks-addon"></a>

Para restringir uma versão do seu produto de contêiner publicada como um complemento, entre em contato com a equipe de operações do AWS Marketplace usando o formulário de contato na parte inferior do [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/).

# Gerenciando preços de produtos em contêineres em AWS Marketplace
<a name="container-pricing"></a>

Como AWS Marketplace vendedor, você pode gerenciar e atualizar os preços dos produtos em contêineres. Para produtos de contêiner, você pode listar produtos gratuitos, produtos do modelo Traga a sua própria licença (BYOL) e produtos pagos para Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) e AWS Fargate. É possível definir apenas um preço por produto. Você pode adicionar ou atualizar as dimensões de preços. Dependendo do seu modelo de preços, você pode adicionar dimensões de contrato e uso. Você também pode atualizar os termos de preços ou a política de reembolso. Para obter mais informações, consulte as seções a seguir.

 Para obter mais informações sobre os modelos de preços de produtos em contêineres AWS Marketplace, consulte[Preços de produtos de contêiner para AWS Marketplace](pricing-container-products.md).

**Topics**
+ [Adição de uma dimensão de preços](#container-add-pricing-dimensions)
+ [Atualização de informações de dimensões](#container-update-dimensions-information)
+ [Atualização dos termos de preços](#container-update-pricing-terms)
+ [Atualização da política de reembolso de um produto](#container-update-refund-policy)

## Adição de uma dimensão de preços
<a name="container-add-pricing-dimensions"></a>

Você pode adicionar uma dimensão de preços ao modelo de preços que usa para o faturamento do produto. Para obter mais informações sobre modelos de preço, consulte [Os modelos de preços de contêiner](pricing-container-products.md#pricing-models-for-server-products).

**nota**  
Adicionar uma dimensão de preço para um contrato com preços de consumo (por exemplo, pay-as-you-go preços para uso adicional) não está disponível no Portal de gerenciamento do AWS Marketplace.  
Você não pode alterar o modelo de preços entre contrato, uso e contrato com preços de consumo. Entre em contato com a equipe de [Operações do vendedor do AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/) para obter assistência.

1. Abra o Portal de gerenciamento do AWS Marketplace em [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e faça login na sua conta de vendedor.

1. Na página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), selecione o produto de contêiner que você deseja modificar.

1. Na lista suspensa **Solicitar alterações**, selecione **Atualizar dimensões de preços** e, em seguida, selecione **Adicionar dimensões de preços**.

1. Dependendo do modelo de preços, você pode adicionar dimensões do contrato ou dimensões de uso fornecendo informações sobre o **Identificador da API**, o **Nome de exibição** e a **Descrição**.

1. Escolha **Avançar** e insira o preço da dimensão do seu contrato.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status será atualizado para **Bem-sucedido** ou **Falha**. 

## Atualização de informações de dimensões
<a name="container-update-dimensions-information"></a>

É possível alterar as informações de dimensões do produto. Para obter mais informações sobre modelos de preço, consulte [Os modelos de preços de contêiner](pricing-container-products.md#pricing-models-for-server-products).

1. Abra o Portal de gerenciamento do AWS Marketplace em [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e faça login na sua conta de vendedor.

1. Na página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), selecione o produto de contêiner que você deseja modificar.

1. Na lista suspensa **Solicitar alterações**, selecione **Atualizar dimensões de preços** e, em seguida, selecione **Atualizar informações da dimensão**.

1. Você pode adicionar informações de dimensão fornecendo informações sobre o **Nome de exibição** e a **Descrição** da dimensão que você deseja atualizar.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status será atualizado para **Bem-sucedido** ou **Falha**. 

## Atualização dos termos de preços
<a name="container-update-pricing-terms"></a>

Você pode alterar os termos de preço do produto. Os termos de preço talvez precisem ser atualizados se você alterar os países nos quais seu produto é oferecido.

1. Abra o Portal de gerenciamento do AWS Marketplace em [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e faça login na sua conta de vendedor.

1. Na página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), selecione o produto de contêiner que você deseja modificar.

1. Na lista **Solicitar alterações**, selecione **Atualizar oferta pública** e, em seguida, selecione **Atualizar termos de preço**.

1. Os preços atuais são preenchidos previamente para você editar. Você pode excluir o preço atual e adicionar seu novo preço. Recomendamos que você analise os preços solicitados antes de enviar sua solicitação para análise.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status será atualizado para **Bem-sucedido** ou **Falha**.

**nota**  
Se você aumentar o preço de uma dimensão usando **Atualizar termos de preço**, não poderá atualizar os preços por 90 dias. Um aumento de preço bloqueia o preço por 90 dias a partir do dia em que você inicia a alteração. Esse bloqueio de preço só está em vigor para aumento de preço, não para redução de preço.

## Atualização da política de reembolso de um produto
<a name="container-update-refund-policy"></a>

Você pode atualizar a política de reembolso do produto. As atualizações da política de reembolso entram em vigor para todos os usuários. Para obter mais informações, consulte [Reembolsos e cancelamentos em AWS Marketplace](refunds.md). 

1. Abra o Portal de gerenciamento do AWS Marketplace em [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e faça login na sua conta de vendedor.

1. Na página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), selecione o produto de contêiner que você deseja modificar.

1. Na lista suspensa **Solicitar alterações**, selecione **Atualizar oferta pública** e, em seguida, selecione **Atualizar política de reembolso**.

1. A política de reembolso atual está pré-preenchida para você editar. Você pode excluir a política de reembolso atual e adicionar sua nova política de reembolso. Recomendamos que você analise a política de reembolso antes de enviar sua solicitação para análise. O envio da solicitação substitui a política de reembolso atual.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status será atualizado para **Bem-sucedido** ou **Falha**. 

# Atualizando a disponibilidade do produto em contêineres por país em AWS Marketplace
<a name="container-update-offer-avail-country"></a>

Como AWS Marketplace vendedor, você pode alterar os países nos quais seu produto em contêiner pode ser oferecido e assinado. Para obter mais informações, consulte [Países](regions-and-countries.md#product-countries). O procedimento a seguir mostra como atualizar a disponibilidade do produto de contêiner por país.

1. Abra o Portal de gerenciamento do AWS Marketplace em [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e faça login na sua conta de vendedor.

1. Na página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), selecione o produto de contêiner que você deseja modificar.

1. Na lista suspensa **Solicitar alterações**, selecione **Atualizar oferta pública** e, em seguida, selecione **Atualizar disponibilidade por país**.

1. Selecione uma das opções a seguir: 
   + **Todos os países**: disponível em todos os países com suporte.
   + **Todos os países com exclusões**: disponível em todos os países com suporte, exceto em países selecionados.
   + **Somente países permitidos**: disponível para comprar somente nos países que você especificar.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status será atualizado para **Bem-sucedido** ou **Falha**. 

# Atualizar seu contrato de licença de usuário final (EULA) para produtos de contêineres no AWS Marketplace
<a name="container-update-eula"></a>

Como vendedor do AWS Marketplace, você pode atualizar o contrato de licença do usuário final (EULA) para usar o [Contrato padrão para AWS Marketplace](standardized-license-terms.md#standard-contracts) ou um EULA personalizado. As atualizações feitas no EULA entram em vigor para novos usuários que assinam seu produto e renovações de produtos. Para atualizar seu EULA, siga o procedimento a seguir.

1. Abra o Portal de gerenciamento do AWS Marketplace em [https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/) e faça login na sua conta de vendedor.

1. Na página [https://aws.amazon.com/marketplace/management/products/server](https://aws.amazon.com/marketplace/management/products/server), selecione o produto de contêiner que você deseja modificar.

1. Na lista suspensa **Solicitar alterações**, selecione **Atualizar oferta pública** e, em seguida, selecione **Atualizar EULA**.

1. Selecione **Contrato padrão do AWS Marketplace** ou envie o EULA personalizado. Para obter um EULA personalizado, você deve fornecer o contrato de um bucket do Amazon S3.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status será atualizado para **Bem-sucedido** ou **Falha**. 

# Atualizando a política de reembolso para seu produto baseado em contêiner em AWS Marketplace
<a name="update-container-refund-policy"></a>

Como AWS Marketplace vendedor, você pode definir a política de reembolso para seu produto baseado em contêiner. Se quiser alterar a política de reembolso do seu produto, use a opção **Atualizar política de reembolso**. O procedimento a seguir mostra como atualizar sua política de reembolso.

**Para atualizar a política de reembolso**

1. Abra o endereço e[https://aws.amazon.com/marketplace/management/tour/](https://aws.amazon.com/marketplace/management/tour/), Portal de gerenciamento do AWS Marketplace em seguida, faça login na sua conta de vendedor.

1. Vá até [Produtos de servidor](https://aws.amazon.com/marketplace/management/products/server) e selecione o produto que você deseja modificar.

1. No menu suspenso **Solicitar alterações**, escolha **Atualizar oferta pública** e **Atualizar política de reembolso**.

1. Os detalhes da política de reembolso atual são fornecidos na caixa de texto para você editar. O envio da solicitação substitui a política de reembolso atual.

1. Escolha **Enviar** para enviar sua solicitação de revisão.

1. Verifique se a guia **Solicitações** mostra o **Status da solicitação** como **Em análise**. Quando a solicitação for concluída, o status se tornará **Bem-sucedido**.

# Testando e liberando seu produto de contêiner em AWS Marketplace
<a name="test-release-product"></a>

Depois de adicionar uma nova versão do seu produto de contêiner AWS Marketplace, você pode testar seu produto e depois lançá-lo ao público. Este tópico descreve as etapas e os processos específicos necessários para testar e lançar seu produto ao público.

**Topics**
+ [Opções imagem de contêiner e entrega de chart do Helm](#container-helm-delivery)
+ [Opção de entrega no complemento do Amazon EKS](#eks-addon-delivery)

## Opções imagem de contêiner e entrega de chart do Helm
<a name="container-helm-delivery"></a>

Esta seção fornece orientação sobre o lançamento da imagem de contêiner e chart do Helm.

Sua solicitação para uma nova versão foi criada e deve ser concluída em minutos. Você pode acompanhar a solicitação na guia **Solicitações** da página **Produtos do servidor**. Se você receber algum erro ao testar ou lançar seu complemento, consulte a tabela de erros síncronos em [Adicionar uma nova versão](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#container-add-version) na *Referência AWS Marketplace Catalog API *.

**nota**  
Se o produto estiver atualmente configurado para disponibilidade limitada, apenas os compradores para os quais o produto está disponível podem acessar a versão do produto. Se seu produto estiver atualmente configurado para disponibilidade pública, todos os AWS Marketplace compradores poderão acessar a versão do produto.

Se esse foi seu primeiro conjunto de versões, o produto agora está pronto para ser publicado.

## Opção de entrega no complemento do Amazon EKS
<a name="eks-addon-delivery"></a>

Esta seção fornece orientação sobre como testar e lançar o complemento do Amazon EKS.

**Testar seu complemento**
+ Depois de enviar seu complemento, AWS Marketplace processa sua solicitação e publica seu complemento em um estado limitado para você validar no catálogo de complementos do Amazon EKS. Você pode acompanhar a solicitação na guia **Solicitações** da página **Produtos do servidor** no Portal de gerenciamento do AWS Marketplace. Os tempos de ingestão variam de 5 a 10 dias úteis, dependendo do volume de solicitações que estamos tratando.

  Quando sua solicitação está no status **Sob análise**, o complemento ainda está sendo publicado pela AWS equipe no catálogo de AWS Marketplace complementos do Amazon EKS. O status da solicitação é alterado para **Sucesso** quando o complemento for publicado no estado **Limitado**. Você pode começar o teste do seu complemento depois disso.
+ Depois que seu complemento estiver disponível, você poderá encontrá-lo na região Ásia-Pacífico (Seul) para fins de teste. AWS Marketplace confia em sua experiência para verificar a funcionalidade do seu software. Para testar seu complemento, você deve criar um cluster Amazon EKS na região Ásia-Pacífico (Seul) em sua conta de vendedor onde seu complemento está na lista de permissões. Para testar seu complemento, siga [estas instruções detalhadas](https://aws.amazon.com/blogs/awsmarketplace/deploy-third-party-software-add-ons-aws-marketplace-amazon-eks-clusters/). Certifique-se de testar em cada versão do Kubernetes compatível com seu software.
+ Se você estiver oferecendo um produto pago, crie uma oferta privada para as seguintes Contas da AWS internas. Essas contas ajudam a integrar seu software ao console Amazon EKS em todas as Regiões da AWS comerciais.

  ```
  288092140294, 288092140294, 408202761791
  ```
+ Mantenha seu cluster de teste com o complemento ativo até AWS Marketplace aprovar e mover sua versão do complemento para o público.
**nota**  
AWS Marketplace não arcará com os custos de AWS infraestrutura incorridos durante o teste de seu produto de contêiner em seus clusters do Amazon EKS. Você pode seguir os mecanismos de dimensionamento corretos para reduzir os nós a um custo operacional mínimo enquanto verificamos os resultados do teste.

**Lançar seu complemento para o público**

Depois de validar seu software por meio do cluster Amazon EKS como um complemento, você pode enviar uma solicitação para lançar a versão do seu complemento Amazon EKS para o público usando o [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/) ou o AWS Marketplace Catalog API.

 Para obter mais informações, consulte [Atualizar a visibilidade de um complemento do Amazon EKS](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/container-products.html#update-delivery-option-visibility) em *Referência do AWS Marketplace Catalog API *.

Você pode acompanhar a solicitação na guia **Solicitações** da página **Produtos do servidor** no Portal de gerenciamento do AWS Marketplace. Os tempos de ingestão podem variar.

# Requisitos de produtos baseados em contêineres para AWS Marketplace
<a name="container-product-policies"></a>

AWS Marketplace mantém os seguintes requisitos para todos os produtos e ofertas baseados em contêineres em. AWS Marketplace Esses requisitos ajudam a promover um catálogo seguro e confiável para nossos clientes. Também incentivamos os vendedores a revisar a implementação de controles e protocolos adicionais, conforme aplicável, para atender às necessidades de produtos específicos.

Todos os produtos e seus metadados relacionados são revisados quando enviados para garantir que atendam ou excedam AWS Marketplace as políticas atuais. Essas políticas são atualizadas regularmente para se alinharem às diretrizes de segurança em evolução. AWS Marketplace examina continuamente os produtos para verificar se os anúncios existentes continuam atendendo a quaisquer alterações nesses requisitos. Se um produto não estiver em conformidade, AWS Marketplace entraremos em contato com o vendedor para atualizá-lo para atender aos novos padrões. Em alguns casos, os produtos podem permanecer indisponíveis temporariamente para novos assinantes até que os problemas sejam resolvidos. Esse processo ajuda a manter a segurança e a confiabilidade da AWS Marketplace plataforma para todos os usuários.

**Topics**
+ [Políticas de segurança](#container-security-requirements)
+ [Requisitos de informações do cliente](#container-customer-info-requirements)
+ [Requisitos de uso do produto](#container-usage-requirements)
+ [Requisitos de arquitetura](#container-architecture-requirements)
+ [Requisitos da estrutura de chart do Helm](#helm-chart-structure-requirements)
+ [Instruções de uso do produto de contêiner](#container-product-usage-instructions)
+ [Requisitos para produtos complementares do Amazon EKS](#publishing-eks-add-on)

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

 Todos os produtos baseados em contêiner devem cumprir os seguintes requisitos de segurança:
+ As imagens de contêiner não devem conter nenhuma vulnerabilidade, malware ou pacotes de software e sistemas operacionais End-of-Life (EoL) conhecidos.
+ Os contêineres não devem solicitar AWS credenciais para acessar os AWS serviços. Quando seu produto precisar acessar AWS serviços, você deverá usar uma das seguintes opções:
  + Perfis do IAM para contas de serviço, para workloads do Amazon Elastic Kubernetes Service (Amazon EKS).
  + Perfis do IAM para tarefas, para workloads do Amazon Elastic Container Service (Amazon ECS).
+ Os produtos baseados em contêiner devem exigir apenas privilégios mínimos para serem executados. Para obter mais informações, consulte [Segurança no Amazon Elastic Container Service](https://docs.aws.amazon.com//AmazonECS/latest/developerguide/security.html) e [Segurança no Amazon EKS](https://docs.aws.amazon.com//eks/latest/userguide/security.html).
+ Por padrão, as imagens de contêiner devem ser configuradas para serem executadas com privilégios não raiz.
+ Os contêineres não devem conter segredos codificados, como senhas (mesmo com hash) para usuários e serviços do sistema, chaves privadas, credenciais etc.
+ A autenticação em qualquer serviço em execução dentro do contêiner não deve usar autenticação baseada em senha, mesmo que a senha seja gerada, redefinida ou definida pelo usuário na inicialização. Senhas anuladas e em branco também não são permitidas.
+ As imagens de contêiner não devem incluir camadas com arquiteturas não compatíveis (por exemplo, metadados do Attestation Framework integrados).

## Requisitos de informações do cliente
<a name="container-customer-info-requirements"></a>

 Todos os produtos baseados em contêiner devem aderir aos requisitos de informações do cliente a seguir: 
+ O software não deve coletar ou exportar dados do cliente sem o conhecimento e o consentimento explícito do cliente, exceto conforme exigido por BYOL (traga a sua própria licença). Os aplicativos que coletam ou exportam dados de clientes devem seguir estas diretrizes: 
  + A coleta dos dados do cliente deve ser de autoatendimento, automatizada e segura. Os compradores não precisam esperar que os vendedores aprovem a implantação do software. 
  + A coleta de dados do cliente deve ser consistente com seus contratos com AWS, incluindo, mas não se limitando a, os [Termos e Condições do AWS Marketplace, os Termos](https://aws.amazon.com/legal/seller-terms/) de [AWS Serviço](https://aws.amazon.com/service-terms/), o [Aviso AWS de Privacidade](https://aws.amazon.com/privacy/) e o [Contrato AWS do Cliente](https://aws.amazon.com/agreement/).
  + As informações de pagamento não devem ser coletadas.

## Requisitos de uso do produto
<a name="container-usage-requirements"></a>

 Todos os produtos baseados em contêiner devem aderir aos requisitos de uso de produto a seguir: 
+ Os vendedores só podem listar produtos totalmente funcionais. Não são permitidos produtos beta ou em fase de pré-lançamento para fins de teste ou avaliação. As edições Developer, Community e BYOL de software comercial são suportadas se o vendedor fornecer uma versão paga equivalente em AWS Marketplace até 90 dias após o fornecimento da edição gratuita.
+ Todas as instruções de uso de um produto baseado em contêiner devem incluir todas as etapas para implantar produtos baseados em contêiner. As instruções de uso devem fornecer comandos e recursos de implantação apontando para as imagens de contêiner correspondentes no AWS Marketplace.
+ Os produtos baseados em contêiner devem incluir todas as imagens de contêiner de que um assinante precisa para usar o software. Além disso, os produtos baseados em contêineres não devem exigir que o usuário inicie o produto usando imagens externas AWS Marketplace (por exemplo, imagens de contêineres de repositórios de terceiros).
+ Os contêineres e o software devem ser implantados de forma autossuficiente e não devem exigir métodos ou custos adicionais de pagamento. Os aplicativos que exigem dependências externas na implantação devem seguir estas diretrizes:
  + O requisito deve ser divulgado na descrição ou nas instruções de uso da lista. Por exemplo, *Este produto requer uma conexão com a Internet para ser implantado corretamente. Os seguintes pacotes são baixados na implantação: <list of package>.* 
  + Os vendedores são responsáveis pelo uso e pela garantia da disponibilidade e segurança de todas as dependências externas. 
  + Se as dependências externas não estiverem mais disponíveis, o produto AWS Marketplace também deverá ser removido. 
  + As dependências externas não devem exigir métodos ou custos adicionais de pagamento.
+ Os contêineres que exigem uma conexão contínua com recursos externos que não estão sob o controle direto do comprador — por exemplo, externos APIs ou Serviços da AWS gerenciados pelo vendedor ou por terceiros — devem seguir estas diretrizes:
  + O requisito deve ser divulgado na descrição ou nas instruções de uso da lista. Por exemplo, *Este produto requer uma conexão contínua com a Internet. Os seguintes serviços externos contínuos são necessários para funcionar adequadamente: <list of resources>.* 
  + Os vendedores são responsáveis pelo uso e pela garantia da disponibilidade e segurança de todos os recursos externos.
  + Se os recursos externos não estiverem mais disponíveis, o produto AWS Marketplace também deverá ser removido.
  + Os recursos externos não devem exigir métodos de pagamento ou custos adicionais e a configuração da conexão deve ser automatizada.
+ Os metadados e software do produto não devem conter linguagem que redirecione os usuários para outras plataformas de nuvem, produtos adicionais ou serviços de vendas adicionais que não estão disponíveis no AWS Marketplace.
+ Se o produto for um complemento de outro produto ou produto de outro ISV, a descrição do produto deverá indicar que ele amplia a funcionalidade do outro produto e que, sem ele, seu produto tem utilidade muito limitada. Por exemplo, *Este produto amplia a funcionalidade de <nome do produto> e sem ele, este produto tem uma utilidade muito limitada. Observe que <nome do produto> pode exigir uma licença própria para a funcionalidade completa desta lista.*

## Requisitos de arquitetura
<a name="container-architecture-requirements"></a>

 Todos os produtos baseados em contêiner devem cumprir os seguintes requisitos de arquitetura: 
+ As imagens do contêiner de origem AWS Marketplace devem ser enviadas para o repositório Amazon Elastic Container Registry (Amazon ECR) de propriedade da. AWS Marketplace Você pode criar esses repositórios no Portal de gerenciamento do AWS Marketplace nos produtos de servidor para cada uma das suas listas de produtos de contêiner.
+ As imagens de contêiner devem ser baseadas em Linux.
+ Os produtos pagos baseados em contêiner devem ser implantados no [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html), no [Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) ou [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html).
+ Produtos pagos baseados em contêineres com preços contratuais e integração AWS License Manager devem ser implantados no Amazon EKS, Amazon ECS, Amazon EKS Anywhere AWS Fargate, Amazon ECS Anywhere, OpenShift Red Hat Service AWS on (ROSA), clusters Kubernetes autogerenciados no local ou no Amazon Elastic Compute Cloud.
+ Para produtos de chart do Helm, as referências de imagem de contêiner devem ser estruturadas de acordo com [Requisitos da estrutura de chart do Helm](#helm-chart-structure-requirements) para dar suporte à implantação entre regiões.
+ Se seu produto baseado em contêiner exigir que o comprador implante uma Amazon Machine Image (AMI), ela deve ser uma AMI AWS gerenciada ou uma AMI separada publicada em. AWS Marketplace Se você publicar sua própria AMI em AWS Marketplace, ela deverá estar em conformidade com o [Requisitos de produto baseados em AMI para AWS Marketplace](product-and-ami-policies.md) e você deverá indicar que é um produto complementar, conforme exigido no[Políticas de uso do produto](product-and-ami-policies.md#product-usage). Você pode precificar seu produto baseado em AMI como BYOL porque é uma extensão de sua oferta baseada em contêineres. AWS Marketplace examina produtos baseados em AMI em busca de vulnerabilidades e exposições comuns não corrigidas () e requisitos de segurança. CVEs Seus compradores também devem assinar seu produto baseado em AMI antes de implantá-lo.

## Requisitos da estrutura de chart do Helm
<a name="helm-chart-structure-requirements"></a>

Todos os produtos Helm Chart enviados AWS Marketplace devem cumprir os seguintes requisitos de estrutura para garantir a regionalização e a implantação adequadas em todas as regiões: AWS 
+ As referências à imagem do contêiner devem ser definidas exclusivamente no arquivo `values.yaml` e não codificadas em nenhum outro arquivo no chart do Helm. Isso permite AWS Marketplace substituir automaticamente essas referências ao replicar seu produto em diferentes regiões.
+ O `values.yaml` arquivo deve usar variáveis para todas as referências de imagem do contêiner.
+ Opcionalmente, você pode dividir `registry` e `tag` dividir campos separados no mesmo nível do repositório para criar sua referência de imagem.
+ Os modelos de Helm devem referenciar essas variáveis usando a sintaxe de modelagem Helm padrão (por exemplo, `{{ .Values.image.repository }}:{{ .Values.image.tag }}`).
+ Evite usar lógica condicional em modelos que ignorariam as referências de imagem definidas em `values.yaml`.
+ Ao testar seu gráfico do Helm com AWS regiões diferentes, certifique-se de que a alteração da região atualize `values.yaml` corretamente todas as referências de imagem nos recursos implantados.

AWS Marketplace valida se todas as referências de imagem do contêiner estão definidas adequadamente no `values.yaml` arquivo durante o processo de envio do produto. Os produtos que não atenderem a esses requisitos serão rejeitados.

### Requisitos para referências de imagens de contêineres em gráficos Helm
<a name="helm-chart-best-practices"></a>

A seguir, demonstramos abordagens para estruturar referências de imagens de contêineres em gráficos do Helm:

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

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

**nota**  
Recomendamos a abordagem acima para a estrutura do `values.yaml`, mas os métodos alternativos abaixo também são 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 o modelo de implantação, o formato abaixo é o único formato válido disponível.

**Modelo de implantação:**

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

**Abordagem incorreta (não use):**

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

### Possíveis erros de validação do gráfico Helm
<a name="helm-chart-validation-errors"></a>

Durante o processo de envio do produto, AWS Marketplace realiza verificações de validação nos produtos Helm Chart para garantir a conformidade com os requisitos de referência de imagens de contêineres. Se o gráfico do Helm não atender a esses requisitos, você poderá encontrar os seguintes erros de validação:


| Erro | Explicação | 
| --- | --- | 
| INCOMPATIBLE\$1HELM\$1OBJECTS | Os objetos Helm especificados não são compatíveis com complementos do EKS. Consulte [Requisitos para produtos complementares do Amazon EKS](#publishing-eks-add-on). | 
| INVALID\$1DEPENDENT\$1HELM\$1CHARTS | Os gráficos do Helm dependentes devem estar contidos no diretório de gráficos principais e não devem ser fornecidos externamente. | 
| INVALID\$1HELM\$1SENSITIVE\$1CONFIG | O esquema de configuração não pode conter campos que coletem informações confidenciais. Os esquemas de configuração não devem aceitar senhas, chaves de API, certificados ou segredos. Em vez disso, forneça campos para nomes secretos do Kubernetes que os clientes criarão separadamente. | 
| INVALID\$1HELM\$1CHART\$1IMAGES | [Todas as imagens, incluindo dependências de código aberto, devem ser enviadas aos repositórios do AWS Marketplace Amazon ECR criados por meio da solicitação Adicionar repositório.](container-add-version.md#add-repositories) | 
| INVALID\$1HELM\$1UNDECLARED\$1IMAGES | Todas as referências de imagens de contêiner devem ser listadas explicitamente na solicitação [Adicionar versão](container-add-version.md#add-new-version). | 
| INVALID\$1HELM\$1LINT | A helm lint validação do gráfico Helm falhou. Execute helm lint localmente para identificar e corrigir problemas estruturais ou sintáticos. Use a versão Helm 3.19.0 ou posterior. | 
| INVALID\$1HELM\$1TEMPLATE | A helm template validação do gráfico Helm falhou. O gráfico não pode ser renderizado em manifestos válidos do Kubernetes. Teste localmente helm template para identificar erros lógicos ou de sintaxe do modelo. Use a versão Helm 3.19.0 ou posterior. | 
| MISSING\$1HELM\$1DEPLOYMENT\$1CONFIG | O gráfico do Helm para um complemento do Amazon EKS deve conter uma implantação ou DaemonSet um recurso. O Amazon EKS exige pelo menos um desses tipos de carga de trabalho para o gerenciamento complementar do ciclo de vida. Consulte [Requisitos para produtos complementares do Amazon EKS](#publishing-eks-add-on). | 
| INCOMPATIBLE\$1CONFIGURATION\$1SCHEMA\$1VERSION | A versão do esquema JSON em não aws\$1mp\$1configuration\$1schema.json é suportada. Consulte [Requisitos de esquema](#schema-requirements) para ver as versões de esquema compatíveis. | 
| INVALID\$1IMAGE\$1REFERENCE | Todas as imagens devem ser definidas como variáveis values.yaml e referenciadas usando a sintaxe do modelo Helm, conforme descrito em. [Requisitos da estrutura de chart do Helm](#helm-chart-structure-requirements) | 
| MISSING\$1VALUES\$1IMAGE\$1REFERENCE | Cada referência de imagem de contêiner deve ter uma entrada correspondente emvalues.yaml. | 
| MISSING\$1IMAGE\$1TAG | As referências à imagem do contêiner values.yaml devem incluir valores de tag explícitos ou usar como padrão a versão do gráfico deChart.yaml. | 

## Instruções de uso do produto de contêiner
<a name="container-product-usage-instructions"></a>

Ao criar as instruções de uso do produto de contêiner, siga as etapas e as orientações em [Criação de instruções de uso de produtos de contêiner e AMI para AWS Marketplace](ami-container-product-usage-instructions.md). 

### Instruções de uso do chart do Helm
<a name="helm-chart-usage-instructions"></a>

Ao criar instruções de uso para produtos de chart do Helm:
+ Documente claramente todos os parâmetros configuráveis no arquivo `values.yaml`, inclusive repositório de imagens, tags e parâmetros de registro.
+ Dê exemplos de como substituir esses parâmetros ao instalar o chart do Helm.
+ Não instrua os usuários a modificar nenhum arquivo diferente de `values.yaml` ou a usar parâmetros `--set` parâmetros ao instalar o gráfico.
+ Inclua informações sobre como o produto lida com a regionalização de imagens de contêiner.

## Requisitos para produtos complementares do Amazon EKS
<a name="publishing-eks-add-on"></a>

Um complemento do Amazon EKS é um software que fornece recursos operacionais para aplicações Kubernetes, mas que não é específico da aplicação. Por exemplo, um complemento do Amazon EKS inclui agentes ou Kubernetes drivers de observabilidade que permitem que o cluster interaja com AWS recursos subjacentes para rede, computação e armazenamento.

Como vendedor de produtos de contêineres, você pode escolher entre várias opções de implantação, incluindo o Amazon EKS. Você pode publicar uma versão do seu produto como um AWS Marketplace complemento no catálogo de complementos do Amazon EKS. Seu complemento aparece no console do Amazon EKS ao lado dos complementos mantidos por AWS e outros fornecedores. Os compradores podem implantar o software como um complemento com a mesma facilidade com que usam os outros complementos.

Para obter mais informações, consulte [Complementos do Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html), no *Guia do usuário do Amazon EKS*.

### Preparando seu produto de contêiner como um AWS Marketplace complemento
<a name="preparing-eks-addon"></a>

Para publicar seu produto de contêiner como um AWS Marketplace complemento, ele deve atender aos seguintes requisitos:
+ Seu produto de contêiner deve ser publicado em AWS Marketplace.
+ Seu produto de contêiner deve ser construído de forma compatível com ambas AMD64 as ARM64 arquiteturas.
+ O produto de contêiner não deve usar o [modelo de preço](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-container-products.html) traga a sua própria licença (BYOL).
**nota**  
O BYOL não é compatível com a entrega do complemento do Amazon EKS.
+ Você deve cumprir todos os [requisitos de produtos baseados em contêineres](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-policies.html), incluindo o envio de todas as imagens e Helm gráficos de contêineres para repositórios gerenciados do AWS Marketplace Amazon ECR. Esse requisito inclui imagens de código aberto, por exemplo, `nginx`. Imagens e gráficos não podem ser hospedados em outros repositórios externos, incluindo, mas não se limitando a, [Galeria pública do Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/public/public-repositories.html), Docker Hub e Quay.
+ **Charts do Helm**: prepare e empacote o software como um chart do Helm. A estrutura complementar do Amazon EKS converte um chart do Helm em um manifesto do Kubernetes. Alguns recursos do Helm não são compatíveis com os sistemas Amazon EKS. A lista a seguir descreve os requisitos que devem ser atendidos antes da integração do software como um complemento do Amazon EKS. Nessa lista, todos os Helm comandos usam a Helm versão 3.19.0:
  + Todos os `Capabilities` objetos são suportados, com exceção de`.APIVersions`. `.APIVersions`não é compatível com non-built-in customização Kubernetes APIs.
  + Somente os objetos ```Release.Name` e `Release.Namespace` são compatíveis.
  + Os hooks Helm e as funções `lookup` não são compatíveis.
  + Todos os gráficos dependentes devem estar localizados no chart do Helm principal (especificado com o arquivo de caminho do repositório://...).
  + O chart do Helm deve passar com sucesso pelo Helm Lint e pelo Helm Template sem erros. O comando é o seguinte:
    + Helm Lint – `helm lint helm-chart`

      Problemas comuns incluem gráficos não declarados nos metadados do gráfico principal. Por exemplo, `chart metadata is missing these dependencies: chart-base Error: 1 chart(s) linted, 1 chart(s) failed`.
    + Helm Modelo – `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`

      Passe todas as configurações substituídas com a bandeira `-f`.
  + Armazene todos os binários do contêiner nos repositórios AWS Marketplace do Amazon ECR. Para criar um manifesto, use o comando de modelo Helm mostrado anteriormente. Pesquise no manifesto qualquer referência de imagem externa, como imagens `busybox` ou `gcr`. Faça upload de todas as imagens do contêiner junto com as dependências nos repositórios do AWS Marketplace Amazon ECR criados usando a opção **Adicionar repositório** no menu suspenso de solicitações.
+ **Configuração personalizada**: você pode adicionar variáveis personalizadas durante a implantação. Para obter informações sobre como identificar a experiência do usuário final, nomear o software `aws_mp_configuration_schema.json` e empacotá-lo em um invólucro com o chart do Helm, consulte [Complementos do Amazon EKS: configuração avançada](https://aws.amazon.com/blogs/containers/amazon-eks-add-ons-advanced-configuration/).

  De acordo com [a palavra-chave “\$1schema”](https://json-schema.org/draft/2020-12/json-schema-core#name-the-schema-keyword), `$schema` deve ser um URI que aponte para um recurso válido `application/schema+json`.

  Esse arquivo não deve aceitar nenhuma informação confidencial, como senhas, chaves de licença e certificados.

  Para lidar com segredos e instalações de certificados, você pode fornecer etapas de pre-Add-on pós-instalação ou instalação aos usuários finais. O produto não deve depender de nenhuma licença externa. O produto deve funcionar com base em direitos do AWS Marketplace .

  Para obter mais informações sobre `aws_mp_configuration_schema.json`, consulte [Requisitos de configuração complementar e melhores práticas para fornecedores de complementos](#eks-addon-configuration).
+ **Identifique e crie o namespace no qual o software será implantado em**: primeira versão do seu produto, você deve identificar o namespace no qual o software será implantado adicionando um namespace modelado.
+ **Definições de recursos personalizadas (CRDs)** — A estrutura de complementos do Amazon EKS não oferece suporte à instalação CRDs e às declarações de recursos personalizadas com base na CRDs aplicação do mesmo complemento. Se seu complemento tiver recursos personalizados e depender deles CRDs, você pode: 
  + **Publique dois complementos:** divida a definição de CRD em um complemento à parte (chart do Helm à parte) e a instalação do [recurso personalizado](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) real em um complemento à parte.
  + **Publique um único complemento com instruções manuais adicionais:** Publique um único complemento que instale o CRDs cluster. Forneça instruções de uso junto com os arquivos de manifesto do kubernetes para que os usuários finais configurem recursos personalizados que dependam deles. CRDs
+ **Crie o, `serviceAccount` se aplicável** — Se o software for um software pago ativado AWS Marketplace ou precisar se conectar a outro Serviços da AWS, certifique-se de que o Helm gráfico seja criado `serviceAccount` por padrão. Se a criação do `serviceAccount` for feita por um parâmetro em um arquivo `values.yaml`, defina o valor do parâmetro como `true`. Por exemplo, .`serviceAccount.create = true` Isso é necessário porque o cliente pode optar por instalar o complemento herdando as permissões da instância do nó subjacente, que já tem as permissões necessárias. Se o chart do Helm não criar o `serviceAccount`, as permissões não poderão ser vinculadas ao `serviceAccount`.
+ **Implantações ou conjuntos de daemons rastreáveis**: certifique-se de que seu chart do Helm tenha um daemonset ou uma implantação. A estrutura de complementos do Amazon EKS rastreia a implantação de seus recursos do Amazon EKS usando-os. Sem uma implantação rastreável ou um daemonset, seu complemento enfrentará um erro de implantação. Se seu complemento não tiver uma implantação ou um daemonset, por exemplo, se ele implantar vários recursos personalizados ou um trabalho do Kubernetes que não são rastreáveis, adicione uma implantação fictícia ou um objeto daemonset.
+ **Support para arquiteturas AMD e ARM** — Muitos clientes do Amazon EKS usam ARM64 hoje para usar instâncias AWS Graviton. O software de terceiros deve oferecer suporte a ambas as arquiteturas.
+ **Integre-se ao licenciamento ou à medição APIs do AWS Marketplace** — AWS Marketplace suporta vários modelos de cobrança. Para obter mais informações, consulte [Integrações de faturamento, medição e licenciamento de produtos de contêiner](container-products-billing-integration.md). Se você quiser vender o produto por meio de mecanismos de PAYG, consulte [Configurar a medição personalizada para produtos de contêineres com o Serviço de medição do AWS Marketplace](container-metering-meterusage.md). Se você quiser vender seu produto por meio de um modelo inicial ou de contrato, consulte [Preços contratuais para produtos em contêineres com AWS License Manager](container-license-manager-integration.md). 
+ **Faça o upload do software e de todos os artefatos e dependências**: o chart do Helm deve ser independente e não deve exigir dependências de fontes externas, por exemplo, GitHub. Se o software exigir dependências externas, as dependências devem ser enviadas para repositórios privados do AWS Marketplace Amazon ECR sob a mesma lista. AWS Marketplace 
+ **Forneça instruções de implantação em seu site**: solicitamos que você hospede um guia de implantação para que os clientes identifiquem como implantar seu software por meio do comando [create-addon](https://docs.aws.amazon.com/cli/latest/reference/eks/create-addon.html).
+ ** permissions/IAM Funções complementares** — Se o complemento publicado em AWS Marketplace exigir acesso a um AWS serviço, seu software deverá ter uma conta de serviço do Kubernetes anotada com as políticas do IAM para acessar os serviços. AWS Você pode escolher entre duas opções de sua conta de serviço para fazer solicitações de API aos AWS serviços:
  + Credenciais por meio de IRSA: esta opção permite que o software obtenha credenciais presumidas do Identity and Access Management (IAM) Role Service (IRSA). Para obter mais informações, consulte [Perfis do IAM para contas de serviço](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html). 
  + Identidade de pod do Amazon EKS: essa opção permite que seu software use a identidade do pod do Amazon EKS para fazer solicitações de API aos AWS serviços. Para obter mais informações, consulte [Saiba como o EKS Pod Identity concede aos pods acesso aos serviços AWS](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)

  O complemento deve ter um arquivo de configuração adicional chamado `aws_mp_addon_parameters.json` no nível superior do chart do Helm, no mesmo diretório do esquema de configuração personalizado atual (`aws_mp_configuration_schema.json`). Atualmente, esse arquivo só processa permissões compatíveis com a identidade de pods. O formato do arquivo é este: 

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

  **Nome do arquivo: `aws_mp_addon_parameters.json`**
**nota**  
O arquivo `aws_mp_addon_parameters.json` habilita a seção **Acesso a complementos** na página **Definições de configuração do complemento** do console do Amazon EKS    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/marketplace/latest/userguide/container-product-policies.html)
**nota**  
Pay-as-you-go Os produtos complementares (PAYG) da não AWS Marketplace podem usar o Amazon EKS Pod Identity e devem usar o IAM Roles for Service Accounts (IRSA) para controle de acesso.
+ **Atualizações de versão**: o Amazon EKS lança novas versões do Kubernetes algumas semanas após o lançamento upstream. À medida que as novas versões do cluster Amazon EKS se tornam disponíveis ao público em geral, os fornecedores têm 45 dias para certificar ou atualizar seu software para que seja compatível com a nova versão do cluster Amazon EKS. Se suas versões atuais do complemento forem compatíveis com a nova versão do Kubernetes, valide e certifique a mesma para que possamos atualizar a matriz de compatibilidade da versão. Se for necessária uma nova versão complementar para dar suporte à nova versão do Kubernetes, envie a nova versão para integração.
+ O software do parceiro deve se enquadrar em um dos seguintes tipos ou ser um software operacional que aprimorará o Kubernetes ou o Amazon EKS: Gitops \$1 monitoramento \$1 registro \$1 gerenciamento de certificados \$1 gerenciamento de políticas \$1 gerenciamento de custos \$1 escalonamento automático \$1 armazenamento \$1 gerenciamento de kubernetes \$1 service-mesh \$1 etcd-backup \$1 \$1 balanceador de carga \$1 registro local \$1 rede \$1 segurança \$1 backup \$1 controlador de ingresso \$1 observabilidade ingress-service-type
+ O software não pode ser a [Container Network Interface (CNI).](https://github.com/containernetworking/cni)
+ O software deve ser vendido AWS Marketplace e integrado ao licenciamento e à medição de produtos APIs pagos. Produtos BYOL não são aceitos.

### Requisitos de configuração complementar e melhores práticas para fornecedores de complementos
<a name="eks-addon-configuration"></a>

O Amazon EKS exige configuração como uma string de [esquema Helm JSON](https://helm.sh/docs/topics/charts/#schema-files) de provedores complementares. Os complementos que precisam das configurações necessárias ou permitem configurações opcionais devem incluir um `aws_mp_configuration_schema.json` arquivo com o Helm Chart enviado para. AWS Marketplace O Amazon EKS usará esse esquema para validar a entrada de configuração dos clientes e rejeitar chamadas de API com valores de entrada que não estejam em conformidade com o esquema. As configurações complementares geralmente se enquadram em duas categorias:
+ Configuração para propriedades gerais do Kubernetes, como rótulos, tolerâncias, nodeSelector etc.
+ Configurações específicas do complemento, como chave de licença, ativação de recursos etc. URLs

Esta seção se concentra na primeira categoria relacionada às propriedades gerais do Kubernetes.

O Amazon EKS recomenda seguir as melhores práticas de configuração dos complementos do Amazon EKS.
+ [Requisitos de esquema](#schema-requirements)
+ [Parâmetros comuns que são permitidos para configuração](#parameters-allowed)
+ [Parâmetros comuns que não são permitidos para configuração](#parameters-not-available)

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

Ao definir o esquema json, certifique-se de usar uma versão do jsonschema compatível com os complementos do Amazon EKS. 

A lista de esquemas compatíveis:
+ 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

O uso de qualquer outra versão do esquema json é incompatível com os complementos do Amazon EKS e fará com que o complemento não possa ser lançado até que isso seja corrigido.

**Exemplo de arquivo de esquema 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**  
Os parâmetros de configuração devem ser CamelCase e serão rejeitados se não seguirem esse formato.

**As descrições são obrigatórias**  
Sempre inclua descrições significativas para as propriedades do esquema. Essa descrição será usada para renderizar nomes de rótulos no console Amazon EKS para cada parâmetro de configuração.

**Definição de RBAC**  
Os provedores de complementos precisam definir e fornecer as permissões de RBAC necessárias para instalar o complemento com êxito usando o princípio do privilégio mínimo. Se as permissões do RBAC precisarem ser alteradas para versões mais recentes do complemento ou quaisquer correções para abordar um CVE, os provedores de complementos precisarão informar a equipe do Amazon EKS sobre essa alteração. As permissões necessárias para cada recurso do Kubernetes devem ser restritas ao nome do recurso do objeto.   

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

**Gerenciamento de segredos**  
Esta seção se aplica somente a complementos que precisam que os clientes configurem informações secretas, como chave da aplicação, chave de API, senha etc. Atualmente, o Amazon EKS APIs não suporta a transmissão de informações secretas em texto simples devido às implicações de segurança. No entanto, os clientes podem usar a configuração para passar o nome do segredo do Kubernetes que contém as chaves necessárias para o complemento. Os clientes precisarão criar objetos secretos do Kubernetes contendo as chaves com o mesmo namespace como etapa de pré-requisito e, em seguida, passar o nome do segredo usando o blob de configuração ao criar o complemento. Recomendamos que os provedores de complementos nomeiem as propriedades do esquema para que os clientes não as confundam acidentalmente com a chave real. Por exemplo: appSecretName, connectionSecretName etc.   
Em resumo, os provedores de complementos podem aproveitar o esquema para permitir que os clientes passem o nome do segredo, mas não as chaves que realmente conterão o segredo em si. 

**Exemplos de valores de configuração**  
Você pode incluir exemplos de configuração em seu esquema para ajudar os clientes na configuração de complementos. O exemplo a seguir é do esquema do 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 comuns que são permitidos para configuração
<a name="parameters-allowed"></a>

A seguir estão os parâmetros recomendados em um arquivo de esquema do Helm voltado para o cliente.


| Parameter | Description | Deveria ter um padrão? | 
| --- | --- | --- | 
| additionalLabels | Adicione rótulos do Kubernetes a todos os objetos do Kubernetes gerenciados pelo complemento. | Não | 
| additionalAnnotations | Adicione anotações do Kubernetes a todos os objetos do Kubernetes gerenciados pelo complemento. | Não | 
| podLabels | Adicione rótulos do Kubernetes aos pods gerenciados pelo complemento. | Não | 
| podAnnotations | Adicione anotações do Kubernetes aos pods gerenciados pelo complemento. | Não | 
| logLevel | Nível de registro para componentes gerenciados pelo complemento. | Sim | 
| nodeSelector | Forma mais simples recomendada de restrição de seleção de nós. Você pode adicionar o campo nodeSelector à especificação do pod e especificar os rótulos dos nós que você deseja que o nó de destino tenha. | Potencialmente, por exemplo, somente nós Linux | 
| tolerations | As tolerâncias são aplicadas aos frutos. As tolerâncias permitem que o programador programe pods com taints correspondentes. As tolerâncias permitem o agendamento, mas não garantem o agendamento. | Talvez, mais comum com daemonsets | 
| affinity | O recurso de afinidade consiste em dois tipos de afinidade: a afinidade de nós funciona como o campo nodeSelector, mas é mais expressiva e permite especificar regras flexíveis; a afinidade/antiafinidade entre pods permite restringir os pods aos rótulos de outros pods. | Talvez | 
| topologySpreadConstraints | Você pode usar restrições de dispersão de topologia para controlar como os pods são distribuídos nó cluster entre domínios de falha, como regiões, zonas, nós e outros domínios de topologia definidos pelo usuário. Isso pode ajudar a alcançar alta disponibilidade, bem como a utilização eficiente de recursos. | Talvez | 
| solicitação/limites de recursos | Especifique o quanto cpu/memory cada contêiner precisa. É altamente recomendável que as solicitações sejam definidas. Os limites são opcionais. | Sim | 
| réplicas | Número de réplicas dos pods gerenciados pelo complemento. Não aplicável para daemonsets. | Sim | 

**nota**  
Para os parâmetros de configuração do agendamento de workload, talvez seja necessário separar os componentes de nível superior no Esquema, quando necessário. Por exemplo, o driver CSI do Amazon EBS contém dois componentes principais, controlador e agente de nó. Os clientes precisam de um nó diferente selectors/tolerations para cada componente. 

**nota**  
Os valores padrão definidos no esquema JSON são apenas para fins de documentação do usuário e não substituem a necessidade de ter o padrão correto no arquivo `values.yaml`. Se estiver usando a propriedade padrão, certifique-se de que o padrão em `values.yaml` corresponda ao do esquema e dos dois artefatos (`values.schema.json` e `values.yaml`) permaneça sincronizado sempre que forem feitas alterações no chart do 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 comuns que não são permitidos para configuração
<a name="parameters-not-available"></a>

Parâmetros de metadados de cluster como `clusterName`, `region`, `vpcId`, `accountId`, e outros, podem ser exigidos por vários complementos (por exemplo, Elastic Load Balancing Controller). Qualquer parâmetro semelhante a esses que seja conhecido pelo serviço Amazon EKS será automaticamente injetado pelos complementos do Amazon EKS e não será da responsabilidade do usuário especificar como opção de configuração. Esses parâmetros incluem:
+ AWS região
+ Nome do cluster do Amazon EKS
+ ID de VPC do cluster
+ Registro de contêineres, especificamente para contas build-prod, que é usado por complementos de rede
+ IP do cluster DNS, especificamente para o complemento coredns
+ Endpoint de API de cluster do Amazon EKS
+ IPv4 habilitado no cluster
+ IPv6 habilitado no cluster
+ Delegação de prefixo para IPv6 habilitado no cluster

Os provedores de complementos precisam garantir que você tenha modelos definidos para esses parâmetros aplicáveis. Cada um dos parâmetros acima terá um atributo `parameterType` predefinido definido pelo Amazon EKS. Os metadados da versão especificarão o mapeamento entre o `parameterType` e o name/path do parâmetro no modelo. Dessa forma, os valores podem ser transmitidos dinamicamente pelo Amazon EKS sem exigir que os clientes os especifiquem por meio de configurações, além de oferecer flexibilidade aos provedores complementares para definir seu próprio nome/caminho de modelo. Parâmetros como os acima, que o Amazon EKS precisa injetar dinamicamente, devem ser excluídos do arquivo do esquema.

**Exemplo de mapeamento a partir dos metadados da versão**

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

A seguir estão os parâmetros que não devem ser configurados em um arquivo de esquema Helm voltado para o cliente. Os parâmetros devem ter padrões não modificáveis ou não devem ser incluídos no modelo complementar.


| Parâmetro | Description | Deveria ter um padrão? | 
| --- | --- | --- | 
| image | Imagem do contêiner que será implantada no cluster Kubernetes. | Não, gerenciado por meio da definição de complemento | 
| imagePullSecrets | Configurando um pod para usar um segredo para extrair de um registro privado. | N/D | 
| livenessProbe | O processo Kubelet usa sondas de atividade para saber quando reiniciar um contêiner. Por exemplo, testes de atividade podem detectar um impasse em que uma aplicação está em execução, mas não consegue progredir. Reiniciar um contêiner nesse estado pode ajudar a tornar a aplicação mais disponível, apesar dos bugs. | Sim | 
| readinessProbe | É importante que você tenha uma sonda de prontidão para seus contêineres. Dessa forma, o processo Kubelet executado em seu plano de dados saberá quando o contêiner está pronto para atender ao tráfego. Um pod é considerado pronto quando todos os seus contêineres estão prontos. Um uso desse sinal é controlar quais pods são usados como backends para serviços. Quando um pod não está pronto, ele é removido dos balanceadores de carga de serviço. | Sim | 
| startupProbe | O kubelet usa testes de inicialização para saber quando uma aplicação de contêiner foi iniciado. Se essa sonda estiver configurada, ela desativa as verificações de atividade e prontidão até que seja bem-sucedida, garantindo que essas sondas não interfiram na inicialização da aplicação. Isso pode ser usado para adotar verificações de atividade em contêineres de inicialização lenta, evitando que eles sejam eliminados pelo kubelet antes de serem instalados e funcionando. | Opcional | 
| podDisruptionBudget | Defina um orçamento de interrupção do pod (PDB) para garantir que um número mínimo de PODS continue funcionando durante interrupções voluntárias. Um PDB limita o número de pods de uma aplicação replicada que ficam inativas simultaneamente devido a interrupções voluntárias. Por exemplo, uma aplicação baseada em quórum gostaria de garantir que o número de réplicas em execução nunca fique abaixo do número necessário para um quórum. Um frontend da web pode querer garantir que o número de réplicas que atendem à carga nunca caia abaixo de uma certa porcentagem do total. | Sim, se usar como padrão mais de duas réplicas | 
| serviceAccount (nome) | Nome da conta de serviço sob a qual os pods serão executados. | Sim | 
| serviceAccount (anotações) | Anotações aplicadas à conta de serviço. Normalmente usado para o recurso perfil do IAM para contas de serviço | Não, o ARN da função da conta de serviço do IAM está definido na API de complementos de alto nível do Amazon EKS. Uma exceção a essa regra é se seu complemento tiver várias deployments/controllers (como o Flux) e exigir uma função IRSA separada. ARNs | 
| priorityClassName | A prioridade indica a importância de um pod em relação a outros pods. Se um pod não puder ser agendado, o programador tentará antecipar (despejar) pods de menor prioridade para possibilitar o agendamento do pod pendente. | Sim. A maioria dos complementos é essencial para a funcionalidade do cluster e deve ter uma classe de prioridade definida por padrão. | 
| podSecurityContext | Um contexto de segurança define as configurações de privilégio e controle de acesso para todos os contêineres em um pod. Normalmente usado para definir o fsGroup, o que era necessário para o IRSA em clusters v1.19 e inferiores. | Improvável, já que o Amazon EKS não é mais compatível com o Kubernetes v1.19 | 
| securityContext | Um contexto de segurança define as configurações de privilégio e controle de acesso para todos os contêineres em um pod. | Sim | 
| updateStrategy | Especifica a estratégia usada para substituir os pods antigos por novos. | Sim | 
| nameOverride | Substitua o nome dos pods. | Não | 
| podSecurityPolicy |  Imponha restrições aos parâmetros.  | Não - PSPs estão obsoletas | 
| extraVolumeMounts/Volumes extras |  Usado para IRSA em clusters que não são do Amazon EKS.   | Não | 

# Preços de produtos de contêiner para AWS Marketplace
<a name="pricing-container-products"></a>

Ativado AWS Marketplace, você pode listar produtos gratuitos, produtos do modelo Bring Your Own License (BYOL) e produtos pagos para o Amazon Elastic Container Service (Amazon ECS), o Amazon Elastic Kubernetes Service (Amazon EKS) e. AWS FargateÉ possível definir apenas um preço por produto. Este tópico descreve os modelos de definição de preço disponíveis para produtos de contêineres. 

**nota**  
Use o [Serviço de medição do AWS Marketplace](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) para aplicar autorização e medir o uso dos produtos pagos. Para definição de preço por tarefa ou por pod, o uso é medido automaticamente pela AWS.

O preço que você define para um produto em contêiner se aplica a todos Regiões da AWS. Sempre que você baixa o preço de um produto de contêiner, o novo preço é implementado aos compradores imediatamente. Para aumentos de preço, os compradores existentes são notificados sobre a alteração 90 dias antes de afetar o faturamento. O novo valor é cobrado dos novos compradores.

**nota**  
Para novos assinantes, a alteração de preço entra em vigor imediatamente. Para assinantes existentes, a alteração de preço entra em vigor no primeiro dia do mês após um período de 90 dias que começa na data em que a notificação de alteração de preço é enviada. Por exemplo, digamos que você envie uma notificação de alteração de preço em 16 de março. O dia 16 de junho é cerca de 90 dias depois de 16 de março. Como a alteração de preço ocorre no primeiro dia do mês seguinte ao período de 90 dias, a data efetiva da alteração é 1º de julho.

**Topics**
+ [Os modelos de preços de contêiner](#pricing-models-for-server-products)

## Os modelos de preços de contêiner
<a name="pricing-models-for-server-products"></a>

AWS Marketplace tem vários modelos de preços para produtos em contêineres. 

A tabela a seguir fornece informações gerais sobre modelos de definição de preço para produtos baseados em contêiner.


**Modelos de definição de preço para produtos de contêiner**  

| Modelo de definição de preços | Description | 
| --- | --- | 
| Traga a sua própria licença (BYOL) | O BYOL é gerenciado externamente AWS Marketplace por meio de um relacionamento de cobrança externo que você mantém com o comprador. Seu software no contêiner não se integra ao AWS Marketplace faturamento. | 
| Mensal | **Preço mensal fixo**Um preço mensal fixo que oferece aos usuários uso ilimitado do produto durante o mês seguinte.Exemplo: defina o preço do produto em 99 USD por mês. O produto inclui três imagens de contêiner diferentes implantadas usando-se uma definição de tarefa do Amazon ECS.Depois de assinar o produto, o comprador será cobrado imediatamente em 99 USD, valor que se repetirá a cada mês até ele cancelar a assinatura. O comprador também obtém uso ilimitado do produto. O comprador também paga separadamente por qualquer infraestrutura na qual as tarefas são executadas. Como assinantes, eles podem acessar as imagens de contêiner. É possível iniciar e executar qualquer número de contêineres dessas imagens no Amazon ECS ou no Amazon EKS em qualquer configuração.Se o comprador cancelar sua assinatura no meio de um mês, perderá o acesso ao repositório Amazon ECR onde AWS Marketplace armazena as imagens do contêiner. O comprador pode ter retirado e armazenado as imagens originais. No entanto, eles não podem mais extrair novas versões de imagem de contêiner que você disponibiliza por meio delas AWS Marketplace. O comprador é reembolsado pela parte não utilizada do último mês. Você é pago com base no uso do comprador menos a taxa acordada AWS Marketplace . | 
| Dimensões personalizadas de preços medidos |  Preços personalizados por medida com base nas dimensões definidas (por exemplo, usuários, nós, repositórios ou GB), até 24 dimensões por produto.  Exemplo: o produto cobra por usuários. Você tem usuários administrativos e usuários regulares e determina a definição de preço como 2 USD para usuários administradores e 1 USD para usuários regulares. É possível configurá-las como dimensões separadas ao listar o produto. Você cobra por usuários conectados por dia e mede esse uso por dia. Para saber mais sobre medição personalizada para definição de preço com base no uso, consulte [Configurar a medição personalizada para produtos de contêineres com o Serviço de medição do AWS Marketplace](container-metering-meterusage.md).  | 
| Preço por hora por tarefa ou por pod |  **Tarefa do Amazon ECS ou pod do Amazon EKS** Definição de preço por tarefa do Amazon ECS ou por pod do Amazon EKS que medimos para o segundo com o preço definido por hora. Exemplo: o produto inclui três imagens de contêiner diferentes: um nó de controlador, um nó de operador e um nó de análise. Como o produto não está funcionando ou é útil sem o nó de controlador, você decide que se trata da imagem cujo uso deseja cobrar. Defina um preço de 6 USD por hora. Modifique o software na imagem de contêiner do nó de controlador a ser integrado à operação de API [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) de `RegisterUsage`. Isso garante que somente compradores com uma assinatura ativa possam iniciar e executar essa imagem de contêiner e o uso seja medido com base no tempo de execução. O comprador é cobrado em 6 USD por hora de uso para cada pod do controlador do Amazon EKS em execução. Se o comprador executar cinco pods do controlador do Amazon EKS que incluem o contêiner do nó do controlador, eles serão cobrados em 30 USD por hora (6 USD por pod). O comprador também paga separadamente por qualquer infraestrutura em que os pods sejam executados. Para a definição de preço por hora, o faturamento é por segundo com pelo menos 1 minuto. Se executar esse contêiner de controlador por 20 minutos e 30 segundos, o cliente será cobrado em `20 x ($6/60) + 30 x ($6/60/60) = $2 + $0.05 = $2.05`. Você é pago com base no uso do comprador menos a taxa acordada AWS Marketplace . Para saber mais sobre os preços por hora por tarefa ou por pod, consulte[Configurar a medição de hora em hora com o Serviço de medição do AWS Marketplace](container-metering-registerusage.md).  | 
| Preços por hora ou preços de medição personalizados com contrato de longo prazo |  Um contrato em longo prazo, a um preço reduzido, pago antecipadamente ou em prestações regulares. Um contrato em longo prazo pode ser adicionado a um produto existente que tenha uma definição de preço personalizada por medida, ou uma definição de preço por tarefa e por pod. Os compradores pagam os preços por medida quando consomem mais do que compraram no contrato em longo prazo. Exemplo: para modelos de definição de preço por medida, é possível adicionar um preço de contrato em longo prazo para os compradores obterem um desconto por pagar antecipadamente. Digamos que você normalmente cobra 1 USD por cada unidade consumida. Um comprador usando uma unidade por hora pagaria 8760 USD por ano (`365 days x 24 hours x $1 per hour`). Você pode habilitar um contrato que permita ao comprador usar uma unidade por hora durante esses 365 dias pela metade desse preço (4380 USD). Nesse caso, o comprador se compromete a pagar antecipadamente pelo contrato de um ano, e o preço cai de 1 USD por unidade para 0,5 USD por unidade. Você também pode permitir que o comprador compre vários desses contratos. Se a quantidade medida mostrar que o comprador consumiu 10 unidades em uma hora e tinha dois contratos, duas unidades serão incluídas nos dois contratos. As oito unidades adicionais seriam cobradas no valor normal de 1 USD por hora, totalizando 8 USD nessa hora. Para o exemplo por tarefa ou por pod, você também pode adicionar um preço de contrato de longo prazo para que os compradores obtenham um desconto por se comprometerem antecipadamente. Se você normalmente cobra 6 USD por pod, pode definir uma duração de contrato de longo prazo de 365 dias com um preço de 13.140 USD (`365 days x 24 hours x $3 per pod per hour`). Um contrato daria então ao cliente o direito a um pod por hora durante esses 365 dias. Os clientes podem optar por comprar vários contratos. Por exemplo, um cliente pode comprar dois contratos que lhe dão direito a dois pods por hora. Se o cliente operar mais pods por hora do que os contratos autorizados, os pods excedentes serão cobrados de acordo com o preço normal por hora. Em ambos os casos, os compradores que compram contratos em longo prazo serão cobrados antecipadamente, seja como pagamento único ou pagamentos futuros programados regularmente. Os compradores também serão cobrados por qualquer uso adicional acima do contrato na taxa por medida.   | 
| Preços de contratos de contêiner |  **Contêiner com definição de preço contratual**: um produto baseado em contêiner pelo qual o comprador paga uma taxa inicial. Para saber mais sobre a definição de preço do contrato, consulte [Preços contratuais para produtos em contêineres com AWS License Manager](container-license-manager-integration.md).  | 

# Integrações de faturamento, medição e licenciamento de produtos de contêiner
<a name="container-products-billing-integration"></a>

AWS Marketplace se integra a outros Serviços da AWS para fornecer preços baseados em medição e contrato para seu produto de contêiner. Para produtos de contêiner com preços por uso, use o [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) para verificar a autorização a usar seu produto e para medir o uso para faturamento. Para produtos baseados em contêineres com preços contratuais, você pode usar o AWS License Manager para associar licenças ao seu produto. As seções a seguir fornecem mais informações sobre medição por hora e personalizada AWS Marketplace Metering Service e preços de contratos com AWS License Manager.

**Topics**
+ [Medição horária e personalizada com AWS Marketplace Metering Service](#entitlement-and-metering-for-paid-products)
+ [Contrate preços com AWS License Manager](#container-products-contracts-license-manager)
+ [Configurar a medição de hora em hora com o Serviço de medição do AWS Marketplace](container-metering-registerusage.md)
+ [Configurar a medição personalizada para produtos de contêineres com o Serviço de medição do AWS Marketplace](container-metering-meterusage.md)
+ [Preços contratuais para produtos em contêineres com AWS License Manager](container-license-manager-integration.md)

## Medição horária e personalizada com AWS Marketplace Metering Service
<a name="entitlement-and-metering-for-paid-products"></a>

Use o [Serviço de medição do AWS Marketplace](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) para verificar o direito de usar seu produto e para medir o uso para faturamento. Se você quiser definir suas próprias unidades de preço e medir esse uso para faturamento, integre usando a operação de [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. Se você quiser precificar seu produto com base no número de tarefas ou pods usados e AWS medir esse uso automaticamente, faça a integração usando a operação da [RegisterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_RegisterUsage.html)API. Para ambos os tipos de definição de preço, é possível adicionar um preço de contrato em longo prazo sem alterar a forma como você se integra ao AWS Marketplace Metering Service.

Quando você cria um novo produto de contêiner no Portal de gerenciamento do AWS Marketplace, fornecemos um conjunto de identificadores de produto (o código do produto e a chave pública) que são usados para integrar seu produto ao AWS Marketplace Metering Service.

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

A integração com o AWS Marketplace Metering Service permite que você verifique se o cliente que executa seu software pago está inscrito em seu produto AWS Marketplace, protegendo você contra o uso não autorizado na inicialização do contêiner. Para verificar a titularidade, use as operações de [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)ou de acordo com seu modelo de preços. Para modelos de definição de preço por hora e mensais fixos, use a operação de API `RegisterUsage`. Para modelos de definição de preço de medição personalizados, use a operação de API `MeterUsage`.

Se um comprador não tiver direito ao seu produto, essas operações de API retornarão a exceção `CustomerNotEntitledException`.

**nota**  
Se um comprador cancelar a assinatura do produto durante a execução, ele terá o direito de continuar a executá-lo. No entanto, ele não poderá iniciar contêineres adicionais para o produto.

### Diretrizes de integração
<a name="integration-guidelines"></a>

Ao criar e publicar os produtos de contêiner e usar as operações de API `MeterUsage` ou `RegisterUsage` para obter autorização e medição, tenha em mente as seguintes diretrizes.
+ Não configure AWS credenciais em seu software ou na imagem do contêiner Docker. AWS as credenciais do comprador são obtidas automaticamente em tempo de execução quando a imagem do contêiner está sendo executada em uma tarefa do Amazon ECS ou em um pod do Amazon EKS.
+  Para chamar as operações `MeterUsage` ou de `RegisterUsage` API do Amazon EKS, você deve [usar um AWS SDK compatível](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html). Para testar a integração do `MeterUsage` ou `RegisterUsage` ao Amazon EKS, é necessário executar um cluster do Amazon EKS em execução no Kubernetes 1.13.x ou posterior. O Kubernetes 1.13 é necessário para funções AWS Identity and Access Management (IAM) de suporte a pods. As funções do IAM são necessárias para que o pod em execução obtenha AWS as credenciais necessárias para invocar essas ações no Amazon EKS. 
+ É possível fazer uma implantação local, mas receberá uma exceção `PlatformNotSupportedException`. Essa exceção não ocorrerá quando você iniciar o contêiner em serviços de AWS contêiner (Amazon ECS, Amazon EKS e Fargate).

### Suportado Regiões da AWS
<a name="supported-regions-metering"></a>

Para obter uma lista de todos os AWS Marketplace compatíveis Regiões da AWS, consulte a [tabela de regiões](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/) no site da infraestrutura global.

#### Obtendo o Região da AWS para medição
<a name="metering-aws-region-configuration"></a>

Ao integrar seu contêiner para medição com a operação `MeterUsage` ou a `RegisterUsage` API, não configure o AWS SDK para usar uma operação específica. Região da AWS A região deve ser obtida dinamicamente em runtime. 

**Example**  
Por exemplo, um cliente executa uma tarefa do Amazon ECS ou um pod do Amazon EKS. A operação de API `RegisterUsage` é chamada em uma região diferente da região em que a tarefa do Amazon ECS ou o pod do Amazon EKS foi executado. Portanto, a operação de API `RegisterUsage` gera um erro `InvalidRegionException`.



AWS As linguagens do SDK não determinam o de `AWS_REGION` maneira consistente. Se o SDK não captar automaticamente a `AWS_REGION`, o software precisará ser escrito manualmente para determinar a `AWS_Region`. Por exemplo, o AWS SDK para Java usa automaticamente os [Metadados de instâncias do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) (especificamente, `ec2InstanceMetadata`) para obter a região quando variáveis de ambiente ou outras configurações não estiverem presentes. Nessa instância, chame somente `ec2InstanceMetadata` se a variável de ambiente `AWS_REGION` não estiver presente.

Para obter informações sobre como obter dinamicamente um Região da AWS at runtime, consulte o [Guia do desenvolvedor do AWS SDK](https://aws.amazon.com/tools) para sua linguagem de programação.

### Impedir a modificação da medição
<a name="prevent-metering-modification"></a>

Apresentar formas para os compradores modificarem ou substituírem chamadas para `RegisterUsage` ou `MeterUsage` poderá resultar em problemas indesejáveis de faturamento e pagamento. É altamente recomendável que você integre a lógica de medição e de autorização.

Ao projetar seu produto para evitar a modificação da medição, tenha em mente o seguinte:
+ Se os compradores puderem inserir novas camadas de imagem que contenham instruções `CMD` ou `ENTRYPOINT`, integre `RegisterUsage` ou `MeterUsage` diretamente no software que o comprador está executando por meio da imagem do contêiner. Caso contrário, as chamadas para `RegisterUsage` ou `MeterUsage` executadas por `CMD` ou `ENTRYPOINT` usando a imagem base provavelmente serão substituídas pelo comprador.
+ Recomendamos que você gerencie os códigos de AWS Marketplace produto que seu software usa como entrada `RegisterUsage` ou de uma `MeterUsage` forma que os compradores não possam modificar. *No entanto, se seu produto gerencia códigos de produto de uma forma que os clientes possam substituir AWS CloudFormation, como o gráfico do Helm ou o manifesto do Kubernetes, você deverá manter uma lista de códigos de produto confiáveis.* AWS Marketplace Isso é para garantir que o código do produto que seu software passa como entrada `RegisterUsage` ou `MeterUsage` seja válido.
+  Se algum dos códigos de produto confiáveis for de produtos gratuitos, garanta que eles não possam ser usados no lugar de um código do produto pago.

## Contrate preços com AWS License Manager
<a name="container-products-contracts-license-manager"></a>

Para produtos baseados em contêineres com preços contratuais, você costuma AWS License Manager associar licenças ao seu produto. 

AWS License Manager é uma ferramenta de gerenciamento de licenças que permite que seu aplicativo rastreie e atualize licenças (também conhecidas como direitos) que foram adquiridas por um cliente. Esta seção fornece informações sobre como integrar seu produto ao AWS License Manager. Depois que a integração for concluída, você poderá publicar sua lista de produtos no AWS Marketplace.

Para obter mais informações sobre AWS License Manager, consulte o [Guia AWS License Manager do usuário](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) e a [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)seção da *Referência de AWS CLI comandos*.

**nota**  
Os clientes não podem executar novas instâncias do contêiner após o período de expiração do contrato. No entanto, durante a vigência do contrato, eles podem executar qualquer número de instâncias. Essas licenças não estão vinculadas a um nó ou uma instância específica. Qualquer software executado em qualquer contêiner em qualquer nó pode fazer o checkout da licença, desde que tenha as credenciais da AWS atribuídas.
**Criação de oferta privada**: os vendedores podem gerar ofertas privadas para os produtos usando a ferramenta de criação de ofertas privadas no Portal de gerenciamento do AWS Marketplace.
**Relatórios**: você pode configurar feeds de dados configurando um bucket do Amazon S3 na seção **Relatório** no Portal de gerenciamento do AWS Marketplace. Para obter mais informações, consulte [Relatórios de vendedores, feeds de dados e painéis em AWS Marketplace](reports-and-data-feed.md).

### Fluxo de trabalho de integração
<a name="container-LM-LM-workflow"></a>

As etapas a seguir mostram o fluxo de trabalho para integrar seu produto de contêiner ao AWS License Manager:

1. O vendedor cria um produto com AWS License Manager integração.

1. O vendedor lista o produto em AWS Marketplace.

1. O comprador encontra o produto AWS Marketplace e o compra.

1. Uma licença é enviada para a Conta da AWS do comprador.

1. O comprador usa o software executando a instância do Amazon EC2, a tarefa do Amazon ECS ou o software pod do Amazon EKS. O cliente implanta usando um perfil do IAM.

1. O software lê a licença na AWS License Manager conta do comprador, descobre os direitos adquiridos e provisiona os recursos adequadamente. 
**nota**  
O License Manager não faz nenhum rastreamento ou atualização; isso é feito pelo aplicativo do vendedor.

# Configurar a medição de hora em hora com o Serviço de medição do AWS Marketplace
<a name="container-metering-registerusage"></a>

**nota**  
 Para implantações do Amazon EKS, o software deve usar [perfis do IAM para contas de serviço (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) a fim de assinar a chamada de API para a operação da API [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html). Usando a [Identidade de Pods do EKS](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), a função de nó ou as chaves de acesso de longo prazo não são compatíveis.  
Para implantações do Amazon ECS, o software deve usar o [perfil do IAM de tarefa do Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) para assinar a chamada de API da operação da API [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html). O uso da função de nó ou das chaves de acesso de longo prazo não é compatível.

Se o produto de contêiner usar a definição de preço por tarefa ou pod por hora em vez de dimensões personalizadas de definição de preço por medição, você não precisará definir dimensões de medição personalizadas. Você pode usar o AWS Marketplace Metering Service para medição personalizada para produtos de contêineres no AWS Marketplace. As seções a seguir mostram como configurar a medição horária com o Serviço de medição do AWS Marketplace.

A operação de API `RegisterUsage` mede o uso do software por tarefa do Amazon Elastic Container Service (Amazon ECS) ou por pod do Amazon Elastic Kubernetes Service (Amazon EKS), por hora, com o uso proporcional ao segundo. Pelo menos 1 minuto de uso se aplica a tarefas ou pods que tenham curta duração. A medição contínua para uso do software é feita automaticamente pelo. AWS Marketplace Metering Control Plane O software não precisa realizar ações específicas de medição, exceto chamar `RegisterUsage` uma vez para medição do uso de software para iniciar.

`RegisterUsage` deve ser chamado imediatamente no momento de execução de um contêiner. Se você não registrar o contêiner nas primeiras 6 horas após a execução do contêiner, o Serviço de medição do AWS Marketplace não fornecerá nenhuma garantia de medição dos meses anteriores. No entanto, a medição continuará durante o mês atual até que o contêiner termine.

A AWS Marketplace Metering Control Plane continua cobrando dos clientes pela execução de tarefas do Amazon ECS e pods do Amazon EKS, independentemente do estado da assinatura do cliente. Isso elimina a necessidade de o software realizar verificações de direitos após a execução inicial bem-sucedida da tarefa ou do pod. 

Para obter mais informações sobre a integração AWS Marketplace Metering Service da API com produtos de contêineres com preços por hora, consulte o workshop [Integrar com medição horária](https://catalog.workshops.aws/mpseller/en-US/container/integrate-hourly) do *AWS Marketplace vendedor*. 

**Topics**
+ [Pré-requisitos de medição por hora](#hourly-metering-prereqs)
+ [Teste da integração para `RegisterUsage`](#testing-integration-for-registerusage)
+ [Tratar erros no `RegisterUsage`](#hourly-metering-entitlement-error-handling)
+ [Integrando seu produto de contêiner com o AWS Marketplace Metering Service usando o AWS SDK para Java](java-integration-example-registerusage.md)

## Pré-requisitos de medição por hora
<a name="hourly-metering-prereqs"></a>

Antes de publicar o produto, você deve fazer o seguinte:

1. Crie um novo produto de contêiner no Portal de gerenciamento do AWS Marketplace e anote o código do produto.

   Para obter mais informações, consulte [Visão geral: crie um produto em contêiner](container-product-getting-started.md#create-container-product).

1. Use uma função AWS Identity and Access Management (IAM) para a tarefa ou o pod que executa seu aplicativo com as permissões do IAM necessárias para chamar`RegisterUsage`. A política `AWSMarketplaceMeteringRegisterUsage` gerenciada pelo IAM tem essas permissões. Para obter mais informações sobre a política, consulte [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)na *Referência de política AWS gerenciada*.

1. (Opcional) Se você quiser ver o registro, recomendamos que você habilite o AWS CloudTrail login na definição de tarefa ou pod.

1. Faça uma chamada de teste para a operação de API `RegisterUsage` com um registro para todas as dimensões de preço definidas.

## Teste da integração para `RegisterUsage`
<a name="testing-integration-for-registerusage"></a>

Use a operação `RegisterUsage` da API para testar sua integração antes de enviar sua imagem AWS Marketplace para publicação.

Chame `RegisterUsage` na imagem de contêiner executando o produto no Amazon ECS ou no Amazon EKS. Use a AWS conta que você está usando para publicar o produto AWS Marketplace. Sua integração de medição deve configurá-la dinamicamente Região da AWS, em vez de codificá-la. No entanto, ao testar, execute pelo menos uma tarefa do Amazon ECS ou pod do Amazon EKS com o contêiner pago na região Leste dos EUA (Norte da Virgínia). Ao fazer isso, a equipe de AWS Marketplace operações pode verificar seu trabalho com os registros dessa região.

**nota**  
Se o produto oferecer suporte ao Amazon ECS e ao Amazon EKS, você só precisará executar no Amazon EKS para que possamos validar sua integração.

Não é possível testar totalmente a integração até o produto ser publicado com todos os metadados e informações de definição de preço necessários. Se solicitado, a equipe de operações do AWS Marketplace catálogo pode verificar o recebimento de seus registros de medição.

## Tratar erros no `RegisterUsage`
<a name="hourly-metering-entitlement-error-handling"></a>

Se a imagem do contêiner se integrar ao AWS Marketplace Metering Service e receber uma exceção que não seja `ThrottlingException` na inicialização do contêiner, você deverá encerrar o contêiner para evitar o uso não autorizado.

As exceções diferentes de `ThrottlingException` são lançadas somente na chamada inicial para a operação de API `RegisterUsage`. As chamadas subsequentes da mesma tarefa do Amazon ECS ou pod do Amazon EKS não lançarão `CustomerNotSubscribedException`, mesmo se o cliente cancelar a assinatura com a tarefa ou o pod ainda em execução. Esses clientes ainda são cobrados pela execução de contêineres depois de cancelarem a assinatura e seu uso for rastreado.

A tabela a seguir descreve os erros que a operação de API `RegisterUsage` pode lançar. Cada linguagem de programação do AWS SDK tem um conjunto de diretrizes de tratamento de erros que você pode consultar para obter informações adicionais. 


|  **Erro**  |  **Descrição**  | 
| --- | --- | 
|  InternalServiceErrorException  |  RegisterUsage não está disponível.  | 
|  CustomerNotEntitledException  |  O cliente não tem uma assinatura válida para o produto.  | 
|  InvalidProductCodeException  |  O valor ProductCode passado como parte da solicitação não existe.  | 
|  InvalidPublicKeyException  |  O valor PublicKeyVersion passado como parte da solicitação não existe.  | 
|  PlatformNotSupportedException  |  AWS Marketplace não suporta o uso de medição da plataforma subjacente. Somente o Amazon ECS, o Amazon EKS e o Amazon EKS AWS Fargate são compatíveis.  | 
|  ThrottlingException  |  As chamadas para RegisterUsage são limitadas.  | 
|  InvalidRegionException  |  RegisterUsagedeve ser chamada da mesma forma em Região da AWS que a tarefa do Amazon ECS ou o pod do Amazon EKS foi lançado. Isso evita que um contêiner escolha uma região (por exemplo, withRegion(“us-east-1”)) ao chamar RegisterUsage.  | 

# Integrando seu produto de contêiner com o AWS Marketplace Metering Service usando o AWS SDK para Java
<a name="java-integration-example-registerusage"></a>

Você pode usar o AWS SDK para Java para se integrar ao AWS Marketplace Metering Service. A medição contínua para uso do software é feita automaticamente pelo. AWS Marketplace Metering Control Plane O software não precisa realizar ações específicas de medição, exceto chamar `RegisterUsage` uma vez para medição do uso de software para iniciar. Este tópico fornece um exemplo de implementação usando o AWS SDK para Java para integrar com a `RegisterUsage` ação do [AWS Marketplace Metering Service](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html). 

`RegisterUsage` deve ser chamado imediatamente no momento de execução de um contêiner. Se você não registrar o contêiner nas primeiras 6 horas após a execução do contêiner, o Serviço de medição do AWS Marketplace não fornecerá nenhuma garantia de medição dos meses anteriores. No entanto, a medição continuará durante o mês atual até que o contêiner termine.

Para obter o código-fonte completo, consulte [RegisterUsage Exemplo de Java](#registerusage-java-example). Muitas dessas etapas se aplicam independentemente da linguagem do AWS SDK. 



**Exemplos de etapa para a integração do Serviço de medição do AWS Marketplace**

1. Faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/tour).

1. Em **Assets (Ativos)**, selecione **Containers (Contêineres)** para começar a criar um produto de contêiner. A criação do produto gera o código para a integração do produto com a imagem de contêiner. Para obter mais informações sobre configuração de permissões do IAM, consulte [AWS Marketplace permissões da API de medição e titulação](iam-user-policy-for-aws-marketplace-actions.md).

1.  Faça download do [SDK do AWS Java](https://aws.amazon.com/sdk-for-java/) público. 
**Importante**  
 Para chamar a medição APIs do Amazon EKS, você deve [usar um AWS SDK compatível e executar em um](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) cluster do Amazon EKS executando o Kubernetes 1.13 ou posterior. 

1.  (Opcional) Se você estiver se integrando à `RegisterUsage` ação e quiser realizar a verificação de assinatura digital, precisará configurar a biblioteca de verificação de [BouncyCastle](https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on)assinatura no caminho de classe do seu aplicativo.

   Se quiser usar JSON Web Token (JWT), você também deverá incluir bibliotecas [JWT Java](https://jwt.io/) no caminho de classe do aplicativo. O uso do JWT fornece uma abordagem mais simples para a verificação de assinaturas, mas não é obrigatório. Em vez disso, você pode usar o modo autônomo BouncyCastle . Se você usa o JWT ou BouncyCastle precisa usar um sistema de compilação como o Maven para incluir dependências transitivas do BouncyCastle ou do JWT no caminho de classe do seu aplicativo.

   ```
   // 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.  Chame `RegisterUsage` de cada imagem de contêiner paga na oferta do produto. `ProductCode` e `PublicKeyVersion` são parâmetros obrigatórios, e todas as outras entradas são opcionais. Esta é uma carga útil de exemplo 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**  
É possível ver problemas transitórios na conexão com o Serviço de medição do AWS Marketplace. O AWS Marketplace recomenda fortemente a implementação de novas tentativas por até 30 minutos, com recuo exponencial, para evitar interrupções de curto prazo ou problemas de rede.

1.  `RegisterUsage` gera uma assinatura digital RSA-PSS usando SHA-256 que é possível usar para verificar a autenticidade da solicitação. A assinatura inclui os seguintes campos: `ProductCode`, `PublicKeyVersion` e `Nonce`. Para verificar a assinatura digital, você deve manter esses campos da solicitação. Este código é uma resposta de exemplo para uma chamada `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. Recompile uma nova versão da imagem de contêiner que inclua a chamada `RegisterUsage`, marque o contêiner e o envie para qualquer registro que seja compatível com o Amazon ECS ou o Amazon EKS, como o Amazon ECR ou o Amazon ECR Public. Se você estiver usando o Amazon ECR, verifique se a conta que executa a tarefa do Amazon ECS ou o pod do Amazon EKS tem permissões no repositório do Amazon ECR. Caso contrário, ocorrerá uma falha na inicialização.

1.  Crie um perfil do [IAM](https://aws.amazon.com/iam/) que conceda permissão para o contêiner chamar `RegisterUsage`, conforme definido no código a seguir. Forneça esse perfil do IAM no parâmetro [Função da tarefa](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) da definição de tarefa do Amazon ECS ou de pod do Amazon EKS.

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

****  

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

------

1. Crie uma tarefa do Amazon ECS ou uma definição de pod do Amazon EKS que faça referência ao contêiner que se integrou AWS Marketplace e faça referência à função do IAM que você criou na etapa 7. Você deve habilitar o AWS CloudTrail registro na definição da tarefa se quiser ver o registro. 

1. Crie um cluster do Amazon ECS ou Amazon EKS para executar sua tarefa ou pod. Para obter mais informações sobre como criar um cluster do Amazon ECS, consulte [Criar um cluster](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html) no *Guia do desenvolvedor do Amazon Elastic Container Service*. Para obter mais informações sobre como criar um cluster do Amazon EKS (usando o Kubernetes versão 1.1.3.x ou posterior), consulte [Criar um cluster do Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html).

1. Configure o cluster Amazon ECS ou Amazon EKS e inicie a definição de tarefa do Amazon ECS ou o pod Amazon EKS que você criou, no us-east-1. Região da AWSÉ somente durante este processo de teste, antes de o produto estar ativo, que você precisa usar essa região.

1. Você pode começar a criar seu produto de contêiner assim que obtiver uma resposta válida de `RegisterUsage`. Se tiver dúvidas, entre em contato com a equipe de [Operações do vendedor do AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/). 

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

O exemplo a seguir usa o AWS SDK para Java e AWS Marketplace Metering Service para chamar a `RegisterUsage` operação. A verificação de assinatura é opcional, mas se quiser executar a verificação de assinatura, você deverá incluir as bibliotecas de verificação de assinatura digital obrigatórias. Esse exemplo é apenas para fins de ilustração. 

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

# Configurar a medição personalizada para produtos de contêineres com o Serviço de medição do AWS Marketplace
<a name="container-metering-meterusage"></a>

**nota**  
 Para implantações do Amazon EKS, o software deve usar [perfis do IAM para contas de serviço (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) a fim de assinar a chamada de API para a operação da API [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html). Usando a [Identidade de Pods do EKS](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), a função de nó ou as chaves de acesso de longo prazo não são compatíveis.  
Para implantações do Amazon ECS, o software deve usar o [perfil do IAM de tarefa do Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) para assinar a chamada de API da operação da API [https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html). O uso da função de nó ou das chaves de acesso de longo prazo não é compatível.  
Para implantações do Amazon Bedrock AgentCore Runtime, seu software deve usar a [função AgentCore de execução do Runtime](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/runtime-permissions.html#runtime-permissions-execution) para assinar a chamada de API para a operação da [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. As chaves de acesso de longo prazo não são compatíveis.

AWS Marketplace os produtos de contêiner podem ter medição personalizada em até 24 dimensões de preços diferentes por produto. Cada dimensão pode ter um preço de contrato em longo prazo associada a ela. Para habilitar a medição personalizada, integre seu produto de contêiner ao Serviço de medição do AWS Marketplace. Você pode definir suas próprias unidades de preço e medição personalizada para esse uso ou AWS para faturamento usando a operação da [https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)API. As seções a seguir mostram como configurar a medição personalizada para seu produto de contêiner.

As dimensões de preço são definidas em dois locais, uma vez durante a criação do produto no Portal de gerenciamento do AWS Marketplace (portal do vendedor) e uma vez no software para realizar a operação de `MeterUsage`. Esse método de dois fatores garante que as ofertas subsequentes estejam funcionando conforme pretendido antes de ficarem disponíveis para o público.

Para configurar a medição personalizada, será necessário escolher a categoria de uso, o tipo de unidade e as dimensões de definição de preço. 
+ **Categoria de uso**: a categoria ajuda os compradores a entender o que é o produto e como usá-lo. 
+ **Tipo de unidade**: o tipo de unidade define a unidade de medida para faturamento. Por exemplo, largura de banda medida em GBps ou MBps, o número de hosts ou dados medidos em MB, GB ou TB.
+ **Dimensões de preços** — As dimensões de preços representam um recurso ou serviço para o qual você definiu um preço unitário (por exemplo, usuários, escaneamentosCPUs, v ou agentes implantados). As dimensões de preços são públicas. No entanto, você ainda pode definir ofertas privadas e Traga a sua própria licença (BYOL) para produtos públicos. Não envie a definição de preço nos registros de medição. Você mede a quantidade de unidades, e nós usamos isso com os preços definidos na criação do produto para calcular a fatura do comprador. 

  Se a definição de preço do produto não se adequar a nenhuma categoria predefinida ou a nenhum tipo de unidade, você poderá escolher a categoria genérica **Unidades**. Em seguida, use a descrição da dimensão para descrever qual é a unidade.

Se desejar, você pode distribuir o uso em alocações por propriedades rastreadas. As alocações são representadas como tags para o comprador. Essas tags permitem que o comprador visualize os custos divididos em uso por valores de tag. Por exemplo, se você cobrar pelo usuário e os usuários tiverem uma propriedade “Departamento”, será possível criar alocações de uso com tags que tenham uma chave de “Departamento” e uma alocação por valor. Isso não altera o preço, as dimensões ou o uso total que você relata, mas permite que seu cliente visualize os custos por categorias apropriadas ao seu produto.

Recomendamos que você envie um registro de medição a cada hora. No entanto, você também pode agregar o uso em períodos diários ou mensais. Se ocorrer uma interrupção, você poderá agregar o uso do software do comprador e enviá-lo nas próximas horas de medição. Não é possível enviar mais de um registro por hora.

*Para obter mais informações sobre a integração AWS Marketplace Metering Service da API para produtos de contêineres com preços de medição personalizados, consulte o laboratório de [integração com medição personalizada](https://catalog.workshops.aws/mpseller/en-US/container/integrate-custom) do workshop do AWS Marketplace vendedor.*

**Importante**  
A avaliação gratuita e o direito pré-pago são monitorados de hora em hora. Como resultado, enviar esses registros separadamente pode fazer com que o comprador seja cobrado a mais.

**Topics**
+ [Pré-requisitos de medição personalizada](#custom-metering-prereqs)
+ [Teste de integração de `MeterUsage` para ECS e EKS](#testing-meterusage-integration)
+ [Testando MeterUsage a integração para AgentCore](#testing-agentcore-metering)
+ [Tratar erros no `MeterUsage`](#custom-metering-entitlement-error-handling)
+ [(Opcional) Marcação medida pelo fornecedor](#container-vendor-metered-tagging)
+ [Exemplo de código](#container-meter-code-example)
+ [Integrando seu produto de contêiner usando medição personalizada com o e AWS Marketplace Metering Service AWS SDK para Java](java-integration-example-meterusage.md)

## Pré-requisitos de medição personalizada
<a name="custom-metering-prereqs"></a>

Antes de publicar o produto, você deve fazer o seguinte:

1. Crie um novo produto de contêiner no Portal de gerenciamento do AWS Marketplace e anote o código do produto.

1. Use uma função AWS Identity and Access Management (IAM) para a tarefa, o pod ou o endpoint AgentCore de tempo de execução que executa seu aplicativo com as permissões do IAM necessárias para chamar`MeterUsage`. A política `AWSMarketplaceMeteringRegisterUsage` gerenciada pelo IAM tem essas permissões. Para obter mais informações sobre a política, consulte [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)na *Referência de política AWS gerenciada*.

1. (Opcional) Recomendamos que você ative o AWS CloudTrail login na definição de tarefa ou pod se quiser ver o registro.

1. Faça uma chamada de teste para a operação de API `MeterUsage` com um registro para todas as dimensões de preço definidas.

## Teste de integração de `MeterUsage` para ECS e EKS
<a name="testing-meterusage-integration"></a>

Use a `MeterUsage` operação para testar sua integração antes de enviar sua imagem AWS Marketplace para publicação.

Ligue a `MeterUsage` partir das imagens do contêiner executando seu produto no Amazon Elastic Container Service (Amazon ECS) ou no Amazon Elastic Kubernetes Service (Amazon EKS Conta da AWS ) com o que você usa para publicar o produto. AWS Marketplace Sua integração de medição deve configurá-la dinamicamente Região da AWS, em vez de codificá-la. No entanto, ao testar, inicie pelo menos uma tarefa do Amazon ECS ou pod do Amazon EKS contendo seu contêiner pago na região Leste dos EUA (Norte da Virgínia) para que a equipe de AWS Marketplace operações possa verificar seu trabalho com os registros dessa região.

**nota**  
Se o produto oferecer suporte ao Amazon ECS e ao Amazon EKS, você só precisará executar no Amazon EKS para que possamos validar sua integração.
Teste todas as dimensões antes de lançar seu produto ao público e depois de adicionar uma nova dimensão. Se você não enviar um registro de medição para cada dimensão associada a um produto de contêiner, isso resultará em um erro com a falha da solicitação.

Não é possível testar totalmente a integração até o produto ser publicado com todos os metadados e informações de definição de preço necessários. Se solicitado, a equipe de operações do AWS Marketplace catálogo pode verificar o recebimento de seus registros de medição.

## Testando MeterUsage a integração para AgentCore
<a name="testing-agentcore-metering"></a>

Use a `MeterUsage` operação para testar sua integração antes de enviar sua imagem AWS Marketplace para publicação.

Ligue a `MeterUsage` partir das imagens do contêiner executando seu produto no Amazon Bedrock AgentCore com a AWS conta que você usa para publicar o produto. AWS Marketplace Sua integração de medição deve definir dinamicamente a AWS região, em vez de codificá-la. No entanto, ao testar, inicie pelo menos um AgentCore agente do Amazon Bedrock contendo seu contêiner pago na região Leste dos EUA (Norte da Virgínia) para que a equipe de AWS Marketplace operações possa verificar seu trabalho com os registros dessa região. 

 Você não precisa agregar registros de uso por hora. Chame `MeterUsage` em cada invocação de atendente com o uso dessa invocação.

Você deve usar a versão mais recente do AWS SDK para seu idioma. Isso preenche automaticamente o parâmetro `ClientToken` com um valor gerado automaticamente para ajudar na idempotência. Versões anteriores do SDK que não preencherem esse campo não funcionarão para `MeterUsage` chamadas de dentro do Amazon Bedrock. AgentCore Por causa de um problema de rede, você deve reutilizar exatamente a mesma solicitação ao tentar novamente. Isso garante que as solicitações sejam tratadas com idempotência.

Devido às diferenças no comportamento esperado de medição entre o Amazon Bedrock AgentCore e outros produtos de contêiner, não recomendamos compartilhar a mesma imagem de contêiner para uso no Amazon Bedrock e AgentCore no Amazon ECS ou EKS.

## Tratar erros no `MeterUsage`
<a name="custom-metering-entitlement-error-handling"></a>

Chame `MeterUsage` que define o parâmetro `DryRun` como verdadeiro na startup de contêiner para validar se a integração da medição está funcionando. Se a imagem de contêiner se integrar à operação `MeterUsage` e receber uma exceção diferente de `ThrottlingException` na inicialização do contêiner, você deverá encerrar a imagem de contêiner para evitar uso não autorizado.

As exceções diferentes de `ThrottlingException` são lançadas somente na chamada inicial para `MeterUsage`. As chamadas subsequentes da mesma tarefa do Amazon ECS, pod ou endpoint do Amazon EKS AgentCore Runtime não são enviadas`CustomerNotSubscribedException`, mesmo que o cliente cancele a assinatura enquanto a tarefa ou o pod ainda estão em execução. Esses clientes continuarão sendo cobrados pela execução de contêineres depois de cancelarem a assinatura e o uso for rastreado.

Consulte [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)a *Referência da AWS Marketplace Metering Service API* para obter descrições detalhadas dos erros comuns de`MeterUsage`. Cada linguagem de programação do AWS SDK tem um conjunto de diretrizes de tratamento de erros que você pode consultar para obter informações adicionais. 

## (Opcional) Marcação medida pelo fornecedor
<a name="container-vendor-metered-tagging"></a>

A marcação medida pelo fornecedor ajuda os fornecedores independentes de software (ISVs) a fornecer ao comprador uma visão mais granular sobre o uso do software e pode ajudá-lo a realizar a alocação de custos.

**nota**  
A marcação medida pelo fornecedor não é suportada para solicitações de medição de produtos Amazon Bedrock. AgentCore 

Você tem diversas maneiras de identificar o uso do software do comprador. Uma é primeiro perguntar aos compradores o que eles querem ver na alocação de custos. Em seguida, você pode dividir o uso entre as propriedades rastreadas para a conta do comprador. Exemplos de propriedades incluem `AccountId`, `Business Unit`, `Cost Centers` e outros metadados relevantes para seu produto. Essas propriedades são expostas ao comprador como tags. Usando tags, os compradores podem ver seus custos divididos em uso pelos valores das tags em seu console de AWS faturamento ([https://console.aws.amazon.com/costmanagement/](https://console.aws.amazon.com/costmanagement/)). A marcação medida pelo fornecedor não altera o preço, as dimensões ou o uso total que você relata. Ela permite que o cliente visualize os custos por categorias apropriadas ao seu produto.

Em um caso de uso comum, um comprador assina seu produto com uma Conta da AWS. O comprador também tem vários usuários associados à mesma assinatura do produto. Você pode criar alocações de uso com tags que tenham uma chave de `AccountId` e, em seguida, alocar o uso para cada usuário. Nesse caso, os compradores podem ativar a tag `AccountId` no console do Billing and Cost Management e analisar o uso individual do usuário.

### Experiência do vendedor
<a name="container-vendor-metered-tag-seller"></a>

Os vendedores podem agregar os registros de medição dos recursos com o mesmo conjunto de tags em vez de agregar o uso de todos os recursos. Por exemplo, os vendedores podem construir o registro de medição que inclui buckets `UsageAllocations` diferentes. Cada bucket representa `UsageQuantity` para um conjunto de tags, como `AccountId` e `BusinessUnit`. 

No diagrama a seguir, o **Recurso 1** tem um conjunto exclusivo de tags `AccountId` e `BusinessUnit` e aparece no **Registro de medição** como uma única entrada. 

O **Recurso 2** e o **Recurso 3** têm a mesma tag `AccountId`, `2222`, e a mesma tag `BusinessUnit`, `Operations`. Como resultado, eles são combinados em uma única entrada `UsageAllocations` no **Registro de medição**.

![\[Diagrama que mostra como as tags de medição do fornecedor combinam os dados de uso. Três recursos (Recursos 1, 2 e 3) diferentes AccountIds e BusinessUnits consolidados em um único Registro de Medição, UsageAllocations agrupados por AccountId e BusinessUnit antes de serem enviados ao AWS Marketplace Metering Service.\]](http://docs.aws.amazon.com/pt_br/marketplace/latest/userguide/images/seller-vendor-meter-tag.png)


Os vendedores também podem combinar recursos sem tags em uma única `UsageAllocation` com a quantidade de uso alocada e enviá-los como uma das entradas em `UsageAllocations`.

Os limites incluem:
+ Número de tags: 5
+ Quantidade de `UsageAllocations` (cardinalidade): 2.500

As validações incluem:
+ Caracteres permitidos para a chave e o valor da tag — a-zA-Z 0-9\$1 -= . \$1:\$1 /@
+ Máximo de tags na lista `UsageAllocation`: 5
+ Duas `UsageAllocations` não podem ter as mesmas tags (ou seja, a mesma combinação de chaves e valores de tag). Se for esse o caso, elas devem usar a mesma `UsageAllocation`.
+ A soma de `AllocatedUsageQuantity` de `UsageAllocation` deve ser igual a `UsageQuantity`, que é o uso agregado.

### Experiência do comprador
<a name="container-vendor-metered-tag-buyer"></a>

A tabela a seguir mostra um exemplo da experiência do comprador depois que ele ativa as tags de fornecedor `AccountId` e `BusinessUnit`. 

Neste exemplo, o comprador pode ver o uso alocado no **Relatório de uso de custos**. As tags medidas pelo fornecedor usam o prefixo `“aws:marketplace:isv”`. Os compradores podem ativá-las no Billing and Cost Management, em **Tags de alocação de custos**, **Tags de alocação de custos geradas pela AWS**.

A primeira e a última linha do **Relatório de uso de custos** são relevantes para o que o vendedor envia ao Serviço de medição (conforme mostrado no exemplo [Experiência do vendedor](#container-vendor-metered-tag-seller)).


**Relatório de uso de custos (simplificado)**  

| ProductCode  | Comprador | UsageDimension | UsageQuantity | `aws:marketplace:isv:AccountId ` | `aws:marketplace:isv:BusinessUnit` | 
| --- | --- | --- | --- | --- | --- | 
| xyz | 111122223333 | Rede: por (GB) inspecionado  | 70 | 2222 | Operações | 
| xyz | 111122223333 | Rede: por (GB) inspecionado  | 30 | 3333 | Finanças | 
| xyz | 111122223333 | Rede: por (GB) inspecionado  | 20 | 4444 | IT | 
| xyz | 111122223333 | Rede: por (GB) inspecionado  | 20 | 5555 | Marketing | 
| xyz | 111122223333 | Rede: por (GB) inspecionado  | 30 | 1111 | Marketing | 

Para ver um exemplo de código, consulte [Exemplo de código `MeterUsage` com marcação de alocação de uso (opcional)](#container-meterusage-code-example).

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

O exemplo de código a seguir é fornecido para ajudá-lo a integrar seu produto de contêiner com o AWS Marketplace APIs necessário para publicar e manter seu produto.

### Exemplo de código `MeterUsage` com marcação de alocação de uso (opcional)
<a name="container-meterusage-code-example"></a>

O exemplo de código a seguir é relevante para produtos de contêiner com modelos de definição de preço de consumo. O exemplo do Python envia um registro de medição com as tags de alocação de uso apropriadas para AWS Marketplace cobrar taxas de seus clientes. pay-as-you-go

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

# Import AWS Python SDK
import boto3
import time

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

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

    }
]

marketplaceClient = boto3.client("meteringmarketplace")

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

Para obter mais informações sobre`MeterUsage`, consulte [MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)na *Referência AWS Marketplace Metering Service da API*.

### Exemplo de resposta
<a name="container-meterusage-code-response"></a>

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

# Integrando seu produto de contêiner usando medição personalizada com o e AWS Marketplace Metering Service AWS SDK para Java
<a name="java-integration-example-meterusage"></a>

AWS Marketplace os produtos de contêineres podem ter medição personalizada em até 24 dimensões de preços diferentes por produto. Para habilitar a medição personalizada, você pode integrar seu produto de contêiner ao Serviço de medição do AWS Marketplace. Você pode definir suas próprias unidades de preço e medição personalizada para esse uso para a AWS para faturamento usando a operação de API [https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html). O exemplo a seguir descreve uma implementação que usa o AWS SDK para Java para se integrar à operação do [Serviço `MeterUsage` de AWS Marketplace Medição](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html). 

Para obter detalhes completos, consulte [Exemplos de Java do `MeterUsage`](#meterusage-java-example). Muitas etapas a seguir se aplicam independentemente da linguagem. 

**Exemplo: integração do serviço AWS Marketplace de medição**

1. Faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/tour).

1. Em **Ativos**, selecione **Contêineres** para começar a criar um produto de contêiner. A criação do produto gera o código para a integração do produto com a imagem de contêiner. Para obter informações sobre a configuração de permissões AWS Identity and Access Management (IAM), consulte[AWS Marketplace permissões da API de medição e titulação](iam-user-policy-for-aws-marketplace-actions.md).

1.  Faça download do [SDK do AWS Java](https://aws.amazon.com/sdk-for-java/) público. 
**Importante**  
 Para chamar as operações de API de medição do Amazon Elastic Kubernetes Service (Amazon EKS), você deve [usar um SDK da AWS compatível](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) e executar em um cluster do Amazon EKS executando o Kubernetes 1.13 ou posterior. 

1. Chame a operação `MeterUsage` da tarefa ou do pod uma vez por hora para o uso de cada dimensão. A operação de API aceita um registro de medição para uma combinação exclusiva de `Dimension`, `Resource` e `Hour`. O recurso é uma tarefa do Amazon Elastic Container Service (Amazon ECS) ou um pod do 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**  
É possível ver problemas transitórios na conexão com o. AWS Marketplace Metering Service AWS Marketplace recomenda fortemente a implementação de novas tentativas por até 30 minutos, com recuo exponencial, para evitar interrupções de curto prazo ou problemas de rede.

1. Recompile uma nova versão da imagem de contêiner que inclua a chamada `MeterUsage`, marque o contêiner e o envie para qualquer registro de Docker compatível com o Amazon ECS ou o Amazon EKS, como o Amazon Elastic Container Registry (Amazon ECR). Se você estiver usando o Amazon ECR, verifique se a conta que executa a tarefa do Amazon ECS ou o pod do Amazon EKS tem permissões no repositório do Amazon ECR. Caso contrário, haverá falha na operação.

1. Crie um perfil do [IAM](https://aws.amazon.com/iam/) que conceda permissão para o contêiner chamar `MeterUsage`, conforme definido no exemplo de código a seguir. Você deve fornecer essa função AWS Identity and Access Management (IAM) no parâmetro Task [Role da tarefa](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) do Amazon ECS ou da definição de pod do Amazon EKS.

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

****  

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

------

1. Crie uma tarefa do Amazon ECS ou uma definição de pod do Amazon EKS que faça referência ao contêiner que se integrou AWS Marketplace e faça referência à função do IAM que você criou na etapa 6. Se você quiser ver o registro, habilite o AWS CloudTrail registro na definição da tarefa. 

1. Crie um cluster do Amazon ECS ou Amazon EKS para executar sua tarefa ou pod. Para obter mais informações sobre como criar um cluster do Amazon ECS, consulte [Criar um cluster](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html) no *Guia do desenvolvedor do Amazon Elastic Container Service*. Para obter mais informações sobre como criar um cluster do Amazon EKS (usando o Kubernetes versão 1.1.3.x ou posterior), consulte [Criar um cluster do Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html).

1. Configure o cluster Amazon ECS ou Amazon EKS e inicie a definição de tarefa do Amazon ECS ou o pod Amazon EKS que você criou na etapa 8, na região us-east-1. AWS É somente durante este processo de teste, antes de o produto estar ativo, que você precisa usar essa região.

1. Quando você recebe uma resposta válida de `MeterUsage` para cada uma das dimensões que estão sendo publicadas para o produto, é possível começar a criar o produto de contêiner. Se tiver dúvidas, entre em contato com a equipe de [Operações do vendedor do AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us/). 

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

Os exemplos de código a seguir usam o AWS Marketplace Metering Service AWS SDK para Java e o AWS Marketplace para chamar a `MeterUsage` operação.

O exemplo de código a seguir chama a operação `MeterUsage` sem nenhum `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);
    }
}
```

O exemplo de código a seguir chama a operação `MeterUsage` com `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();
    }
```

# Preços contratuais para produtos em contêineres com AWS License Manager
<a name="container-license-manager-integration"></a>

Para produtos baseados em contêineres com preços contratuais, você pode usar AWS License Manager para associar licenças ao seu produto. AWS License Manager é uma ferramenta de gerenciamento de licenças que permite que seu aplicativo rastreie e atualize licenças (também conhecidas como direitos) que foram adquiridas por um cliente. Esta seção fornece informações sobre como integrar seu produto com AWS License Manager o. Depois que a integração for concluída, você poderá publicar sua lista de produtos no AWS Marketplace.

Se você estiver integrando o License Manager a um AWS Marketplace produto for Containers Anywhere para Amazon EKS Anywhere, Amazon ECS Anywhere, Amazon Elastic Compute Cloud (Amazon EC2) ou infraestrutura local, siga as instruções em. [Integrando um AWS Marketplace para contêineres em qualquer lugar com o License Manager](container-anywhere-license-manager-integration.md)

Para obter mais informações sobre AWS License Manager, consulte o [Guia AWS License Manager do usuário](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) e a [AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html)seção da *Referência de AWS CLI comandos*.

Para obter mais informações sobre a integração AWS License Manager com produtos de contêineres com preços contratuais, consulte o [workshop Integrar com pagamento antecipado](https://catalog.workshops.aws/mpseller/en-US/container/integrate-contract) do *AWS Marketplace vendedor*.

**Topics**
+ [Preços contratuais para produtos de contêiner](#container-contracts)
+ [Modelos de licença](#container-LM-license-models)
+ [AWS License Manager pré-requisitos de integração](#container-LM-prereqs)
+ [Integração de um produto de contêiner ao License Manager](#container-integrate-with-LM)
+ [Operações de API do License Manager](#container-LM-API-calls)
+ [Renovações e upgrades de licenças](#container-LM-lic-renew-upgrade)
+ [Integrando um AWS Marketplace para contêineres em qualquer lugar com o License Manager](container-anywhere-license-manager-integration.md)

## Preços contratuais para produtos de contêiner
<a name="container-contracts"></a>

Para produtos baseados em contêineres com preços contratuais, AWS Marketplace fature seus clientes antecipadamente ou de acordo com o cronograma de pagamento definido por você, com base no contrato entre você e seu cliente. A partir daí, eles estarão autorizados a usar os recursos. 

Para definir seu preço, escolha uma ou mais durações de contrato para oferecer aos clientes. Você pode inserir preços diferentes para cada duração de contrato. Suas opções são durações de 1 mês, 12 meses, 24 meses e 36 meses. Para ofertas privadas, você pode especificar uma duração personalizada em meses (até 60 meses). 

Escolha a categoria que melhor descreve a definição de preço do seu produto. A categoria de preços aparece para os clientes no AWS Marketplace site. **Você pode escolher entre **largura de banda** (GB/s, MB/s), **dados** (GB, MB, TB), **hosts**, **solicitações**, **níveis** ou usuários.** Se nenhuma das categorias predefinidas atender às suas necessidades, você poderá escolher a categoria mais genérica **Unidades**. 

A oferta permite que até 24 dimensões sejam adicionadas a ela.


**Exemplo: aplicação de armazenamento de dados**  

|   | Preço para 1 mês | Preço para 12 meses  | Preço para 24 meses  | Preço para 36 meses  | 
| --- | --- | --- | --- | --- | 
|  Dados não criptografados (GB)  |  1,50 USD/GB  |  16,00 USD/GB  |  30,00 USD/GB  |  60,00 USD/GB  | 
|  Dados criptografados (GB)  |  1,55 USD/GB  |  16,60 USD/GB  |  31,20 USD/GB  |  61,20 USD/GB  | 


**Exemplo: produto de monitoramento de log**  

|   | Preço para 1 mês | Preço para 12 meses  | Preço para 24 meses | Preço para 36 meses | 
| --- | --- | --- | --- | --- | 
|  Básico (10 hosts monitorados, 5 contêineres monitorados)  |  100 USD  |  1000 USD  | 2000 USD  | 4000 USD | 
|  Padrão (20 hosts monitorados, 10 contêineres monitorados)  |  200 USD  |  2000 USD  | 4000 USD  | \$18000 | 
|  Pro (40 hosts monitorados, 20 contêineres monitorados)  |  400 USD  |  4000 USD  | \$18000  | \$116.000 | 
|  Outros hosts monitorados por hora  | \$110  | 100 USD  |  200 USD | 400 USD | 
|  Outros contêineres monitorados por hora  | \$110  | 100 USD  |  200 USD | 400 USD | 

**nota**  
Os preços podem ser para as seguintes durações: um mês, 12 meses, 24 meses ou 36 meses. Você pode optar por oferecer uma ou mais dessas opções para o seu produto. As durações devem ser as mesmas em cada dimensão.   

**Example**  
Por exemplo, em um caso em que você tem `AdminUsers` dimensões `ReadOnlyUsers` e dimensões, se você oferece um preço anual para ReadOnlyUsers, você também deve oferecer um preço anual para`AdminUsers`.


### Renovações automáticas
<a name="ami-contracts-automatic-renewals"></a>

 Quando os clientes compram seu produto AWS Marketplace usando contratos de contêineres, eles podem concordar em renovar automaticamente os termos do contrato. Os clientes continuam pagando pelas autorizações a cada mês ou por um, dois ou três anos. 

Os clientes podem modificar as configurações de renovação a qualquer momento. Para obter mais informações, consulte [Modificação de um contrato existente](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-container-contracts.html#modify-existing-contract) no *Guia do comprador do AWS Marketplace *.

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

AWS Marketplace a integração com AWS License Manager suporta dois modelos de licença:
+ [Modelo de licença configurável](#container-LM-config-lic-model)
+ [Modelo de licença em nível](#container-LM-tiered-lic-model)

### Modelo de licença configurável
<a name="container-LM-config-lic-model"></a>

O modelo de licença configurável (também conhecido como modelo de licença quantificável) autoriza o comprador a uma quantidade específica de recursos após a aquisição da licença. 

Você define uma dimensão de preço e um preço unitário. Em seguida, o comprador pode escolher a quantidade de recursos que deseja comprar.

**Example da dimensão de preços e do preço unitário**  
Você pode definir uma dimensão de preço (como backup de dados) e um preço unitário (como USD 30/unidade).  
O comprador pode optar por comprar 5, 10 ou 20 unidades.   
Seu produto rastreia e mede o uso para medir a quantidade de recursos consumidos.

Com o modelo de configuração, os direitos são contados de uma destas duas maneiras:
+ [Licenças emitidas](#container-floating-lic)
+ [Licenças flutuantes](#container-floating-lic) 

#### Licença emitida
<a name="container-drawndown-lic"></a>

 A licença é extraída do conjunto de quantidades permitidas de licenças após o uso. Esse direito é verificado permanentemente e não pode ser devolvido ao pool de licenças.

**Example de processar uma quantidade limitada de dados**  
Um usuário tem o direito de processar 500 GB de dados. À medida que continuam processando os dados, a quantidade é extraída do pool de 500 GB até que todas as licenças de 500 GB sejam consumidas.

Para licenças emitidas, você pode usar a operação de API `CheckoutLicense` para verificar as unidades de licença (direitos) que são consumidas. 

**Example de backup no Amazon S3 para várias unidades/ano**  
Você tem um produto de armazenamento que permite fazer backup no Amazon Simple Storage Service de até 1.024 unidades de dados por um ano. Seu aplicativo pode ser executado usando várias instâncias do Amazon EC2. Seu aplicativo tem um mecanismo para rastrear e agregar dados. Seu software chama a operação de API `CheckoutLicense` com o ID do produto em cada backup ou em intervalos fixos para atualizar as quantidades consumidas.   
Neste exemplo, seu software chama a operação de API `CheckoutLicense` para verificar 10 unidades de dados. Quando a capacidade total atinge o limite de backup que o cliente comprou, a chamada da API falha.

**Solicitação**

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

**Resposta**

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

#### Licenças flutuantes
<a name="container-floating-lic"></a>

 A licença é devolvida ao conjunto da quantidade permitida de licenças após o uso.

Para licenças flutuantes, o aplicativo verifica os direitos no conjunto de direitos usando a operação de API `CheckoutLicense` quando o recurso está sendo usado. A resposta da operação de API `CheckoutLicense` inclui um token de consumo de licença, que é um identificador exclusivo para o checkout. O token de consumo de licença pode ser usado para realizar ações adicionais nos direitos que são retirados, como devolvê-los ao conjunto de licenças ou estender a finalização da compra.

Para devolver o direito ao conjunto, use a operação de API `CheckInLicense` quando o recurso não estiver mais em uso.

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

Em caso de falha de verificação do direito (no caso de o aplicativo falhar), o direito volta para o conjunto automaticamente após 60 minutos. Se o recurso estiver em uso por mais de 60 minutos, é uma prática recomendada manter o direito retirado do conjunto usando a operação de API `ExtendLicenseConsumption` enquanto o recurso estiver sendo usado.

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

**Example do número de usuários a partir de um limite superior fixo**  
Um usuário tem direito a 500 usuários simultâneos no aplicativo. Conforme os usuários fazem login e se desconectam, eles são retirados e retornados ao conjunto de 500 usuários. No entanto, o aplicativo não pode retirar mais de 500 usuários do conjunto porque 500 usuários simultâneos é o limite máximo fixo.

Para direitos flutuantes, você pode usar a operação de API `CheckInLicense` para devolver as unidades de licença ao conjunto de direitos. 

**Example do número de usuários simultâneos por um ano**  
O preço do produto é baseado no número de usuários simultâneos. O cliente compra uma licença para 10 usuários por um ano. O cliente executa o software fornecendo permissões do AWS Identity and Access Management (IAM). Quando um usuário faz login, seu aplicativo chama a operação de API `CheckoutLicense` para reduzir a quantidade em 1. Quando o usuário se desconecta, o aplicativo retorna essa licença para o conjunto chamando a operação de API `CheckInLicense`. Se você não chamar `CheckInLicense`, o check-in da unidade de licença será feito automaticamente depois de 1 hora.

**nota**  
Na solicitação a seguir, `key-fingerprint` não é um valor reservado, mas o valor real da impressão digital com a qual todas as licenças serão publicadas.

**Solicitação**

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

**Resposta**

```
{
  "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 licença em nível
<a name="container-LM-tiered-lic-model"></a>

O modelo de licença em nível dá ao comprador o direito a um nível específico de recursos do aplicativo após a aquisição da licença. 

Você cria níveis para seu produto, como Básico, Intermediário e Premium. Em seguida, o comprador seleciona um dos níveis predefinidos.

O aplicativo não precisa rastrear ou medir o uso do aplicativo.

Com o modelo de licença em nível, os direitos não são contados, mas significam um nível de serviço que foi adquirido pelo cliente. 

Se você quiser oferecer recursos agrupados, os níveis são preferíveis. 

**Example dos níveis Básico, Intermediário e Premium**  
Um cliente pode assinar um contrato para um dos três níveis possíveis do software: Básico, Intermediário ou Premium. Cada um desses níveis tem seu próprio preço. Seu software pode identificar o nível que o cliente assinou invocando a operação de API `CheckoutLicense` e especificando todos os níveis possíveis na solicitação.   
A resposta da solicitação contém o direito correspondente ao nível que o cliente adquiriu. Com base nessas informações, o software pode fornecer a experiência adequada ao cliente.

#### Solicitação
<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"
```

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

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

## AWS License Manager pré-requisitos de integração
<a name="container-LM-prereqs"></a>

Antes de publicar o produto, você deve fazer o seguinte:

1. Crie um novo produto de contêiner no Portal de gerenciamento do AWS Marketplace e anote o código do produto.

   Para obter mais informações, consulte [Visão geral: crie um produto em contêiner](container-product-getting-started.md#create-container-product).

1. Use um perfil do IAM para a tarefa ou o pod que está executando o aplicativo com as permissões do IAM necessárias para chamar as operações de API `CheckoutLicense`, `ExtendLicenseConsumption` e `CheckInLicense`.

   As permissões do IAM obrigatórias são detalhadas na política do 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. Faça uma chamada de teste para a operação de API `RegisterUsage` com um registro para todas as dimensões de preço definidas.

## Integração de um produto de contêiner ao License Manager
<a name="container-integrate-with-LM"></a>

**Para integrar seu produto baseado em contêiner ao License Manager**

1. Defina as permissões do IAM para chamar o License Manager. Para obter mais informações, consulte [AWS License Manager pré-requisitos de integração](#container-LM-prereqs).

1. Baixe o AWS SDK.
**nota**  
Não configure AWS credenciais em seu software. AWS as credenciais do comprador são obtidas automaticamente em tempo de execução quando seu contêiner está sendo executado em uma instância do Amazon EC2, tarefa do Amazon ECS ou pod do Amazon EKS.

1. Adicione verificações de licença ao seu produto.

   Seu produto pode chamar a operação de API da `CheckoutLicense` onde quer que a verificação da licença deva ser realizada. Para verificar a licença, seu produto deve saber:

   1. O emissor confiável da licença (AWS Marketplace)

   1. O SKU do produto (ID do produto) do aplicativo

   1. O direito de verificar este aplicativo

   As chamadas de API variam de acordo com o tipo de preço das licenças que você configura.

1. Publique sua lista de produtos em AWS Marketplace.

## Operações de API do License Manager
<a name="container-LM-API-calls"></a>

Para gerenciar as licenças armazenadas na conta do License Manager do cliente, seu software pode usar as seguintes chamadas de API:
+ `GetLicense`: uma API que o software pode consultar. Ela recupera o status de uma licença comprada (ou seja, expirada ou expirando em breve) e envia uma notificação de status ao cliente.
+ `CheckoutLicense`: descobre as licenças que o usuário comprou. Você também pode usar a operação de API `CheckoutLicense` para atualizar a quantidade de licenças quando o usuário tiver consumido alguma quantidade de licenças. Com `CheckoutLicense`, você pode continuar verificando as quantidades de licenças usadas pelo cliente. Quando o cliente esgota todas as licenças, essa chamada retorna um erro. Para obter informações sobre a cadência sugerida para execução de `CheckoutLicense`, consulte [Renovações e upgrades de licenças](#container-LM-lic-renew-upgrade).
+ `ExtendLicenseConsumption`: no caso de dimensões flutuantes, quando o software comprar uma licença, a licença retornará ao conjunto automaticamente após 60 minutos. Se você quiser estender o tempo em que a licença permanece verificada, use a operação de API `ExtendLicenseConsumption` para estender a licença por mais 60 minutos.
+ `CheckInLicense`: no caso de dimensões flutuantes, quando quiser devolver a licença ao conjunto de direitos, use a operação de API `CheckInLicense`.
+ API `ListReceivedLicenses`: lista as licenças compradas pelo comprador.

## Renovações e upgrades de licenças
<a name="container-LM-lic-renew-upgrade"></a>

Os clientes podem renovar ou atualizar as licenças no Portal de gerenciamento do AWS Marketplace. Depois de fazer uma compra adicional, AWS Marketplace gera uma nova versão da licença que reflete os novos direitos. Seu software lê os novos direitos usando as mesmas operações de API. Você não precisa fazer nada diferente em termos de integração do License Manager para lidar com renovações e atualizações.

Devido a renovações de licenças, upgrades, cancelamentos e assim por diante, recomendamos que seu produto chame a operação de API `CheckoutLicense` em um ritmo regular enquanto o produto estiver em uso. Ao usar a operação de API `CheckoutLicense` em um ritmo regular, o produto pode detectar alterações nos direitos, como atualizações e expiração.

Recomendamos que você realize a chamada de API `CheckoutLicense` a cada 15 minutos. 

# Integrando um AWS Marketplace para contêineres em qualquer lugar com o License Manager
<a name="container-anywhere-license-manager-integration"></a>

Como AWS Marketplace vendedor, você pode se integrar AWS License Manager a um produto AWS Marketplace for Containers Anywhere para Amazon EKS Anywhere, Amazon ECS Anywhere, Amazon EC2 ou infraestrutura local. As seções a seguir dão instruções para esta integração.

Para obter informações gerais sobre a integração do License Manager com AWS Marketplace, incluindo os modelos de licença disponíveis, consulte[Preços contratuais para produtos em contêineres com AWS License Manager](container-license-manager-integration.md). Para obter mais informações sobre a AWS License Manager, consulte o [Guia do usuário do AWS License Manager](https://docs.aws.amazon.com/license-manager/latest/userguide/license-manager.html) e a [Referência de comandos do AWS License Manager](https://docs.aws.amazon.com/cli/latest/reference/license-manager/index.html).

**Topics**
+ [Integrando um produto AWS Marketplace for Containers Anywhere com o License Manager](#containers-anywhere-integrate-with-LM)
+ [Teste da integração do License Manager localmente](#container-testing-LM-integration-locally)
+ [Teste da integração do License Manager no Amazon EKS](#container-testing-LM-integration-EKS)
+ [Direitos de licença flutuante no License Manager](#container-LM-floating-license)
+ [Práticas recomendadas para integração com o License Manager para implantações on-premises](#container-LM-best-practices-on-prem)
+ [`LicenseManagerCredentialsProvider`: implementação de Java](#container-license-manager-cred-provider-java)
+ [`LicenseManagerCredentialsProvider`: implementação do `Golang`](#container-license-manager-cred-provider-golang)

## Integrando um produto AWS Marketplace for Containers Anywhere com o License Manager
<a name="containers-anywhere-integrate-with-LM"></a>

Use as instruções a seguir para integrar seu produto AWS Marketplace for Containers Anywhere com AWS License Manager o.

**Para integrar seu produto AWS Marketplace for Containers Anywhere com o License Manager**

1. Abra um navegador da web e faça login no [Portal de gerenciamento do AWS Marketplace](https://aws.amazon.com/marketplace/management/).

1. Crie um ID para seu produto de contêiner realizando as etapas a seguir. Você usará esse ID na imagem do contêiner para verificações de licença em uma etapa posterior.

   1. Na barra de menus, expanda **Ativos** e selecione **Contêiner**.

   1. Insira um nome voltado ao cliente para o produto e selecione **Criar**. Você pode alterar esse nome depois.

   1. Anote o **ID do produto**. Você o usará ao criar ou atualizar os detalhes de preços do produto.
**dica**  
Se você perder o ID do produto, poderá encontrá-lo Portal de gerenciamento do AWS Marketplace escolhendo **Contêiner** no menu **Ativos**. A página **Contêineres** mostra uma lista de seus produtos com os produtos associados IDs.

1. Baixe o AWS SDK público mais recente e instale-o em seu aplicativo de contêiner. Você pode encontrar instruções de instalação para seu AWS SDK preferido em [Tools to Build on AWS](https://aws.amazon.com/tools/).
**nota**  
Para chamar as operações da API do License Manager do Amazon EKS Anywhere ou de um cluster Kubernetes que não seja fornecido pelo AWS, você deve usar um SDK compatível. AWS Para ver uma lista dos compatíveis AWS SDKs, consulte Como [usar um AWS SDK compatível](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html).

1. Crie um AWS License Manager cliente com um provedor de credenciais personalizado para que ele possa fornecer credenciais para o aplicativo de contêiner implantado no local e no AWS local. Para obter o código-fonte completo de um provedor de credenciais personalizado, `LicenseCredentialProvider`, consulte as seções a seguir:
   + [`LicenseManagerCredentialsProvider`: implementação de Java](#container-license-manager-cred-provider-java)
   + [`LicenseManagerCredentialsProvider`: implementação do `Golang`](#container-license-manager-cred-provider-golang)

    `LicenseCredentialsProvider`estende a cadeia de provedores de credenciais padrão do AWS SDK para uso local adicionando. `LicenseManagerTokenCredentialsProvider` Isso fornece credenciais usando tokens de identidade emitidos pelo License Manager OIDC em ambientes on-premises. Você deve incluir o código-fonte do `LicenseCredentialsProvider` no caminho de classe do seu aplicativo.
**nota**  
Estender o `DefaultCredentialsProvider` permite que o mesmo aplicativo de contêiner obtenha credenciais ao ser executado em AWS e quando executado em um ambiente local. Se o aplicativo de contêiner já usa uma cadeia de provedores de credenciais personalizada em vez do padrão, ele também pode ser estendido adicionando `LicenseManagerTokenCredentialsProvider` à cadeia personalizada.

   O trecho de código a seguir é um exemplo de criação de um AWS License Manager cliente usando Java.

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

1. Chame a operação de API `CheckoutLicense` usando o comando `aws license-manager checkout-license` de cada imagem de contêiner paga na oferta de produto. Isso verifica se o comprador tem o direito de usar uma licença para o aplicativo. Se o comprador tiver direito ao aplicativo, `CheckoutLicense` obterá êxito e devolverá os direitos solicitados e os valores. Se o comprador não tiver direito ao aplicativo, `CheckoutLicense` lançará uma exceção.

   Os parâmetros a seguir são necessários ao chamar a operação de API `CheckoutLicense`:
   + `CheckoutType`: os valores válidos são `PROVISIONAL` ou `PERPETUAL`:
     + Use `PERPETUAL` quando a quantidade de direitos retirados será esgotada do conjunto.

       Exemplo: o comprador tem o direito de processar 500 GB de dados. À medida que continua processando os dados, a quantidade é retirada e esgotada do conjunto de 500 GB.
     + Use `PROVISIONAL` para direitos de licença flutuante, em que os direitos são retirados do conjunto e devolvidos após o uso.

       Exemplo: o usuário tem direito a 500 usuários simultâneos no aplicativo. Conforme os usuários fazem login ou se desconectam, eles são retirados ou retornados ao conjunto de 500 usuários. Para saber mais sobre direitos de licença flutuante, consulte [Direitos de licença flutuante no License Manager](#container-LM-floating-license).
   + `ClientToken`: um identificador exclusivo e que diferencia maiúsculas e minúsculas. Recomendamos usar um UUID aleatório para cada solicitação exclusiva.
   + `Entitlements`: uma lista de direitos a serem verificados.
     + Para direitos de recursos, forneça as propriedades `Name` e `Unit` assim.

       ```
       {
         "Name": "<Entitlement_Name>",
         "Unit": "None"
       }
       ```
     + Para direitos contados, forneça as propriedades `Name`, `Unit` e `Count` assim.

       ```
       {
         "Name": "<Entitlement_Name>",
         "Unit": "<Entitlement_Unit>",
         "Value": <Desired_Count>
       }
       ```
   + `KeyFingerprint`: a impressão digital de chave para licenças emitidas pelo AWS Marketplace é `aws:294406891311:AWS/Marketplace:issuer-fingerprint`. O uso dessa impressão digital de chave garante que a licença seja emitida por AWS Marketplace e não por uma entidade não confiável.
   + `ProductSKU`— O ID do produto gerado Portal de gerenciamento do AWS Marketplace nas etapas anteriores.

   O snippet a seguir é um exemplo de uma chamada usando a operação de API `CheckoutLicense` usando a 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 verificar as licenças, os aplicativos de contêiner exigem acesso de saída à rede para usar o License Manager. Os aplicativos implantados on-premises podem ter acesso de saída lento ou não confiável à rede. Esses aplicativos devem incluir novas tentativas adequadas ao chamar o License Manager. Para obter mais informações, consulte [Práticas recomendadas para integração com o License Manager para implantações on-premises](#container-LM-best-practices-on-prem).

1. Chame a operação de API `CheckoutLicense` regularmente para identificar quaisquer alterações nas licenças dos clientes devido a renovações, atualizações ou cancelamentos feitos no AWS Marketplace. A cadência depende do aplicativo. Recomendamos verificar as licenças uma vez por dia para receber as alterações automaticamente sem a intervenção do comprador.

   Um aplicativo implantado on-premises pode ter acesso não confiável à rede de saída para verificar as licenças em um ritmo regular. Nesses casos, o aplicativo deve usar licenças em cache para obter resiliência suficiente. Para obter mais informações, consulte [Práticas recomendadas para integração com o License Manager para implantações on-premises](#container-LM-best-practices-on-prem).

1. Depois de integrar a chamada `CheckoutLicense` ao seu aplicativo de contêiner, crie uma nova versão da imagem de contêiner do Docker com as alterações.

1. Atualize o gráfico do Helm do seu aplicativo para aceitar um segredo do Kubernetes como entrada opcional que contém a configuração para acessar licenças usando o License Manager. APIs O segredo de configuração conterá um token de identidade emitido pelo License Manager e uma AWS Identity and Access Management função que será usada pelo provedor de credenciais personalizado descrito anteriormente para obter AWS credenciais para chamar o License Manager APIs quando o aplicativo de contêiner for implantado localmente. Além disso, adicione a Região da AWS como uma entrada com um valor padrão de`us-east-1`.

   Os compradores que implantam o aplicativo de contêiner localmente podem criar o segredo do Kubernetes por meio da experiência do AWS Marketplace comprador em produtos de contêiner. Forneça o nome do segredo do Kubernetes como entrada para o comando `helm install`. O segredo da configuração tem o seguinte 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. Atualize o modelo de implantação do aplicativo no gráfico do Helm para imagens de contêiner integradas AWS License Manager para incluir o seguinte:
   + Conta de serviço para pod: a conta de serviço é necessária para implantações do Helm no Amazon EKS. Ela é usada para obter permissões para chamar as operações de API do License Manager configurando perfis do IAM para a conta de serviço na imagem do contêiner. Para obter mais informações sobre perfis do IAM para contas de serviço, consulte [Perfis do IAM para contas de serviço](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html).
   + Acesso à licença para implantações on-premises: o segredo da configuração da licença é necessário para fornecer credenciais e permissões apropriadas para chamar as operações de API do License Manager para implantações do Helm em ambientes on-premises. Os compradores gerarão e fornecerão o segredo da licença à Helm a partir da experiência do AWS Marketplace comprador.

   O snippet de código a seguir é um exemplo de especificação de implantação com a conta de serviço, a configuração da licença e o segredo de extração da imagem.

   ```
   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**  
O segredo da configuração da licença é opcional. Os compradores usam o valor somente para implantações on-premises. Para AWS implantações, a especificação de implantação deve incluir uma conta de serviço para as imagens integradas do License Manager.

1. Teste a integração do License Manager localmente e no Amazon EKS realizando as etapas nas seguintes seções:

   1. [Teste da integração do License Manager localmente](#container-testing-LM-integration-locally)

   1. [Teste da integração do License Manager no Amazon EKS](#container-testing-LM-integration-EKS)

1. Depois de verificar com êxito a integração do License Manager no local AWS e no local, você pode criar sua lista de produtos de contêiner seguindo as etapas em[Visão geral: crie um produto em contêiner](container-product-getting-started.md#create-container-product).

## Teste da integração do License Manager localmente
<a name="container-testing-LM-integration-locally"></a>

Você pode usar o minikube ou qualquer outra configuração para testar a integração do License Manager em qualquer cluster Kubernetes localmente. Certifique-se de que o cluster Kubernetes tenha acesso de saída à Internet para chamar as operações de API do License Manager.

**Para testar uma integração do License Manager localmente**

1. Crie uma licença de teste em uma conta de vendedor de teste com os direitos desejados. Para configurar uma licença de teste, consulte [CreateLicense](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_CreateLicense.html)a *Referência AWS License Manager da API*. Ou use o script a seguir para criar uma licença de teste e, em seguida, criar uma concessão de licença para uma conta de comprador de teste para consumir a licença. O script a seguir usa as credenciais da conta de vendedor de teste.

   ```
   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. Crie um segredo do Kubernetes com o token de licença e o perfil do IAM usando o formato do segredo definido anteriormente. Use a operação de API `CreateToken` do License Manager para gerar um token de licença. Em seguida, use a operação de API `CreateRole` do IAM para criar um perfil do IAM com permissões e uma política de confiança. Veja o exemplo no script seguinte. O script a seguir usa as credenciais da conta de comprador de teste.

   ```
   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. Configure qualquer cluster Kubernetes hospedado fora. AWS Use-o para testar se os aplicativos de contêiner podem se conectar à AWS License Manager API de outros ambientes AWS e se o provedor de credenciais personalizadas está bem integrado ao aplicativo.

1. Implante o token de licença e o perfil do IAM gerados anteriormente no cluster local do Kubernetes.

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

1. Implante seu aplicativo por meio do Helm com o nome do segredo como entrada e verifique se o aplicativo pode chamar as operações de API do License Manager para realizar verificações de direitos. Para alterações nas especificações do Helm e da implantação, consulte a Etapa 9 em [Integrando um produto AWS Marketplace for Containers Anywhere com o License Manager](#containers-anywhere-integrate-with-LM).

## Teste da integração do License Manager no Amazon EKS
<a name="container-testing-LM-integration-EKS"></a>

Você também pode testar a integração do License Manager no Amazon EKS. Teste para garantir que o aplicativo possa chamar as operações de API do License Manager sem o segredo da configuração da licença. Além disso, certifique-se de que a conta de serviço possa ser usada para configurar perfis do IAM para contas de serviço (IRSA) e fornecer credenciais relevantes para o aplicativo.

**Para testar a integração do License Manager no Amazon EKS**

1. Crie uma licença de teste em uma conta de vendedor de teste com os direitos desejados. Consulte a [referência CreateLicense da API](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_CreateLicense.html) para configurar sua licença de teste ou use o script a seguir para criar uma e criar uma concessão de licença para uma conta de comprador de teste para consumir a licença. O script a seguir usa as credenciais da conta de vendedor de teste.

   ```
   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. Crie um cluster de teste do Amazon EKS com as configurações desejadas ou execute os seguintes comandos para usar uma configuração padrão.

   ```
   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. Crie uma conta de serviço para um cluster existente e associe-o a um perfil do IAM. O comando a seguir cria um perfil do IAM com a `AWSLicenseManagerConsumptionPolicy`. Em seguida, o comando o anexa à conta de serviço `test_sa` do cluster do Amazon EKS em que as imagens integradas do License Manager devem ser implantadas. Como resultado, a conta de serviço pode obter as credenciais apropriadas para chamar as operações de API do 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. Implante o aplicativo por meio do Helm na conta de serviço em que o perfil do IAM está associado no comando anterior. Verifique se o aplicativo pode chamar as operações de API do License Manager para realizar verificações de direitos.

## Direitos de licença flutuante no License Manager
<a name="container-LM-floating-license"></a>

Com licenças flutuantes, à medida que os usuários acessam o aplicativo, uma licença é retirada do conjunto de licenças disponíveis. À medida que os usuários se desconectam, as licenças são adicionadas novamente ao conjunto de licenças disponíveis.

Para licenças flutuantes, o aplicativo usa a operação de API `CheckoutLicense` para verificar os direitos do conjunto de direitos quando o recurso está sendo usado. A resposta da operação de API `CheckoutLicense` inclui um token de consumo de licença, que é um identificador exclusivo para o checkout. O token de consumo de licença pode realizar ações adicionais nos direitos que são retirados, como devolvê-los ao conjunto de licenças ou estender a finalização da compra.

Quando o recurso não está mais em uso, o aplicativo usa a operação de API `CheckInLicense` para verificar o direito de volta ao conjunto.

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

Se a devolução de uma licença ao conjunto falhar, por exemplo, se o aplicativo falhar durante a operação, o direito será devolvido ao conjunto automaticamente após 60 minutos. Por esse motivo, se o recurso estiver em uso por mais de 60 minutos, é uma prática recomendada manter o direito retirado do conjunto. Para fazer isso, use a operação de API `ExtendLicenseConsumption` enquanto o recurso estiver sendo usado.

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

## Práticas recomendadas para integração com o License Manager para implantações on-premises
<a name="container-LM-best-practices-on-prem"></a>

Implantações de aplicativos de contêiner em um ambiente on-premises podem encontrar acesso não confiável à rede de saída. Use as práticas recomendadas a seguir para aumentar a resiliência e evitar a interrupção do serviço para os compradores devido a possíveis problemas causados pela baixa conectividade com a Internet:
+ Nova **tentativa adequada** — Problemas transitórios de rede podem impedir que seu aplicativo se conecte a. AWS License Manager Implemente novas tentativas por até 30 minutos, com recuo exponencial. Isso pode ajudar a evitar interrupções de curto prazo ou problemas de rede.
+ **Evitar limites rígidos**: os aplicativos implantados em clusters conectados podem verificar regularmente as licenças para identificar quaisquer alterações devido a atualizações ou renovações. Com o acesso externo não confiável, o aplicativo pode não conseguir identificar essas alterações. Sempre que possível, o aplicativo deve evitar a interrupção do serviço aos compradores devido à incapacidade de verificar as licenças por meio do License Manager. Os aplicativos podem recorrer a uma experiência de teste gratuito ou de código aberto quando a licença expirar e não podem verificar se a licença é válida.
+ **Notificar os clientes**: ao usar uma licença em cache, quaisquer alterações na licença (incluindo renovações ou upgrades) não são refletidas automaticamente na workload em execução. Notifique os clientes (que eles devem permitir o acesso externo ao aplicativo novamente temporariamente para que o aplicativo possa atualizar a licença em cache). Por exemplo, notifique os clientes por meio do próprio aplicativo ou da documentação. Da mesma forma, ao recorrer a um conjunto inferior de funcionalidades, notifique os clientes que os direitos estão esgotados ou que a licença expirou. Em seguida, eles podem optar por atualizar ou renovar.

## `LicenseManagerCredentialsProvider`: implementação de Java
<a name="container-license-manager-cred-provider-java"></a>

`LicenseCredentialsProvider`estende a cadeia de provedores de credenciais padrão do AWS SDK para uso local adicionando. `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` fornece credenciais usando tokens de identidade emitidos pelo License Manager OIDC em ambientes on-premises. Você deve incluir o código-fonte do `LicenseCredentialsProvider` no caminho de classe do seu aplicativo.

```
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`: implementação do `Golang`
<a name="container-license-manager-cred-provider-golang"></a>

**`LicenseCredentialsProvider`**

`LicenseCredentialsProvider`estende a cadeia de provedores de credenciais padrão do AWS SDK para uso local adicionando. `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` fornece credenciais usando tokens de identidade emitidos pelo License Manager OIDC em ambientes on-premises. Você deve incluir o código-fonte do `LicenseCredentialsProvider` no caminho de classe do seu aplicativo.

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

# Notificações do Amazon SNS para produtos de contêiner
<a name="container-notification"></a>

Para receber notificações, você pode assinar os tópicos do Amazon Simple Notification Service (Amazon SNS) fornecidos AWS Marketplace durante a criação do produto. Os tópicos fornecem notificações sobre alterações nas assinaturas dos clientes para seus produtos. Por exemplo, você pode usar essas notificações para saber quando os clientes aceitam uma oferta privada. 

**nota**  
Durante o processo de criação do produto, um tópico do Amazon SNS é criado para seu produto. Para assinar notificações, você precisa do nome do recurso da Amazon (ARN) do tópico do Amazon SNS (por exemplo, `arn:aws:sns:us-east-1:123456789012:aws-mp-subscription-notification-PRODUCTCODE`). O ARN não está disponível no portal do vendedor para produtos de servidor. Entre em contato com a [equipe de operações do AWS Marketplace](https://aws.amazon.com/marketplace/management/contact-us) para solicitar o ARN.

O seguinte tópico do Amazon SNS está disponível para produtos de contêiner:
+ [Tópico do Amazon SNS: `aws-mp-subscription-notification`](#container-sns-subscription-message-body): este tópico notifica você quando um comprador assina ou cancela a assinatura de um produto. Isso está disponível para modelos de preços por hora, incluindo por hora e por hora com longo prazo.

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

Cada mensagem no tópico `aws-mp-subscription-notification` tem o formato a seguir.

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

*<action-name>*Isso variará dependendo da notificação. As ações possíveis são:
+ `subscribe-success`
+ `subscribe-fail`
+ `unsubscribe-pending`
+ `unsubscribe-success`

O `offer-identifier` só é incluído na notificação quando a ação é `subscribe-success` ou `subscribe-fail`. Ele não é incluído em notificações quando a ação é `unsubscribe-pending` ou `unsubscribe-success`. Para ofertas criadas antes de janeiro de 2024, esse identificador só é incluído na notificação para ofertas privadas. Para ofertas criadas em janeiro de 2024 e posteriores, esse identificador é incluído em notificações de todas as ofertas, inclusive ofertas privadas e ofertas públicas.

Para obter informações sobre os tipos de oferta, consulte a resposta da [DescribeEntity API](https://docs.aws.amazon.com//marketplace/latest/APIReference/work-with-private-offers.html#describe-entity) ou a visibilidade da oferta de um contrato no [painel de renovações de contratos](https://docs.aws.amazon.com//marketplace/latest/userguide/agreements-renewals-dashboard.html).

**nota**  
 Para a [DescribeEntity API](https://docs.aws.amazon.com//marketplace/latest/APIReference/work-with-private-offers.html#describe-entity), se você encontrar uma faceta de segmentação Conta da AWS na conta da regra de segmentação para essa oferta, é uma oferta privada. Se não houver uma faceta de segmentação Conta da AWS na conta da regra de segmentação para essa oferta, é uma oferta pública.

## Assinatura de uma fila do Amazon SQS no tópico do Amazon SNS
<a name="subscribing-sqs-queue-to-sns-topic"></a>

Recomendamos assinar uma fila do Amazon SQS nos tópicos do SNS fornecidos. Para obter instruções detalhadas sobre como criar uma fila do SQS e assinar a fila em um tópico, consulte [Assinatura de uma fila do Amazon SQS em um tópico do Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/subscribe-sqs-queue-to-sns-topic.html) no *Guia do desenvolvedor do Amazon Simple Notification Service*.

**nota**  
Você só pode se inscrever AWS Marketplace nos tópicos do SNS do site Conta da AWS usado para vender os produtos. No entanto, você pode encaminhar as mensagens para uma conta diferente. Para obter mais informações, consulte [Envio de mensagens do Amazon SNS para uma fila do Amazon SQS em uma conta diferente](https://docs.aws.amazon.com/sns/latest/dg/sns-send-message-to-sqs-cross-account.html) no *Guia do desenvolvedor do Amazon Simple Notification Service*.

### Pesquisar notificações na fila do SQS
<a name="polling-the-sqs-for-notifications"></a>

Depois de assinar a fila do SQS em um tópico do SNS, as mensagens são armazenadas no SQS. Defina um serviço que continuamente sonde a fila, procure mensagens e manipule-as da forma adequada.