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

Compute Nest:PushMeteringData - メータリングデータのプッシュ

最終更新日:Jun 22, 2026

サービスインスタンス内からメータリングデータをプッシュします。

注意事項

  • この API は、従量課金の Compute Nest サービスインスタンスのメータリングデータのみをプッシュします。課金項目のレポート方法は、「サービスプロバイダーによるレポート」に設定されている必要があります。

  • Compute Nest サービスによって作成された Elastic Compute Service (ECS) インスタンスまたは Container Service for Kubernetes (ACK) インスタンスの場合、インスタンス内から直接この API を呼び出してメータリングデータをプッシュできます。OpenAPI を使用してこの API を呼び出す方法については、「OpenAPI を使用した PushMeteringData の呼び出し」をご参照ください。

リクエストパラメーター

パラメーター

必須

説明

Metering

String

はい

JSON 文字列形式のメータリングデータ。次のパラメーターが含まれます。

  • StartTime: メータリング期間の開始時刻。秒単位の UNIX タイムスタンプで指定します。

  • EndTime: メータリング期間の終了時刻。秒単位の UNIX タイムスタンプで指定します。

  • Entities: メータリングエンティティ。

    • Key: 課金項目の名前。有効な値は次のとおりです。

      • Frequency: サービスの利用回数。

      • Period: 使用時間。単位:秒。

        重要

        このパラメーターの単位は秒ですが、課金単位は時間です。システムは課金時に秒を時間に変換します。たとえば、1 時間あたり 1 USD のレートで 19:00 から 20:00 までの 1,800 秒の使用量をレポートする場合、時間あたりの料金は (1800 / 3600) × 1 = 0.5 USD と計算されます。結果は小数点以下 2 桁に切り捨てられます。

      • Storage: 使用されたストレージ容量。単位:バイト。

        重要

        このパラメーターの単位はバイトですが、課金単位はメガバイト (MB) です。システムは課金時にバイトを MB に変換します。たとえば、1 MB あたり 1 USD のレートで 19:00 から 20:00 までの 524,288 バイトの使用量をレポートする場合、時間あたりの料金は (524288 / 1024 / 1024) × 1 = 0.5 USD と計算されます。結果は小数点以下 2 桁に切り捨てられます。

      • NetworkOut: アウトバウンドトラフィック。単位:バイト。

        重要

        このパラメーターの単位はバイトですが、課金単位はメガバイト (MB) です。システムは課金時にバイトを MB に変換します。たとえば、1 MB あたり 1 USD のレートで 19:00 から 20:00 までの 524,288 バイトの使用量をレポートする場合、時間あたりの料金は (524288 / 1024 / 1024) × 1 = 0.5 USD と計算されます。結果は小数点以下 2 桁に切り捨てられます。

      • NetworkIn: インバウンドトラフィック。単位:バイト。

        重要

        このパラメーターの単位はバイトですが、課金単位はメガバイト (MB) です。システムは課金時にバイトを MB に変換します。たとえば、1 MB あたり 1 USD のレートで 19:00 から 20:00 までの 524,288 バイトの使用量をレポートする場合、時間あたりの料金は (524288 / 1024 / 1024) × 1 = 0.5 USD と計算されます。結果は小数点以下 2 桁に切り捨てられます。

      • Character: 文字数。

      • DailyActiveUser: 日間アクティブユーザー (DAU) 数。

      • PeriodMin: 使用時間。単位:分。

      • VirtualCpu: vCPU コア数。

        • Unit: The number of units.

        • Memory: The memory size in GB.

    • Value: 測定値。0 以上の整数である必要があります。

説明
  • 製品がリアルタイムで課金される場合、任意の時間範囲を指定できますが、EndTimeStartTime より後の時刻である必要があります。

  • 製品が時間単位、日単位、月単位などのサイクルで課金される場合、StartTimeEndTime の間隔は 5 分より長くする必要があります。

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

Token

String

はい

Compute Nest がリクエストが正当なサービスプロバイダーからのものであることを検証するために使用するトークン。

トークンは、Metering パラメーターの値 (JSON 文字列) 、アンパサンド (&) 、およびサービスキーをこの順序で連結した文字列の 32 文字の小文字 MD5 ハッシュです。

  • MeteringMetering パラメーターの値。例: [{"StartTime":"1664451045","EndTime":"1664451198","Entities":[{"Key":"Frequency","Value":"6"}]}]。詳細については、「Metering パラメーターの説明」をご参照ください。

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

    説明

    サービスキーは一意であり、サービスのバージョンが変わっても変更されません。

  • ハッシュ化される文字列: [{"StartTime":"1664451045","EndTime":"1664451198","Entities":[{"Key":"Frequency","Value":"6"}]}]&e98893f5ecc3ae1ctest

  • 生成されるトークン: 7aa81300b2aea77984b772495c8e4e83

レスポンスパラメーター

パラメーター

説明

RequestId

String

Compute Nest によって返されたリクエスト ID。

e6862d3a-9305-4289-8dd3-9c52a680228b

Success

Boolean

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

true

PushMeteringDataRequestId

String

