すべてのプロダクト
Search
ドキュメントセンター

Compute Nest:PushMeteringData

最終更新日:Jun 08, 2025

サービスインスタンス内から従量制データをプッシュします。

使用方法

  • この操作を呼び出して、従量課金 Compute Nest サービスインスタンスの従量制データのみをプッシュできます。プッシュされた課金項目のレポート方法は、「サービスプロバイダーによって報告される」に設定する必要があります。

  • この操作は、Compute Nest を使用して作成された Elastic Compute Service (ECS) または Container Service for Kubernetes (ACK) インスタンス内で呼び出して、従量制データをプッシュできます。 PushMeteringData 操作の呼び出し方法については、「PushMeteringData」をご参照ください。

リクエストパラメーター

パラメーター

タイプ

必須

説明

Metering

文字列

はい

従量制データ。サンプル値のパラメーター:

  • StartTime:従量制操作の開始時刻。 1970年 1 月 1 日 00:00:00 UTC から経過した秒数を表す UNIX タイムスタンプを指定します。

  • EndTime:従量制操作の終了時刻。 1970年 1 月 1 日 00:00:00 UTC から経過した秒数を表す UNIX タイムスタンプを指定します。

  • Entities:従量制エンティティ。

    • Key:課金項目の名前。有効な値:

      • Frequency:インスタンスが使用された回数。

      • Period:インスタンスの使用期間。単位:秒。

        重要

        リクエストパラメーターの期間の単位は秒ですが、課金の単位は時間です。そのため、請求書が生成されると、秒は時間に換算されます。たとえば、19:00~20:00 の従量制使用量が 1,800 秒で、価格が 1 時間あたり 1 ドルであるとします。この場合、19:00~20:00 の 1 時間あたりの請求額は、次の式を使用して計算されます。1,800/3,600 × 1 = 0.5 ドル。結果が小数の場合、小数点以下 2 桁まで保持され、それ以降は切り捨てられます。

      • Storage:使用済みストレージ容量。単位:バイト。

        重要

        リクエストパラメーターの単位はバイトですが、課金の単位は MB です。そのため、請求書が生成されると、バイトはメガバイトに換算されます。たとえば、19:00~20:00 の従量制使用量が 524,288 バイトで、価格が 1 MB あたり 1 ドルであるとします。この場合、19:00~20:00 の 1 時間あたりの請求額は、次の式を使用して計算されます。524,288/1,024/1,024 × 1 = 0.5 ドル。結果が小数の場合、小数点以下 2 桁まで保持され、それ以降は切り捨てられます。

      • NetworkOut:消費されたアップストリームトラフィック。単位:ビット。

        重要

        リクエストパラメーターの単位はビットですが、課金の単位は Mbit です。そのため、請求書が生成されると、ビットはメガビットに換算されます。たとえば、19:00~20:00 の従量制使用量が 524,288 ビットで、価格が 1 Mbit あたり 1 ドルであるとします。この場合、19:00~20:00 の 1 時間あたりの請求額は、次の式を使用して計算されます。524,288/1,024/1,024 × 1 = 0.5 ドル。結果が小数の場合、小数点以下 2 桁まで保持され、それ以降は切り捨てられます。

      • NetworkIn:消費されたダウンストリームトラフィック。単位:ビット。

        重要

        リクエストパラメーターの単位はビットですが、課金の単位は Mbit です。そのため、請求書が生成されると、ビットはメガビットに換算されます。たとえば、19:00~20:00 の従量制使用量が 524,288 ビットで、価格が 1 Mbit あたり 1 ドルであるとします。この場合、19:00~20:00 の 1 時間あたりの請求額は、次の式を使用して計算されます。524,288/1,024/1,024 × 1 = 0.5 ドル。結果が小数の場合、小数点以下 2 桁まで保持され、それ以降は切り捨てられます。

      • Character:文字数。

      • DailyActiveUser:デイリーアクティブユーザー (DAU) 数。

      • PeriodMin:インスタンスの使用期間。単位:分。

      • VirtualCpu:vCPU コア数。

        • Memory:メモリ (GB)

    • Value:課金項目の値。 0 以上で INTEGER タイプの値を指定します。

