Alibaba Cloudの課金額をスプレッドシートで管理したい! 前編 ~GASでAPIを実行~

2025年2月14日掲載

img-techblog-kv-alibabacloud.jpg

こんにちは、ソフトバンクの四役です。

突然ですが、皆さんはクラウドの課金額をどのように管理していますか?

クラウドは従量課金での利用が可能なため、この場合、普段から課金金額を意識して利用しないと、想定以上の費用がかかることがあります。一般的には、クラウドの課金額を直接アカウントにログインしてコンソールで確認することが多いと思いますが、複数のアカウントを管理する際にはこの方法は手間がかかりますスプレッドシートで一覧化できれば、もっと便利です。

そこで今回は、Alibaba Cloudを利用して複数のアカウントの課金額をスプレッドシートで一元管理するGoogle Apps Script(GAS)のサンプルコードを紹介します。

今回紹介するGASの機能としては、各アカウントの月別課金額を一覧化し、設定した予算を超過した際に通知するツールを作成しています。これにより、クラウドの課金額の管理が効率化されます。

紹介するのはあくまでサンプルコードなので、必要に応じてカスタマイズすることで、さらに効率化を図ることも可能です。

まずは前編として、スプレッドシートでクラウドの課金額を管理するために、Alibaba Cloudの課金額を取得するAPIをGASで実行する方法を紹介します。

目次

GASで実行するAPI(QueryAccountBill API)の紹介

今回は、Alibaba Cloudで提供されているQueryAccountBill APIを使用してクラウド課金額を取得します。

QueryAccountBill APIは、指定した月のクラウド課金額を取得できるAPIです。詳細については、公式ドキュメントの「QueryAccountBill」をご参照ください。

また、Alibaba CloudではOpenAPI Explorerのデバッグ機能を利用してWebUIからAPIを呼び出すことが可能です。OpenAPI ExplorerでQueryAccountBill APIを確認すると、以下の画像の通り、必須パラメータはBillingCycleのみとなり、YYYY-MMのフォーマットで指定する必要があります。

img-alibaba-cloud-gas-billing-api-blog-20250214-01

試しに、BillingCycleに2024年12月を指定してAPIを呼び出してみると、以下のようなレスポンスを取得できました(一部抜粋・マスクしています)。

PretaxAmountやInvoiceDiscountなど、課金額や割引率の情報が取得できることが確認できます。

(完全なレスポンス例およびプロパティの詳細は、公式ドキュメントの「QueryAccountBill」を参照ください。)

"Item": [
    {
      "OwnerName": "********@********.co.jp",
      "DeductedByCoupons": 0,
      "ProductName": "",
      "ProductCode": "",
      "BillAccountID": "****************",
      "BizType": "",
      "BillingDate": "",
      "PipCode": "",
      "InvoiceDiscount": 35.732456,
      "SubscriptionType": "",
      "PretaxGrossAmount": 2136.639293,
      "PretaxAmount": 2100.906837,
      "OwnerID": "****************",
      "Currency": "USD",
      "BillAccountName": "********@********.co.jp",
      "CostUnit": "Not Allocated"
    }
  ]

ここで、以下の画像の通りコンソールから確認できるクラウドの月額課金額とAPIで取得できたクラウド課金額を見比べてみます。

(コンソールから確認できるクラウドの月額課金額については、公式ドキュメントの「Overview of Monthly Bill」を参照ください。)

img-alibaba-cloud-gas-billing-api-blog-20250214-02

見比べてみると分かる通り、コンソールから確認できるクラウド課金額は小数点第三位で値が丸められているため、APIで取得した課金額と完全に一致しません。しかし、おおよそ同じ値が取得できることが分かります。

以上、APIから取得できるクラウド課金額の情報を整理すると、コンソール画面で確認できる値とほぼ同じであることが分かります。具体的には、以下の表のような情報を取得できます。

APIから取得できたプロパティ名説明

PretaxGrossAmount

カタログ価格(税率適用前)

DeductedByCoupons

クーポンによる割引

InvoiceDiscount

契約、キャンペーンによる割引

PretaxAmount

割引適用後の価格(税率適用前)