Alibaba Cloud Marketplace によって返されたリクエスト ID。

7lc658a2-tr41---c25es45vc248

Token

String

返されたデジタル署名。このトークンを使用してレスポンスを検証できます。詳細については、「Compute Nest からのデジタル署名の検証」をご参照ください。

50130a063c6acf833280d23169898bd4

この例は、Alibaba Cloud Marketplace の従量課金 Compute Nest サービスによって作成された ECS インスタンスから API を呼び出す方法を示しています。

curl の例

  1. ECS インスタンスのリージョン ID の取得

    この API を呼び出す前に、アプリケーションがデプロイされている ECS インスタンスのリージョン ID を取得します。この ID は後続の手順で必要になります。

    1. 次のコマンドを実行して、インスタンスメタデータサービスからリージョン 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 コマンドを使用するため、Metering パラメーターの JSON 文字列は \ 文字でエスケープする必要があります。コードから API を呼び出す場合、文字列をエスケープする必要はありません。

    • Token: Metering JSON 文字列、アンパサンド (&) 、およびサービスキーを連結した文字列の 32 文字の小文字 MD5 ハッシュを作成してトークンを生成します。この例のトークンは 7aa81300b2aea77984b772495c8e4e83 です。

  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 で取得したリージョンです。API を呼び出す際は、このリージョンを実際のリージョンに置き換えてください。

  4. レスポンスの確認

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

コード例

Python

import requests
import json
import hashlib
import time
import sys
from urllib.request import urlopen
def get_region_id():
    """Alibaba Cloud インスタンスメタデータサービスからリージョン ID を取得します。"""
    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"Failed to get region 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 データを構築します。
    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"Request URL: {url}")
        print(f"Status Code: {response.status_code}")
        print(f"Response: {response.text}")
    except Exception as e:
        print(f"Request Failed: {str(e)}", file=sys.stderr)
if __name__ == "__main__":
    # サンプルパラメーター。キーを課金項目に、値を測定量に置き換えてください。
    entities = {
        "Frequency": "6"
    }
    # サービスキー。
    service_key = "your_service_key_here"
    # 関数を呼び出します。
    push_metering_data(entities, service_key)

実行例:

[root@xxx aZ ~]# vim push.py
[root@xxx aZ ~]# python3 push.py
Request URL: https://cn-hangzhou.axt.aliyun.com/computeNest/marketplace/push_metering_data
Status Code: 200
Response: {"code":200,"requestId":"5979658a-7d11-4c61-xxx","instanceId":"i-bp140hj xxx","result":{"RequestId":"B3588CBD-6C3F-51C7-xxx","PushMeteringDataRequestId":"88D8CADB-2417-5417-504-xxx","Token":"xxx","Success":true}}

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("Detected Region ID: " + regionId);
            // リクエスト本文を構築します。
            Map<String, String> entities = new HashMap<>(); // Entities を構築します。実際のデータに置き換えてください。
            entities.put("Frequency", "6");
            String serviceKey = "your_service_key_here"; // 実際のサービスキーに置き換えてください。
            JSONObject payload = generateDynamicRequest(regionId, entities, serviceKey);
            String paylodString = payload.toString();
            // テスト目的で、動的生成をコメントアウトし、静的なペイロード文字列を使用できます。パラメーターを置き換えることを忘れないでください。
            // 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: " + response.toString());
            System.out.println("Request URL: " + urlStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // Alibaba Cloud インスタンスメタデータサービスからリージョン ID を取得します。
    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;
        // Metering データを構築します。
        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();
    }
}
              

実行例:

[root@xxx ~]# javac MeteringPusher.java
[root@xxx ~]# java MeteringPusher
Detected Region ID: cn-hangzhou
Response: {"code":200,"requestId":"20a00ad2-bb10-4abxxx","instanceId":"i-bp140hjfmsqcuqanv6ea","result":{"RequestId":"3FF6B8A8-F72F-5Bxxx","PushMeteringDataRequestId":"E2E_862fc9bfd36fe02bf7b7380ed437ba7","Success":true}}
Request URL: https://cn-hangzhou.axt.aliyun.com/computeNest/marketplace/push_metering_data
説明

プロジェクトに org.json ライブラリが含まれていることを確認してください。たとえば、Maven を使用する場合は、次の依存関係を追加します。

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

エラーコード

エラーコード

エラーメッセージ

説明

OperationDenied

The service instance does not support pushing metering data.

サービスインスタンスが従量課金インスタンスではないため、メータリングデータのプッシュはサポートされていません。

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

指定された課金項目はデータプッシュをサポートしていません。レポート方法が「サービスプロバイダーによるレポート」に設定されており、サービスに正しく関連付けられていることを確認してください。

MissingParameter.${parametersName}

The required parameter "${parametersName}" is missing.

必須パラメーターが不足しています。

InvalidParameter.${parametersName}

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

指定されたパラメーターが無効です。

EntityNotExist.ServiceInstance

The specified service instance cannot be found.

サービスインスタンスが存在しません。これは、インスタンスが Compute Nest によって作成されなかった場合に発生することがあります。