説明
  • プロダクトの請求がリアルタイムで生成される場合、StartTime と EndTime の値の差に制限はありません。ただし、EndTime の値は StartTime の値よりも後である必要があります。

  • プロダクトの請求が請求サイクル(時間ごと、日ごと、月ごとなど)で生成される場合、StartTime と EndTime の値の差は 5 分以上である必要があります。

[{"StartTime":"1664451045","EndTime":"1664451198","Entities":[{"Key":"Frequency","Value":"6"}]}]

Token

文字列

はい

Compute Nest が従量制データがサービスプロバイダーによってプッシュされたかどうかを判断するために使用するトークン。

Metering&Key 形式の文字列を MD5 暗号化アルゴリズムを使用して暗号化し、トークンを取得します。トークン値は、小文字の 32 文字の文字列です。

  • Metering:従量制データ。例:[{"StartTime":"1664451045","EndTime":"1664451198","Entities":[{"Key":"Frequency","Value":"6"}]}]。詳細については、このトピックのMetering をご参照ください。

  • Key:サービスキー。例:e98893f5ecc3ae1ctest。サービスキーは、サービス詳細ページで取得できます。

    説明

    サービスキーは一意であり、サービスバージョンの変更の影響を受けません。

  • 暗号化する文字列:Metering=[{"StartTime":"1664451045","EndTime":"1664451198","Entities":[{"Key":"Frequency","Value":"6"}]}]&Key=e98893f5ecc3ae1ctest

  • トークン値:7aa81300b2aea77984b772495c8e4e83

レスポンスパラメーター

パラメーター

タイプ

説明

RequestId

文字列

Compute Nest から返されたリクエスト ID。

e6862d3a-9305-4289-8dd3-9c52a680228b

Success

ブール値

リクエストが成功したかどうかを示します。

true

PushMeteringDataRequestId

文字列

Alibaba Cloud Marketplace から返されたリクエスト ID。

7lc658a2-tr41-****-****-c25es45vc248

Token

文字列

サービスプロバイダーがデジタル署名を比較するために使用するトークン。詳細については、「Compute Nest デジタル署名の検証」をご参照ください。

50130a063c6acf833280d23169898bd4

この例では、Alibaba Cloud Marketplace で公開されている従量課金 Compute Nest サービスによって作成された ECS インスタンスで PushMeteringData 操作が呼び出されます。

