Integrando seu produto de contêiner usando medição personalizada com o AWS Marketplace Metering Service e AWS SDK para Java - AWS Marketplace

Integrando seu produto de contêiner usando medição personalizada com o AWS Marketplace Metering Service e AWS SDK para Java

AWS MarketplaceOs produtos de contêiner do podem ter medição personalizada em até 24 diferentes dimensões de definição de preço 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 MeterUsage. O exemplo a seguir descreve uma implementação que usa o AWS SDK para Java para se integrar à operação MeterUsage do Serviço de medição do AWS Marketplace.

Para obter detalhes completos, consulte Exemplos de Java do MeterUsage. Muitas etapas a seguir se aplicam independentemente da linguagem.

Exemplo: integração ao serviço de medição do AWS Marketplace
  1. Faça login no Portal de gerenciamento do AWS Marketplace.

  2. 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 mais informações sobre configuração de permissões do AWS Identity and Access Management (IAM), consulte AWS MarketplacePermissões de API de medição e autorização do .

  3. Faça download do SDK do AWS 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 e executar em um cluster do Amazon EKS executando o Kubernetes 1.13 ou posterior.

  4. 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. O AWS Marketplace recomenda a implementação de novas tentativas por até 30 minutos, com recuo exponencial, para evitar interrupções de curto prazo ou problemas de rede.

  5. 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.

  6. Crie um perfil do IAM que conceda permissão para o contêiner chamar MeterUsage, conforme definido no exemplo de código a seguir. Forneça esse perfil do AWS Identity and Access Management (IAM) no parâmetro Função da tarefa da definição de tarefa do Amazon ECS ou de pod do Amazon EKS.

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Action": [ "aws-marketplace:MeterUsage" ], "Effect": "Allow", "Resource": "*" } ] }
  7. Crie uma definição de tarefa do Amazon ECS ou de pod do Amazon EKS que faça referência ao contêiner integrado ao AWS Marketplace e ao perfil do IAM criada na etapa 6. Se quiser ver o registro em log, habilite o registro em log do AWS CloudTrail na definição de tarefa.

  8. 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 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.

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

  10. 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.

Exemplos de Java do MeterUsage

Os exemplos de código a seguir usam o AWS SDK para Java e do Serviço de medição do AWS Marketplace para chamar a operação MeterUsage.

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