今回は、スプレッドシートで管理するクラウド課金額の値として、割引適用後かつ税抜きの課金額であるPretaxAmountを使用します。

GASでAPIを実行してみる

通常、クライアントからAlibaba Cloudに対してAPIを実行する場合、SDKを利用する方法が推奨されます。SDKがサポートする言語にはJava、Node.js、Pythonなどがありますが、GASはサポート対象外です。そのため、GASからAPIを実行する際は、SDKを利用せずにAPIを実行する必要があります。今回は、公式ドキュメントで紹介されている「Request syntax and signature method V3」を参照してAPIを実行します。

「Request syntax and signature method V3」では、APIを呼び出すための実装の手順について詳細に紹介されていますが、当然ながら、その説明はGASでの実装の手順にフォーカスされたものではありません。

そこで、本記事では具体的なAPIの呼び出し手順は公式ドキュメントに任せつつ、GASからQueryAccountBill APIを呼び出す際の具体的なTipsを紹介します。

なお、この手順を進めるにあたり、必要な権限を付与したAccessKeyとAccessKey Secretは既に払い出されているものとして進めます。必要な権限の情報については、公式ドキュメントの「QueryAccountBill -> Authorization information」を参照してください。

実装したGAS関数(callBillingAPI)の紹介

今回は、スプレッドシートでクラウド課金額を管理するために、QueryAccountBill APIを呼び出すGAS関数(callBillingAPI)を実装したので、紹介します。

以下のGAS関数は、実装したコードの抜粋です。実装手順の詳細は「Request syntax and signature method V3」に記載されており、また各自の実装スタイルもあるかと思いますので、ここではコード全体の記載は割愛させていただきます。

お手元で試される際は、コメントアウトに記載した通り、urlとoptions変数の値を各自で実装いただけますと幸いです。

今後は、QueryAccountBill APIをGASで呼び出す際の特有のTipsにフォーカスして説明します。

なお、後編では今回紹介するcallBillingAPI関数を用い、スプレッドシートでクラウド課金額を管理するサンプルコードについて紹介する予定です。

const callBillingAPI = (billingMonth, keyId, keySecret ) => {    


    /* ↓GASでAPIを呼び出すための指定するurlとoptions変数を実装
   	url: API実行先のURL
   	options: メソッドやheadderなどのパラメータ
   */


    // API実行
    try {
	// urlとoptionsを指定してAPIを実行
        const response = UrlFetchApp.fetch(url, options);
        const responseData = JSON.parse(response.getContentText());
	// レスポンスからスプレッドシートで管理する情報を取得
        let pretaxAmount;
        const accountId = responseData.Data.AccountID;
        const accountName = responseData.Data.AccountName;
        const items = responseData.Data.Items.Item;
     // pretaxAmountの取得状況に応じて、条件分岐
        if (items && items.length > 0 ) {
          pretaxAmount = items.reduce((total, item) => total + item.PretaxAmount, 0);
        }else{
          pretaxAmount = 0;
        }
     // 値を返却   
        return ({
          pretaxAmount : pretaxAmount,
          accountId :  accountId,
          accountName : accountName,
        })
    } catch (e) {
        Logger.log(`Error: ${e.message}`);
    }
};

callBillingAPI関数の設計とTips

callBillingAPI関数は、引数に以下の値を取るように設計しました。billingMonthやAccessKeyを引数に渡すことで、クラウド課金額を取得するアカウントや月を切り替えられるようにしています。

billingMonth

QueryAccountBill APIの必須パラメータ

keyId

発行したAccessKey ID

keySecret

発行したAccessKey secret

GASでは、外部のAPIを呼び出すためにUrlFetchAppクラスのfetch関数が用意されています。この関数を利用してQueryAccountBill APIを呼び出します。第一引数にはAPIの呼び出し先URL、第二引数にはAPIを呼び出す際のパラメータを指定します。これらの引数はコード中でurlとoptionsとして渡しており、Alibaba Cloudの公式ドキュメントに沿って値を計算する必要があります。

urlとoptionsについては後ほど改めて触れようと思います。

また、コード内にはpretaxAmountの取得状況に応じた条件分岐があります。これは、QueryAccountBill APIで未来の月を指定した場合、配列が空で返却されるため、代わりにpretaxAmountに0を代入しています。

