

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# を使用した AMI 製品のカスタム計測の設定 AWS Marketplace Metering Service
<a name="custom-metering-with-mp-metering-service"></a>

**注記**  
カスタム計測料金の AMI ベースの製品の場合、ソフトウェアは Amazon EC2 インスタンスにアタッチされた Amazon Elastic Compute Cloud の IAM ロールの一時的な AWS 認証情報を使用して [MeterUsage API](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_MeterUsage.html) を呼び出す必要があります。長期アクセスキーの使用はサポートされていません。

AWS Marketplace Metering Service は、使用カテゴリごとにソフトウェアを直接請求するために使用できる価格および計測機能です。ユーザー、データ、帯域幅、ホスト、ユニットの 5 つの使用カテゴリがあります。Metering Service は、Amazon マシンイメージ (AMI) ベース、コンテナベース、および Software as a Service (SaaS) ベースの製品で利用できます。以下のセクションでは、AWS Marketplace Metering Service でカスタム計測を設定する方法について詳述します。

AWS Marketplace Metering Service では、いくつかの新しいシナリオが利用可能になります。例えば、ソフトウェアでホストをモニタリングしている場合は、モニタリングされたホストごとに料金を請求できます。ホストのサイズに基づいて異なる料金を設定でき、モニタリングされる 1 時間ごとの同時実行ホスト数に対して課金できます。同様に、組織全体で多数のユーザーがソフトウェアにサインインできる場合は、ユーザー数によって課金できます。1 時間ごとに、プロビジョニングされたユーザーの合計数が請求されます。

詳細については、「[https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/Welcome.html)」を参照してください。

