

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Configurazione della misurazione oraria con AWS Marketplace Metering Service
Configurazione della misurazione con AWS Marketplace Metering Service

**Nota**  
 Per le implementazioni di Amazon EKS, il tuo software deve utilizzare [IAM roles for service accounts (IRSA)](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) per firmare la chiamata API per il funzionamento dell'[https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_RegisterUsage.html)API. L'utilizzo di [EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html), il ruolo del nodo o le chiavi di accesso a lungo termine non sono supportati.  
Per le distribuzioni di Amazon ECS, il tuo software deve utilizzare il ruolo [IAM dell'attività di Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) per firmare la chiamata API per l'operazione 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) L'utilizzo del ruolo del nodo o delle chiavi di accesso a lungo termine non è supportato.

Se il prodotto in container utilizza prezzi orari per attività o per pod anziché dimensioni di prezzo personalizzate basate su misuratori, non è necessario definire dimensioni di misurazione personalizzate. Puoi utilizzare AWS Marketplace Metering Service per la misurazione oraria con prodotti container all'interno. Marketplace AWS Le seguenti sezioni mostrano come configurare la misurazione oraria con AWS Marketplace Metering Service.

Il funzionamento dell'`RegisterUsage`API misura l'utilizzo del software per attività Amazon Elastic Container Service (Amazon ECS) o per pod Amazon Elastic Kubernetes Service (Amazon EKS), all'ora, con un utilizzo proporzionale al secondo. Un minimo di 1 minuto di utilizzo si applica alle attività o ai pod di breve durata. La misurazione continua dell'uso del software viene gestita automaticamente da. Marketplace AWS Metering Control Plane Il software non è tenuto a eseguire alcuna azione specifica di misurazione, ad eccezione di `RegisterUsage` una chiamata una sola volta per iniziare la misurazione dell'utilizzo del software.

`RegisterUsage`deve essere chiamato immediatamente al momento del lancio di un container. Se non registri il container nelle prime 6 ore dal lancio del container, AWS Marketplace Metering Service non fornisce alcuna garanzia di misurazione per i mesi precedenti. Tuttavia, la misurazione continuerà per il mese in corso fino alla scadenza del container.

 Marketplace AWS Metering Control PlaneContinua a fatturare ai clienti l'esecuzione delle attività di Amazon ECS e dei pod Amazon EKS, indipendentemente dallo stato dell'abbonamento del cliente. In questo modo non è più necessario che il software esegua controlli di autorizzazione dopo l'avvio iniziale con successo dell'operazione o del pod. 

