本文介紹了服務商如何接入許可證並校正許可證的有效性。
背景資訊
服務商僅需在其服務中加入相應校正許可證的代碼,即可完成許可證鑒權功能。
許可證校正只針對服務執行個體包含的服務(軟體/應用),不校正服務執行個體的資源。
鑒權許可證是否有效
擷取應用部署的ECS地區(regionld)資訊。
擷取到的地區資訊,會在後續步驟中使用,因此需要服務商記錄。訪問如下網址,獲得地區資訊。
curl http://100.100.100.200/latest/meta-data/region-id
返回樣本
cn-wulanchabu
樣本中返回的
cn-wulanchabu
,表示ECS部署地區為烏蘭察布。鑒權許可證是否有效。
調用
CheckOutLicense
,鑒權許可證是否有效。若發現某個服務執行個體到期仍未續約,計算巢將終止此服務執行個體的許可證,使其許可證不可用。這時,調用CheckOutLicense後,返回許可證不可用,服務商可根據返回結果完成後續處理。
若使用者未出現欠費情況,則應用發起的CheckOutLicense將持續有效;若使用者在欠費後重新續約,這時調用CheckOutLicense後,返回許可證狀態將從到期狀態變成成功狀態。
在計算巢內發起API調用時(如調用CheckoutLicense、PushMeteringData等),計算巢會返回數位簽章資訊(即Token欄位),服務商可以使用後文的方法計算數位簽章資訊的值,並將計算得到的數位簽章資訊和計算巢返回的數位簽章資訊進行對比,判斷資料是否被篡改。更多資訊,請參見計算巢校正數位簽章說明。
調用
CheckOutLicense
格式如下:調用
CheckOutLicense
時,可以在調用命令中增加ServiceId
(服務ID)或ServiceInstanceName
(服務執行個體名稱)等非必填參數,用來校正服務ID或服務執行個體名稱的一致性。curl -H "Content-Type: application/json" -XPOST https://<regionId>.axt.aliyun.com/computeNest/license/check_out_license -d '{}'
說明請將regionId替換成之前擷取的地區資訊。
樣本
不加入
ServiceId
或ServiceInstanceName
等非必填參數時,僅校正許可證是否到期。curl -H "Content-Type: application/json" -XPOST https://cn-wulanchabu.axt.aliyun.com/computeNest/license/check_out_license -d '{}'
調用命令中加入
ServiceId
時,計算巢會校正傳入的服務ID是否與當前ECS所處服務執行個體對應服務的ID一致。curl -H "Content-Type: application/json" -XPOST https://cn-wulanchabu.axt.aliyun.com/computeNest/license/check_out_license -d '{"ServiceId": "service-1e2e93c150084exxxxxx"}'
調用命令中加入
ServiceInstanceName
時,在已有ACK情境中,服務執行個體建立時需要填寫clusterId(叢集ID),此叢集可能不是通過計算巢建立,因此無法查詢到服務執行個體資訊。調用API時需要傳入服務執行個體名稱,以便查詢服務執行個體資訊,預設服務執行個體名稱即服務執行個體ID。說明該功能當前僅支援已有ACK情境。
curl -H "Content-Type: application/json" -XPOST https://cn-wulanchabu.axt.aliyun.com/computeNest/license/check_out_license -d '{"ServiceInstanceName": "si-8722386303094axxxxxx"}'
返回結果
許可證未到期
{ "code":200, "requestId":"6af1efb7-c59c-4cee-9094-e1e3bbefb639", "instanceId":"i-0jl957dfri612gxxxxxx", "result":{ "RequestId":"B22723B7-FC31-18F5-A33E-1AF4C82736AA", "ServiceInstanceId":"si-8722386303094axxxxxx", "LicenseMetadata":"{\"TemplateName\":\"Custom_Image_Ecs\",\"SpecificationName\":\"\",\"CustomData\":\"xxxx\"}", "TrialType":"NotTrial", "Token":"58d4574bd0d967bb431cd8936b5e80c4", "ExpireTime":"2023-08-28T06:27:08Z", "ServiceId":"service-1e2e93c150084exxxxxx", "Components":"{\"package_version\":\"yuncode5523100001\",\"SystemDiskSize\":\"40\",\"DataDiskSize\":\"100\"}" } }
操作結果中的各欄位說明如下表所示。
參數名稱
參數說明
RequestId
請求ID。
ServiceInstanceId
服務執行個體ID。
LicenseMetadata
許可證中繼資料。
需要在許可證管理功能中定義該資料。
TrialType
服務試用類型。可能的值:
Trial:支援試用。
NotTrial:不支援試用。
Token
數位簽章。
ExpireTime
服務執行個體的到期時間。
ServiceId
服務ID。
Components
雲市場額外計費項目資訊。
許可證已到期
{ "code":400, "requestId":"3b39185e-44d5-45eb-b178-7fa1bbd57672", "instanceId":"i-0jl892sv08nqob89533y", "errCode":"LicenseExpired", "errMsg":"LicenseExpired : The license of the current service instance si-093591ffbbea4307a624 has expired, expired time Tue Nov 08 16:56:59 CST 2022.\r\nRequestId : 3AF563FD-2FED-1B97-84A1-64F15B581264" }
對於計算巢建立的服務執行個體,CheckOutLicense適用於試用服務執行個體、通過雲市場建立的服務執行個體和具有自訂許可證的服務執行個體的情境。對於其餘的情境調用CheckOutLicense時,會出現報錯,如下樣本所示。
{ "code":400, "requestId":"04733eac-e898-4816-9df2-76678278fb05", "instanceId":"i-0jl1gfh86wvmlx7sg9y2", "result":{ "errCode":"LicenseNotExist", "errMsg":"LicenseNotExist : The current service instance pay type Permanent does not support checkout license.\r\nRequestId : 82C7B420-35B2-197C-8875- C976EB3ACD23"} }
使用CheckOutLicense鑒權應用部署的ECS為非計算巢建立的ECS時,鑒權會出現報錯。
{ "code":400, "requestId":"236313f1-261e-41c5-b89c-659c66923601", "instanceId":"i-0jl9einm5x0tjxxxxxx", "result":{ "errCode":"ServiceInstanceIdNotFound", "errMsg":"ServiceInstanceIdNotFoud : The specified service instance Id cannot be found, the instance Id is [i-0jl9einm5x0tjaf1ax50].\r\nRequestId : FC86793C-1FEB-102D-AAE5-B6EB14EB316E"} }
使用CheckOutLicense鑒權傳入的服務ID與當前ECS所處服務執行個體對應服務的ID不一致時,鑒權會出現報錯。
{ "code":400, "requestId":"20520d16-7fe9-4dcb-832b-16944125bd14", "instanceId":"i-0jl957dfri612gxxxxxx", "result":{ "errCode":"InvalidParameter.ServiceId", "errMsg":"InvalidParameter.ServiceId : The current service instance does not belong to service service-test.\r\nRequestId : D65B2C7D-B561-1030-BBAD-78488AA41364"} }
Java程式碼範例
根據上面的鑒權步驟,完整的Java程式碼範例如下:
import javax.net.ssl.HttpsURLConnection; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class licenseManagerDemo { public static void main(String[] args) throws Exception { //步驟一:擷取應用部署的ECS地區(regionId)資訊 //通過預設Url擷取ECS的regionId URL getRegionIdURL = new URL("http://100.100.100.200/latest/meta-data/region-id"); HttpURLConnection httpURLConnection = (HttpURLConnection) getRegionIdURL.openConnection(); //設定逾時時間 httpURLConnection.setConnectTimeout(10000); httpURLConnection.setReadTimeout(10000); InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream()); int readerRead = inputStreamReader.read(); String regionId = ""; while (readerRead != -1) { regionId = regionId + ((char) readerRead); readerRead = inputStreamReader.read(); } System.out.println("RegionId : " + regionId); //步驟二:鑒權許可證是否有效 //完成鑒權相關操作 : CheckOutLicense licenseManagerDemo licenseManagerDemo = new licenseManagerDemo(); String checkOutLicenseResponse = licenseManagerDemo.checkOutLicense(regionId); String code = licenseManagerDemo.getCode(checkOutLicenseResponse); //迴圈執行 checkOutLicense while (true) { if (!"200".equals(code)) { //處理返回不成功情況 break; } else { //再次調用,樣本時間為60分鐘 Thread.sleep(3600000); checkOutLicenseResponse = licenseManagerDemo.checkOutLicense(regionId); code = licenseManagerDemo.getCode(checkOutLicenseResponse); System.out.println(checkOutLicenseResponse); } } } private String checkOutLicense(String regionId) throws Exception { String urlFormat = "https://%s.axt.aliyun.com/computeNest/license/%s"; String operation = "check_out_license"; URL operationURL = new URL(String.format(urlFormat, regionId, operation)); HttpsURLConnection httpsURLConnection = (HttpsURLConnection) operationURL.openConnection(); httpsURLConnection.setRequestProperty("Content-Type", "application/json"); httpsURLConnection.setDoOutput(true); httpsURLConnection.setConnectTimeout(10000); httpsURLConnection.setReadTimeout(10000); DataOutputStream dataOutputStream = new DataOutputStream(httpsURLConnection.getOutputStream()); //訂用帳戶情境CheckOutLicense參數 String checkOutLicenseParameter = "{\"Channel\":\"ComputeNest\"}"; dataOutputStream.writeBytes(checkOutLicenseParameter); dataOutputStream.flush(); dataOutputStream.close(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpsURLConnection.getInputStream())); String checkOutLicenseResponse = bufferedReader.readLine(); System.out.println(checkOutLicenseResponse); bufferedReader.close(); return checkOutLicenseResponse; } private String getCode(String response) { int codeIndexOf = response.indexOf("code"); return response.substring(codeIndexOf + 6, codeIndexOf + 9); } }