最終的に返却する値は、クラウド課金額をスプレッドシートで管理するために使用したい値をAPIレスポンスから抽出して返却しています。

//例:callBillingAPI返却値
{
 accountName=********@********.co.jp,  
 accountId=****************,
 pretaxAmount=2100.906837
}

pretaxAmount

QueryAccountBill APIのレスポンスに含まれるpretaxAmountプロパティの値

accountId

QueryAccountBill APIのレスポンスに含まれるAccountIDプロパティの値

accountName

QueryAccountBill APIのレスポンスに含まれるAccountNameプロパティの値

callBillingAPI関数のurlとoptionsの補足

続いて、UrlFetchAppクラスのfetch関数で指定するurlとoptionsについて補足します。

以下は、実際にQueryAccountBill APIを呼び出す際に使用するサンプル値で、機微情報等をマスクした状態でまとめています。

url

https://business.ap-southeast-1.aliyuncs.com/?BillingCycle=YYYY-MM

options

{

  "headers": {

     "x-acs-action": "QueryAccountBill",

     "content-type": "application/json",

     "x-acs-signature-nonce": "****************",

     "x-acs-date": "2024-12-01T00:00:00Z",

     "x-acs-version": "2017-12-14",

     "Authorization": "ACS3-HMAC-SHA256 Credential=****************",

     "SignedHeaders":  "content-type;host;x-acs-action;x-acs-content-sha256;x-acs-date;x-acs-signature-nonce;x-acs-version",

     "Signature": "****************",

     "x-acs-content-sha256": "****************"

  },

  "method": "post",

  "muteHttpExceptions": true

}

url

QueryAccountBill APIの必須パラメータをクエリパラメータとしてURLに付加します。Alibaba CloudのAPIの各パラメータがクエリパラメータか、Bodyに指定するかについて、個人的に公式ドキュメントでは探しにくかったポイントですが、OpenAPI Portalのメタデータを参照することで確認できます。具体的な確認方法は公式ドキュメントを参照してください。

OpenAPI Portalのメタデータからは、APIの各パラメータ情報、APIスタイル(ROA/RPC)、APIがサポートするメソッド、通信プロトコルなどの情報が確認できます。

options

optionsでは、APIを呼び出すためのheaderやメソッドなどのパラメータ情報を設定します。

headerで指定する各プロパティの詳細については、「Request syntax and signature method V3 -> HTTP request syntax」を参照してください。

また、Authorizationは「Request syntax and signature method V3 -> Request signature」に記載される通り、選択する暗号化方式に基づき署名とハッシュアルゴリズムを選択する必要があります。現時点でサポートされている暗号化方式は「ACS3-HMAC-SHA256」のみです。この暗号化方式に対応する署名とハッシュアルゴリズムは、GASのUtilitiesクラスで提供される関数を使用できます。以下に対応表をまとめました。

 

SHA256

HMAC-SHA256

GAS

(Utilitiesクラス)

Utilities.computeDigest()

Utilities.computeHmacSha256Signature()

上記の関数の返却値はbyte配列で返却されるため、実際にAlibaba CloudへのAPI呼び出しに使用するには、16進数に変換する必要がありますので留意してください。

さいごに

ここまで記事をご覧いただき、ありがとうございます。

本記事では、AlibabaCloudを題材に、クラウド課金額をスプレッドシートで管理するために、QueryAccountBill APIの紹介とGASからSDKを利用せずにAPIを実行する際の実装のTipsについてお伝えしました。

後編の「Alibaba Cloudの課金額をスプレッドシートで管理したい! 後編 ~GASの実装~」では、本記事で紹介した自作のcallBillingAPI関数を利用して、実際にスプレッドシートでクラウド課金額を管理するサンプルコードを紹介します。

関連サービス

Alibaba Cloudは中国国内でのクラウド利用はもちろん、日本-中国間のネットワークの不安定さの解消、中国サイバーセキュリティ法への対策など、中国進出に際する課題を解消できるパブリッククラウドサービスです。

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

関連記事

おすすめの記事

条件に該当するページがございません