*Per ulteriori informazioni sull'integrazione dell' AWS Marketplace Metering Service API con i prodotti container con prezzi orari, consulta il laboratorio [Integrazione con misurazione oraria](https://catalog.workshops.aws/mpseller/en-US/container/integrate-hourly) del workshop dedicato ai venditori.Marketplace AWS * 

**Topics**
+ [

## Prerequisiti per la misurazione oraria
](#hourly-metering-prereqs)
+ [

## Test dell'integrazione per `RegisterUsage`
](#testing-integration-for-registerusage)
+ [

## Gestione degli errori per `RegisterUsage`
](#hourly-metering-entitlement-error-handling)
+ [

# Integrazione del prodotto container con AWS Marketplace Metering Service utilizzando AWS SDK per Java
](java-integration-example-registerusage.md)

## Prerequisiti per la misurazione oraria


Prima di pubblicare il prodotto, devi fare quanto segue:

1. Crea un nuovo prodotto contenitore in e prendi nota del relativo codice prodotto. Portale di gestione Marketplace AWS

   Per ulteriori informazioni, consulta [Panoramica: crea un prodotto contenitore](container-product-getting-started.md#create-container-product).

1. Utilizza un ruolo AWS Identity and Access Management (IAM) per l'attività o il pod che esegue l'applicazione con le autorizzazioni IAM necessarie per la chiamata`RegisterUsage`. La policy gestita da IAM `AWSMarketplaceMeteringRegisterUsage` dispone di queste autorizzazioni. Per ulteriori informazioni sulla policy, consulta [ AWSMarketplaceMeteringFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSMarketplaceMeteringFullAccess.html)il *AWS Managed Policy Reference.*

1. (Facoltativo) Se desideri visualizzare la registrazione, ti consigliamo di abilitare la AWS CloudTrail registrazione nella definizione dell'attività o del pod.

1. Effettua una chiamata di prova all'operazione `RegisterUsage` API con un record per tutte le dimensioni di prezzo che definisci.

## Test dell'integrazione per `RegisterUsage`


Utilizza l'operazione `RegisterUsage` API per testare l'integrazione prima di inviare l'immagine Marketplace AWS per la pubblicazione.

Chiama `RegisterUsage` dall'immagine del contenitore eseguendo il prodotto su Amazon ECS o Amazon EKS. Usa l' AWS account che stai utilizzando per pubblicare l'offerta del prodotto. Marketplace AWS La tua integrazione di misurazione deve impostare dinamicamente il file Regione AWS, anziché codificarlo. Tuttavia, durante il test, avvia almeno un'attività Amazon ECS o un pod Amazon EKS contenente il container a pagamento nella regione Stati Uniti orientali (Virginia settentrionale). In questo modo, il team Marketplace AWS operativo può verificare il tuo lavoro con i log di quella regione.

**Nota**  
Se il tuo prodotto supporta sia Amazon ECS che Amazon EKS, devi solo avviarlo in Amazon EKS per consentirci di convalidare la tua integrazione.

Non puoi testare completamente l'integrazione finché il prodotto non viene pubblicato con tutti i metadati e le informazioni sui prezzi richiesti. Se richiesto, il team operativo del Marketplace AWS catalogo può verificare la ricezione dei dati di misurazione.

## Gestione degli errori per `RegisterUsage`


Se l'immagine del contenitore si integra con AWS Marketplace Metering Service e riceve un'eccezione diversa `ThrottlingException` dall'avvio del contenitore, è necessario terminare il contenitore per impedirne l'uso non autorizzato.

Le eccezioni diverse da `ThrottlingException` vengono generate solo durante la chiamata iniziale all'operazione API. `RegisterUsage` Le chiamate successive dalla stessa attività Amazon ECS o dallo stesso pod Amazon EKS non vengono generate `CustomerNotSubscribedException` anche se il cliente annulla l'iscrizione mentre l'attività o il pod è ancora in esecuzione. A questi clienti viene comunque addebitato il costo per l'utilizzo dei container dopo l'annullamento dell'iscrizione e il loro utilizzo viene monitorato.

La tabella seguente descrive gli errori che l'operazione `RegisterUsage` API potrebbe generare. Ogni linguaggio di programmazione AWS SDK dispone di una serie di linee guida per la gestione degli errori a cui puoi fare riferimento per ulteriori informazioni. 


|  **Errore**  |  **Descrizione**  | 
| --- | --- | 
|  InternalServiceErrorException  |  RegisterUsagenon è disponibile.  | 
|  CustomerNotEntitledException  |  Il cliente non dispone di un abbonamento valido per il prodotto.  | 
|  InvalidProductCodeException  |  Il ProductCode valore passato come parte della richiesta non esiste.  | 
|  InvalidPublicKeyException  |  Il PublicKeyVersion valore passato come parte della richiesta non esiste.  | 
|  PlatformNotSupportedException  |  Marketplace AWS non supporta la misurazione dell'utilizzo dalla piattaforma sottostante. Sono supportati solo Amazon ECS, Amazon EKS e AWS Fargate .  | 
|  ThrottlingException  |  Le chiamate a RegisterUsage sono limitate.  | 
|  InvalidRegionException  |  RegisterUsagedeve essere chiamato nello stesso modo in Regione AWS cui è stato lanciato il task Amazon ECS o il pod Amazon EKS. Ciò impedisce a un contenitore di scegliere una regione (ad esempiowithRegion(“us-east-1”)) durante la chiamataRegisterUsage.  | 

# Integrazione del prodotto container con AWS Marketplace Metering Service utilizzando AWS SDK per Java
Esempio di integrazione con Java

Puoi utilizzarlo AWS SDK per Java per l'integrazione con l'AWS Marketplace Metering Service. La misurazione continua dell'uso del software viene gestita automaticamente da. Marketplace AWS Metering Control Plane Il software non è tenuto a eseguire alcuna azione specifica di misurazione, ad eccezione di `RegisterUsage` una chiamata una sola volta per iniziare la misurazione dell'utilizzo del software. Questo argomento fornisce un esempio di implementazione che utilizza l'azione del servizio di [Marketplace AWS misurazione AWS SDK per Java](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html) per l'integrazione con l'azione. `RegisterUsage` 

`RegisterUsage`deve essere chiamato immediatamente al momento del lancio di un contenitore. Se non registri il container nelle prime 6 ore dal lancio del container, AWS Marketplace Metering Service non fornisce alcuna garanzia di misurazione per i mesi precedenti. Tuttavia, la misurazione continuerà per il mese in corso fino alla scadenza del container.

Per il codice sorgente completo, vedi[RegisterUsage Esempio di Java](#registerusage-java-example). Molti di questi passaggi si applicano indipendentemente dal linguaggio AWS SDK. 



**Esempi di passaggi per l'integrazione con AWS Marketplace Metering Service**

1. Accedi alla [Portale di gestione Marketplace AWS](https://aws.amazon.com/marketplace/management/tour).

1. Da **Assets** scegli **Containers** per iniziare a creare un nuovo prodotto container. La creazione del prodotto genera il codice prodotto per il prodotto da integrare con l'immagine del contenitore. Per informazioni sull'impostazione delle autorizzazioni IAM, consulta[Marketplace AWS autorizzazioni API di misurazione e autorizzazione](iam-user-policy-for-aws-marketplace-actions.md).

1.  Scarica l'[SDK AWS Java](https://aws.amazon.com/sdk-for-java/) pubblico. 
**Importante**  
 Per richiamare la misurazione APIs da Amazon EKS, devi [utilizzare un AWS SDK supportato ed eseguirlo su un](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-minimum-sdk.html) cluster Amazon EKS che esegue Kubernetes 1.13 o versione successiva. 

1.  (Facoltativo) Se ti stai integrando con l'`RegisterUsage`azione e desideri eseguire la verifica della firma digitale, devi configurare la libreria di verifica delle firme nel classpath dell'applicazione [BouncyCastle](https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on).

   Se desideri utilizzare JSON Web Token (JWT), devi includere anche le librerie [JWT Java](https://jwt.io/) nel classpath dell'applicazione. L'utilizzo di JWT offre un approccio più semplice alla verifica della firma, ma non è obbligatorio ed è possibile utilizzare invece la modalità standalone. BouncyCastle Sia che utilizzi JWT o BouncyCastle che sia necessario utilizzare un sistema di compilazione come Maven per includere dipendenze transitive di o JWT nel classpath dell'applicazione. BouncyCastle 

   ```
   // Required for signature verification using code sample
   <dependency>
       <groupId>org.bouncycastle</groupId>
       <artifactId>bcpkix-jdk15on</artifactId>
       <version>1.60</version>
   </dependency>
   
   // This one is only required for JWT
   <dependency>
       <groupId>com.nimbusds</groupId>
       <artifactId>nimbus-jose-jwt</artifactId>
       <version>6.0</version>
   </dependency>
   ```

1.  Chiama `RegisterUsage` da ogni immagine di container a pagamento presente nella tua offerta di prodotti. `ProductCode`e `PublicKeyVersion` sono parametri obbligatori e tutti gli altri input sono opzionali. Di seguito è riportato un esempio di payload per. `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**  
È possibile riscontrare problemi transitori nella connessione all'AWS Marketplace Metering Service. Marketplace AWS consiglia vivamente di implementare nuovi tentativi per un massimo di 30 minuti, con interruzione esponenziale, per evitare interruzioni a breve termine o problemi di rete.

1.  `RegisterUsage`genera una firma digitale RSA-PSS utilizzando SHA-256 che è possibile utilizzare per verificare l'autenticità della richiesta. La firma include i seguenti campi:, e. `ProductCode` `PublicKeyVersion` `Nonce` Per verificare la firma digitale, è necessario conservare questi campi della richiesta. Il codice seguente è un esempio di risposta a una `RegisterUsage` chiamata. 

   ```
   {
   "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. Ricostruisci una nuova versione dell'immagine del contenitore che includa la `RegisterUsage` chiamata, tagga il contenitore e inviala a qualsiasi registro di container compatibile con Amazon ECS o Amazon EKS, come Amazon ECR o Amazon ECR Public. Se utilizzi Amazon ECR, assicurati che l'account che avvia l'attività Amazon ECS o il pod Amazon EKS disponga delle autorizzazioni per l'archivio Amazon ECR. In caso contrario, il lancio fallisce.

1.  Crea un ruolo [IAM](https://aws.amazon.com/iam/) che conceda l'autorizzazione alla chiamata del contenitore`RegisterUsage`, come definito nel codice seguente. È necessario fornire questo ruolo IAM nel parametro [Task Role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_role_arn) della definizione del task Amazon ECS o del pod Amazon EKS.

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

****  

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

------

1. Crea un'attività Amazon ECS o una definizione del pod Amazon EKS che faccia riferimento al contenitore integrato Marketplace AWS e che faccia riferimento al ruolo IAM creato nella fase 7. È necessario abilitare AWS CloudTrail la registrazione nella definizione dell'attività se si desidera visualizzare la registrazione. 

1. Crea un cluster Amazon ECS o Amazon EKS per eseguire la tua attività o il tuo pod. Per ulteriori informazioni sulla creazione di un cluster Amazon ECS, consulta [Creating a Cluster](https://docs.aws.amazon.com/AmazonECS/latest/userguide/create_cluster.html) nella *Amazon Elastic Container Service Developer Guide*. [Per ulteriori informazioni sulla creazione di un cluster Amazon EKS (utilizzando Kubernetes versione 1.1.3.x o successiva), consulta Creazione di un cluster Amazon EKS.](https://docs.aws.amazon.com/eks/latest/userguide/create_cluster.html)

1. Configura il cluster Amazon ECS o Amazon EKS e avvia la definizione di attività Amazon ECS o il pod Amazon EKS che hai creato, in us-east-1. Regione AWSÈ solo durante questo processo di test, prima che il prodotto sia disponibile, che devi utilizzare questa regione.

1. Quando ricevi una risposta valida da`RegisterUsage`, puoi iniziare a creare il tuo prodotto contenitore. Per domande, contatta il team [Operativo Marketplace AWS del venditore](https://aws.amazon.com/marketplace/management/contact-us/). 

## RegisterUsage Esempio di Java


L'esempio seguente utilizza AWS SDK per Java and Marketplace AWS Metering Service per chiamare l'`RegisterUsage`operazione. La verifica della firma è facoltativa, ma se si desidera eseguire la verifica della firma, è necessario includere le librerie di verifica delle firme digitali richieste. Questo esempio è solo a scopo illustrativo. 

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