サービスインスタンス内からメータリングデータをプッシュします。
注意事項
-
この API は、従量課金の Compute Nest サービスインスタンスのメータリングデータのみをプッシュします。課金項目のレポート方法は、「サービスプロバイダーによるレポート」に設定されている必要があります。
-
Compute Nest サービスによって作成された Elastic Compute Service (ECS) インスタンスまたは Container Service for Kubernetes (ACK) インスタンスの場合、インスタンス内から直接この API を呼び出してメータリングデータをプッシュできます。OpenAPI を使用してこの API を呼び出す方法については、「OpenAPI を使用した PushMeteringData の呼び出し」をご参照ください。
リクエストパラメーター
|
パラメーター |
型 |
必須 |
説明 |
例 |
|
Metering |
String |
はい |
JSON 文字列形式のメータリングデータ。次のパラメーターが含まれます。
説明
|
|
|
Token |
String |
はい |
Compute Nest がリクエストが正当なサービスプロバイダーからのものであることを検証するために使用するトークン。 トークンは、
|
|
レスポンスパラメーター
|
パラメーター |
型 |
説明 |
例 |
||
|
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 の例
-
ECS インスタンスのリージョン ID の取得
この API を呼び出す前に、アプリケーションがデプロイされている ECS インスタンスのリージョン ID を取得します。この ID は後続の手順で必要になります。
-
次のコマンドを実行して、インスタンスメタデータサービスからリージョン 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 コマンドを使用するため、
Meteringパラメーターの JSON 文字列は\文字でエスケープする必要があります。コードから API を呼び出す場合、文字列をエスケープする必要はありません。 -
Token:MeteringJSON 文字列、アンパサンド (&) 、およびサービスキーを連結した文字列の 32 文字の小文字 MD5 ハッシュを作成してトークンを生成します。この例のトークンは7aa81300b2aea77984b772495c8e4e83です。
-
-
リクエストの送信
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 で取得したリージョンです。API を呼び出す際は、このリージョンを実際のリージョンに置き換えてください。 -
レスポンスの確認
{ "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 によって作成されなかった場合に発生することがあります。 |