サービスインスタンス内から従量制データをプッシュします。
使用方法
この操作を呼び出して、従量課金 Compute Nest サービスインスタンスの従量制データのみをプッシュできます。プッシュされた課金項目のレポート方法は、「サービスプロバイダーによって報告される」に設定する必要があります。
この操作は、Compute Nest を使用して作成された Elastic Compute Service (ECS) または Container Service for Kubernetes (ACK) インスタンス内で呼び出して、従量制データをプッシュできます。 PushMeteringData 操作の呼び出し方法については、「PushMeteringData」をご参照ください。
リクエストパラメーター
パラメーター | タイプ | 必須 | 説明 | 例 |
Metering | 文字列 | はい | 従量制データ。サンプル値のパラメーター:
説明
|
|
Token | 文字列 | はい | Compute Nest が従量制データがサービスプロバイダーによってプッシュされたかどうかを判断するために使用するトークン。
|
|
レスポンスパラメーター
パラメーター | タイプ | 説明 | 例 |
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 の例
ECS インスタンスが存在するリージョンの ID を取得します。
PushMeteringData 操作を呼び出す前に、サービス用に作成された ECS インスタンスのリージョン ID を取得する必要があります。取得したリージョン ID は、後続の操作で必要になります。そのため、リージョン ID は適切に保管してください。
次の URL にアクセスして、リージョン ID を取得します。
curl http://100.100.100.200/latest/meta-data/region-id出力例:
cn-hangzhou
入力パラメーターを準備します。
"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 暗号化アルゴリズムを使用して暗号化することで取得されます。
リクエストを準備します。例:
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.comのcn-hangzhouは、手順 1 で取得したリージョンです。操作を呼び出すときは、実際のリージョンに置き換えてください。レスポンスを取得します。例:
{ "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)
例。

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

プロジェクトに 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 インスタンスではありません。 |