AMI ベースの製品の AWS Marketplace Metering Service API をカスタム計測料金と統合する方法の詳細については、*AWS Marketplace 販売者ワークショップ*の[「カスタムユニットラボで価格が設定されている AMI 製品のリスト](https://catalog.workshops.aws/mpseller/en-US/ami/list-ami-custom-units)」を参照してください。

**Topics**
+ [要件](#metering-service-requirements)
+ [AWS Marketplace Metering Service の呼び出し](#call-aws-marketplace-metering-service)
+ [障害処理](#important-information-about-failure-handling)
+ [制限事項](#limitations)
+ [コード例](#ami-metering-code-example)

## 要件
<a name="metering-service-requirements"></a>

Metering Service を使用するすべての AMI ベースのソフトウェアは次の要件を満たしている必要があります。
+ ソフトウェアは、Amazon マシンイメージ (AMI) AWS Marketplace を介して から起動する必要があります。
+ に既存の製品がある場合は AWS Marketplace、新しい AMI を送信し、この機能を有効にする新しい製品を作成する必要があります。
+ すべてのソフトウェアは AWS Identity and Access Management (IAM) ロールでプロビジョニングする必要があります。エンドカスタマーは、ユーザーがそのソフトウェアでプロビジョニングしている Amazon Elastic Compute Cloud (Amazon EC2) インスタンスに IAM ロールを追加する必要があります。ソフトウェアをデプロイする場合は、IAM ロールの使用はオプションです AWS Marketplace。これは AWS Marketplace Metering Service ソフトウェアをデプロイするときに必要です。
+ ソフトウェアでは、何らかの方法で消費量を決定できる必要があります。

## AWS Marketplace Metering Service の呼び出し
<a name="call-aws-marketplace-metering-service"></a>

 ソフトウェアを使用して、時間単位で Metering Service を呼び出し、その時間の消費値を記録する必要があります。

 ソフトウェアが起動したら、起動した時間 (分/時間) を記録する必要があります。これは、*start-minute* と呼ばれます。起動時間の 1 時間ごとに、ソフトウェアはその時間の消費量を判断し、Metering Service を呼び出します。この値を取得する方法の詳細については、「[Metering Service を使用するためのソフトウェアの変更](https://docs.aws.amazon.com/marketplace/latest/userguide/custom-metering-pricing-ami-products.html#modifying-your-software-to-use-the-metering-service)」を参照してください。

 1 時間ごとの開始時間に起動するには、以下のいずれかのアプローチをソフトウェアで使用する必要があります。
+  ソフトウェア内のスレッド。
+  インスタンスまたはソフトウェアで起動するデーモンプロセス。
+  アプリケーションのスタートアップ時に設定される cron ジョブ。
**注記**  
 お客様のソフトウェアで、顧客のインスタンスに設定された IAM ロールを使用して AWS Marketplace Metering Service を呼び出し、消費のディメンションと量を指定する必要があります。

次の実装例のように、ソフトウェアは AWS SDK を使用して AWS Marketplace Metering Service を呼び出すことができます。

1. サービスクライアントを作成するにはインスタンスプロファイルを使用します。そのためには、EC2 インスタンス用に設定されたロールが必要です。このロールの認証情報は、SDK によって自動的に更新されます。

1. 1 時間ごとに、ソフトウェア設定とステータスを確認し、その時間の消費値を決定します。これには、ディメンションごとの値の収集が含まれる場合があります。

1. 次のパラメータを指定して、SDK クライアントの `meterUsage` メソッドを呼び出します (使用量があるディメンションごとに追加で呼び出す)。
   + `timestamp` - 記録中の時間のタイムスタンプ (UTC で)。
   + `productCode` - ソフトウェアに割り当てられた製品コード。
   + `dimension` - ソフトウェアに割り当てられた 1 つのディメンション (または複数のディメンション) 
   + `quantity` - ある時間の消費値。
   + `allocations` - (オプション) 追跡するプロパティ全体にわたって使用量を割り当てることができます。これらの割り当てを合計すると、レコード内の総消費量になる必要があります。購入者にとって、これらは請求ツール ( AWS Billing and Cost Management コンソールなど) に潜在的なコスト配分タグとして表示されます。購入者がこれらのタグを使用してコストを追跡するには、アカウントでタグを有効にする必要があります。

さらに、ソフトウェアを使用して、リージョン内の AWS Marketplace Metering Service エンドポイントを呼び出す必要があります。製品に適切なリージョンのエンドポイントが設定されている必要があります。そのため、記録は `us-east-1` より `us-east-1` エンドポイント、`us-west-2` より `us-west-2` エンドポイントに送信されます。リージョン内呼び出しを行うと、購入者にはより安定したエクスペリエンスが提供され、無関係なリージョンのアベイラビリティーが別のリージョンで実行されているソフトウェアに影響を及ぼすことを防ぐことができます。

サービスに計測レコードを送信するときは、リージョンの AWS Marketplace Metering Service に接続する必要があります。`getCurrentRegion()` ヘルパーメソッドを使用して、EC2 インスタンスが実行されているリージョンを特定し、このリージョンの情報を `MeteringServiceClient` コンストラクタに渡します。SDK コンストラクタ AWS リージョン で を指定しない場合、デフォルトの`us-east-1`リージョンが使用されます。アプリケーションでサービスへのクロスリージョンコールを行うと、拒否されます。詳細については、[Determining an Application’s Current Region](https://java.awsblog.com/post/Tx3GBOIEN1JJMQ5/Determining-an-Application-s-Current-Region) および [getCurrentRegion()](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/regions/Regions.html#getCurrentRegion()) を参照してください。

## 障害処理
<a name="important-information-about-failure-handling"></a>

製品は、公共のインターネットエンドポイントであるサービスに計測レコードを送信する必要があるため、使用状況をキャプチャして請求することができます。顧客は計測レコードの配信を妨げる方法でネットワーク設定を変更する可能性があるため、製品は障害モードを選択することで考慮する必要があります。

**注記**  
一部の計測障害は、 への接続における一時的な問題である場合があります AWS Marketplace Metering Service。 AWS Marketplace では、短期的な停止やネットワークの問題を避けるため、エクスポネンシャルバックオフで最大 30 分間の再試行を実装することを強くお勧めします。

通常、ソフトウェアはフェイルオープン (警告メッセージを表示しながら完全な機能を維持する) か、またはフェイルクローズ (接続が再確立されるまでアプリケーション内のすべての機能を無効にする) を行うことができます。フェイルオープン、フェイルクローズ、またはアプリケーション固有の機能を選択できます。2 時間以内の計測に失敗した場合は、フェイルクローズを行わないことをお勧めします。

部分的なフェイルオープンの場合の一例として、ソフトウェアへのアクセスを引き続き許可することはできますが、購入者がソフトウェア設定を変更することはできません。または、購入者はソフトウェアに引き続きアクセスできますが、追加のユーザーを作成することはできません。ソフトウェアを使用して、この障害モードを定義して実行する必要があります。AMI の送信時、ソフトウェアの障害モードを含む必要があります。また、後に変更することはできません。

## 制限事項
<a name="limitations"></a>

 Metering Service 対応ソフトウェアを設計および送信する場合、次の制約事項に留意してください。
+ **お客様の IAM ロールとインターネットゲートウェイの要件** - お客様はインターネットゲートウェイを持ち、特定のアクセス許可を持つ IAM ロールでソフトウェアを起動する必要があります。詳細については、「[AWS Marketplace 計測と使用権限 API アクセス許可](iam-user-policy-for-aws-marketplace-actions.md)」を参照してください。これらのうち 2 つの条件が満たされない場合、ソフトウェアは Metering Service に接続できません。
+  **既存の Metering Service product 製品への新しい使用カテゴリの追加および変更の不可** - お客様は、ソフトウェア製品をサブスクライブすると、利用規約に同意したものと見なされます。Metering Service を使用して製品の使用カテゴリを変更するには、新しい製品と新しいサブスクリプションが必要です。
+ **既存の Metering Service 製品のディメンションの変更の不可** - お客様は、ソフトウェア製品をサブスクライブすると、利用規約に同意したものと見なされます。Metering Service を使用して製品のディメンションを変更するには、新しい製品と新しいサブスクリプションが必要です。既存の製品には、最大 24 個まで新しいディメンションを追加*できます*。
+  **無料トライアルおよび年間サブスクリプションは利用不可** - Metering Service 製品は、起動時に無料トライアルおよび年間サブスクリプションをサポートしていません。
+  **マルチインスタンスまたはクラスターベースのデプロイメントに関する考慮事項** - 一部のソフトウェアは、マルチインスタンスデプロイメントの一部としてデプロイされます。ソフトウェアの設計時には、消費量を計測する方法と場所、および計測レコードが出力される場所を検討してください。

## コード例
<a name="ami-metering-code-example"></a>

次のコード例は、製品の公開およびメンテナンスに必要な AWS Marketplace API と AMI 製品を統合するのに役立てることを目的として提供されています。

### 使用量配分タグ付き `MeterUsage` (オプション)
<a name="ami-meterusage-code-example"></a>

次のコード例は、消費料金モデルを持つ AMI 製品に関連しています。Python の例では、従量制料金を顧客に請求するために、適切な使用量割り当てタグを含む計測レコードを AWS Marketplace に送信します。

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

`MeterUsage` の詳細については、「AWS Marketplace Metering Service API リファレンス」の「[MeterUsage](https://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html)」を参照してください。**

### レスポンスの例
<a name="ami-meterusage-code-response"></a>

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