Curl の例

  1. ECS インスタンスが存在するリージョンの ID を取得します。

    PushMeteringData 操作を呼び出す前に、サービス用に作成された ECS インスタンスのリージョン ID を取得する必要があります。取得したリージョン ID は、後続の操作で必要になります。そのため、リージョン ID は適切に保管してください。

    1. 次の URL にアクセスして、リージョン ID を取得します。

      curl http://100.100.100.200/latest/meta-data/region-id
    2. 出力例:

      cn-hangzhou
  2. 入力パラメーターを準備します。

    "Metering":"[{\"StartTime\":\"1664451045\",\"EndTime\":\"1664451198\",\"Entities\":[{\"Key\":\"Frequency\",\"Value\":\"6\"}]}]","Token":"7aa81300b2aea77984b772495c8e4e83"

    • Metering:[{\"StartTime\":\"1664451045\",\"EndTime\":\"1664451198\",\"Entities\":[{\"Key\":\"Frequency\",\"Value\":\"6\"}]}]

      説明

      この例では curl を使用して PushMeteringData を呼び出すため、エスケープ文字 \ を追加する必要があります。コードを使用して操作を呼び出す場合は、エスケープ文字を追加する必要はありません。

    • Token:7aa81300b2aea77984b772495c8e4e83。値は小文字の 32 文字の文字列で、Metering&Key 形式の文字列を MD5 暗号化アルゴリズムを使用して暗号化することで取得されます。

  3. リクエストを準備します。例:

    curl -H "Content-Type: application/json" -XPOST https://cn-hangzhou.axt.aliyun.com/computeNest/marketplace/push_metering_data -d '{"Metering":"[{\"StartTime\":\"1664451045\",\"EndTime\":\"1664451198\",\"Entities\":[{\"Key\":\"Frequency\",\"Value\":\"6\"}]}]","Token":"7aa81300b2aea77984b772495c8e4e83"}'
    説明

    https://cn-hangzhou.axt.aliyun.comcn-hangzhou は、手順 1 で取得したリージョンです。操作を呼び出すときは、実際のリージョンに置き換えてください。

  4. レスポンスを取得します。例:

    {
        "RequestId":"4ca591b5-bc30-****-****-c4d0ec5d24ed", 
        "Success":"true",
        "PushMeteringDataRequestId":"7lc658a2-tr41-****-****-c25es45vc248", 
        "Token":"50130a063c6acf833280d23169898bd4"
    }

コード例

Python

import requests
import json
import hashlib
import time
from urllib.request import urlopen

def get_region_id():
    """リージョン ID ( cn-hangzhou など) を Alibaba Cloud メタデータサービスを使用して取得します""" # 翻訳済みコメント
    try:
        with urlopen(
            "http://100.100.100.200/latest/meta-data/region-id",
            timeout=2
        ) as response:
            return response.read().decode().strip()
    except Exception as e:
        print(f"リージョン ID の取得に失敗しました: {str(e)}", file=sys.stderr) # 翻訳済みコメント
        sys.exit(1)

def push_metering_data(entities_map, service_key):
    # 現在時刻を動的に取得 (Unix タイムスタンプ(秒)) # 翻訳済みコメント
    current_time = int(time.time())
    start_time = current_time 
    end_time = current_time + 1

    # 従量制データを構築 # 翻訳済みコメント
    metering_data = [
        {
            "StartTime": str(start_time),
            "EndTime": str(end_time),
            "Entities": [
                {"Key": key, "Value": str(value)} 
                for key, value in entities_map.items()
            ]
        }
    ]
    metering_str = json.dumps(metering_data)

    # リージョン ID を動的に取得し、URL を構築 # 翻訳済みコメント
    region_id = get_region_id()
    url = f"https://{region_id}.axt.aliyun.com/computeNest/marketplace/push_metering_data"

    # トークンを計算 # 翻訳済みコメント
    token_str = metering_str + "&" + service_key
    token = hashlib.md5(token_str.encode()).hexdigest().lower()

    # POST リクエストを送信 # 翻訳済みコメント
    try:
        response = requests.post(
            url,
            json={
                "Metering": metering_str,
                "Token": token
            },
            headers={"Content-Type": "application/json"}
        )
        print(f"リクエスト URL: {url}", file=sys.stderr) # 翻訳済みコメント
        print(f"ステータスコード: {response.status_code}", file=sys.stderr) # 翻訳済みコメント
        print(f"レスポンス: {response.text}", file=sys.stderr) # 翻訳済みコメント
    except Exception as e:
        print(f"リクエストに失敗しました: {str(e)}", file=sys.stderr) # 翻訳済みコメント

if __name__ == "__main__":
    import sys
    # パラメーターの例 (実際のプッシュデータに置き換えます。key は従量制項目、value は値です) # 翻訳済みコメント
    entities = {
        "Frequency": "6"
    }
    # サービスプロバイダーキー # 翻訳済みコメント
    service_key = "your_service_key_here"

    # 関数を呼び出す # 翻訳済みコメント
    push_metering_data(entities, service_key)

例。

image

Java

import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;     

public class MeteringPusher {
    public static void main(String[] args) {
        try {
            // === リージョン ID を動的に取得 === # 翻訳済みコメント
            String regionId = getRegionId();
            System.out.println("検出されたリージョン ID: " + regionId); # 翻訳済みコメント

            // === リクエストボディを構築 === # 翻訳済みコメント
            Map<String, String> entities = new HashMap<>(); // エンティティを構築、実際のプッシュコンテンツに置き換えます # 翻訳済みコメント
            entities.put("Frequency", "6");
            String serviceKey = "your_service_key_here"; // 実際のサービスプロバイダーキーに置き換えます # 翻訳済みコメント
            JSONObject payload = generateDynamicRequest(regionId, entities, serviceKey);
            String paylodString = payload.toString();

            // テストのみの場合、上記のコンテンツをコメントアウトし、以下のコンテンツを直接入力できます。StartTime、EndTime、その他のパラメーターは置き換える必要があります # 翻訳済みコメント
            // String paylodString = "{\"Metering\":\"[{\\\"StartTime\\\":\\\"1664451045\\\",\\\"EndTime\\\":\\\"1664451198\\\",\\\"Entities\\\":[{\\\"Key\\\":\\\"Frequency\\\",\\\"Value\\\":\\\"6\\\"}]}]\",\"Token\":\"7aa81300b2aea77984b772495c8e4e83\"}";

            // === POST リクエストを送信 === # 翻訳済みコメント
            String urlStr = "https://" + regionId + ".axt.aliyun.com/computeNest/marketplace/push_metering_data";
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setDoOutput(true);

            try (OutputStream os = conn.getOutputStream()) {
                byte[] input = paylodString.getBytes("UTF-8");
                os.write(input, 0, input.length);
            }

            // === レスポンスを読み取る === # 翻訳済みコメント
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder response = new StringBuilder();
            String responseLine;
            while ((responseLine = br.readLine()) != null) {
                response.append(responseLine);
            }
            conn.disconnect();
            System.out.println("レスポンス: " + response.toString()); # 翻訳済みコメント
            System.out.println("リクエスト URL: " + urlStr); # 翻訳済みコメント

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // === リージョン ID を動的に取得 (Alibaba Cloud メタデータサービス) === # 翻訳済みコメント
    private static String getRegionId() throws Exception {
        String regionIdUrl = "http://100.100.100.200/latest/meta-data/region-id";
        HttpURLConnection conn = (HttpURLConnection) new URL(regionIdUrl).openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(2000); // 2 秒のタイムアウト # 翻訳済みコメント
        conn.setReadTimeout(2000);

        try (BufferedReader in = new BufferedReader(
            new InputStreamReader(conn.getInputStream()))) {
            return in.readLine().trim();
        }
    }

    //  === リクエストデータを動的に生成 === # 翻訳済みコメント
    private static JSONObject generateDynamicRequest(String regionId, Map<String, String> entities, String serviceKey) throws Exception {
        // タイムスタンプを取得 # 翻訳済みコメント
        long currentTime = System.currentTimeMillis() / 1000;
        long startTime = currentTime;
        long endTime = currentTime + 1;

        // 従量制データを構築 # 翻訳済みコメント
        JSONArray meteringArray = new JSONArray();
        JSONObject meteringItem = new JSONObject();
        meteringItem.put("StartTime", String.valueOf(startTime));
        meteringItem.put("EndTime", String.valueOf(endTime));

        JSONArray entitiesArray = new JSONArray();
        for (Map.Entry<String, String> entry : entities.entrySet()) {
            entitiesArray.put(new JSONObject()
                .put("Key", entry.getKey())
                .put("Value", entry.getValue()));
        }
        meteringItem.put("Entities", entitiesArray);
        meteringArray.put(meteringItem);

        // トークンを計算 # 翻訳済みコメント
        String meteringStr = meteringArray.toString();
        String tokenStr = meteringStr + "&" + serviceKey;
        String token = md5(tokenStr);

        // 完全なリクエストボディを構築 # 翻訳済みコメント
        JSONObject payload = new JSONObject();
        payload.put("Metering", meteringStr);
        payload.put("Token", token);
        return payload;
    }

    // === MD5 暗号化メソッド === # 翻訳済みコメント
    private static String md5(String input) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] messageDigest = md.digest(input.getBytes());
        StringBuilder hexString = new StringBuilder();
        for (byte b : messageDigest) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }
        return hexString.toString();
    }
}

例。

image

説明

プロジェクトに org.json ライブラリ (Maven 依存関係など) が含まれていることを確認してください。 # 翻訳済みコメント

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20230618</version>
</dependency>

エラーコード

エラーコード

エラーメッセージ

説明

OperationDenied

The serviceInstance does not supported push metering data.

サービスインスタンスが従量課金方式を使用していないため、サービスインスタンスの従量制データをプッシュできません。

Only metering entities classified as Custom and associated with a service can be pushed. The entity ${EntityId} is invalid.

指定された課金項目をプッシュできません。課金項目のレポート方法は、「サービスプロバイダーによって報告される」に設定する必要があり、課金項目はサービスに関連付けられている必要があります。

MissingParameter.${parametersName}

The input parameter "${parametersName}" that is mandatory for processing this request is not supplied.

1 つ以上の必須パラメーターが指定されていません。

InvalidParameter.${parametersName}

The provided parameter "${parametersName}" is invalid.

パラメーターに無効な値が指定されています。

EntityNotExist.ServiceInstance

The specified service instance cannot be found.

サービスインスタンスが存在しません。サービスインスタンスは、Compute Nest によって作成された ECS インスタンスではありません。