コンテンツにスキップ

Alibaba Cloud API 署名問題を解決して請求分析を実現する


複数のパブリッククラウドリソースを購入することと、プライベートホストを調達することは、コストに対する意識が大きく異なります。プライベートホストを調達する場合は一時的な投資であり、購入後に使用するかどうか、使用が良いか悪いかは、その後の投資に継続的な影響を与えません。一方、パブリッククラウドリソースを購入する場合は、常に次のことを意識する必要があります。初期投資は少ないものの、1日経過するごとに1日分の費用が発生します。そのため、複数のクラウドリソースにおけるコスト支出の明細と請求分析を一目で確認できる方法が切実に必要です。

Alibaba Cloud 費用 API の収集

まず Alibaba Cloud の請求書を例に、Alibaba Cloud の費用請求情報を収集して分析したい場合、取引と請求管理の API を十分に理解する必要があります。Alibaba Cloud API を呼び出す際に最も厄介なのは、API の署名(Signature)メカニズムです。Alibaba Cloud は一般ドキュメントでも専用の説明を提供していますが、署名メカニズムの説明のみのドキュメントでは、経験の浅い開発者にとっては頭の痛い問題です。では、この不完全な説明ドキュメントに基づいて、どのように請求費用収集を行えばよいのでしょうか。

API リクエストの原理

簡単に言うと、Alibaba Cloud API の呼び出しは HTTP リクエスト(ほとんどが GET、ここでも GET リクエストに基づく)であり、その後に多数のパラメータが続きます。例えば、スナップショットを表示するリクエストは次のようになります。

http://ecs.aliyuncs.com/?SignatureVersion=1.0&Format=JSON&Timestamp=2017-08-07T05%3A50%3A57Z&RegionId=cn-hongkong&AccessKeyId=xxxxxxxxx&SignatureMethod=HMAC-SHA1&Version=2017-12-14&Signature=%2FeGgFfxxxxxtZ2w1FLt8%3D&Action=DescribeSnapshots&SignatureNonce=b5046ef2-7b2b-11e7-a3c5-00163e001831&ZoneId=cn-hongkong-b

リクエストに必要な共通パラメータ(API を呼び出す際に常に必要なパラメータ)は次のとおりです。

SignatureVersion # 署名アルゴリズムのバージョン。現在は1.0
Format # レスポンスメッセージのフォーマット。JSON または XML、デフォルトは XML
Timestamp # リクエストのタイムスタンプ(UTC時間)。例: 2021-12-16T12:00:00Z
AccessKeyId # アカウントのアクセスキー ID
SignatureMethod # 署名方式。現在は HMAC-SHA1
Version # バージョン番号。日付形式。例: 2017-12-14。プロダクトごとに異なる
Signature # 最も難しい署名
SignatureNonce # 一意のランダム値。ネットワーク攻撃を防止。リクエストごとに異なるランダム値を使用

Signature 以外のパラメータは比較的簡単に取得でき、固定値のものもあります。詳細はAlibaba Cloud のドキュメントを参照してください。
共通パラメータ以外にも、特定のインターフェース(Action)のリクエストパラメータが必要です。各 Action インターフェースのパラメータは、対応するプロダクトのインターフェースドキュメントを参照してください。例: QuerySettleBill
Signature は共通パラメータとインターフェースパラメータに基づいて生成されるため、比較的複雑です。

標準化されたリクエスト文字列の構築

  • dict の構築
    Python ではパラメータを一対一で表現するのに dict が適しています。リクエストパラメータを記述した dict を作成します。
D = {
    'BillingCycle':str(time.strftime("%Y-%m", time.gmtime())),
    'Action':'QuerySettleBill',
    # 'PageNum':'5',
    'Format':'JSON',
    'Version':'2017-12-14',
    'AccessKeyId':'LTAI5tLumx55Vui4WJwZJneK',
    'SignatureMethod':'HMAC-SHA1',
    'MaxResults' : '300',
    # 'NextToken':"", #?
    'Timestamp':str(time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())),
    'SignatureVersion':'1.0'
    # 'SignatureNonce':str_seed
}
  • 並べ替え
    署名は一意性(順序を含む)を要求するため、パラメータ名で並べ替える必要があります。
  # 署名は一意性(順序を含む)を要求するため、パラメータ名で並べ替える
        sortedD = sorted(D.items(),key=lambda x: x[0])
  • URL エンコード
    標準リクエスト文字列では UTF-8 文字セットを使用する必要があるため、リクエストパラメータ名と値の中の一部の不正な文字を URL エンコードする必要があります。具体的なルールは次のとおりです。

文字 AZ、az、0~9 および文字「-」、「_」、「.」、「~」はエンコードしない。
その他の文字は %XY の形式にエンコードする。XY は文字の ASCII コードの 16 進数表現。例: 英語の二重引用符(")は %22 にエンコードされる。
拡張 UTF-8 文字の場合は、%XY%ZA… の形式にエンコードする。
英語のスペース( )は %20 にエンコードし、プラス記号(+)にはしない。

注意:一般的な URL エンコードライブラリ(Java の java.net.URLEncoder など)は、「application/x-www-form-urlencoded」の MIME タイプのルールに従ってエンコードします。実装時にはこのような方法でエンコードし、エンコード後の文字列内のプラス記号(+)を %20 に、アスタリスク(*)を %2A に、%7E をチルダ(~)に置き換えると、上記のルールで説明したエンコード文字列が得られます。

ここでは Python の urllib ライブラリを使用してエンコードします。

# Python の urllib ライブラリを使用してエンコード
def percentEncode(str):
    res = urllib.parse.quote(str.encode('utf8'), '')
    res = res.replace('+', '%20')
    res = res.replace('*', '%2A')
    res = res.replace('%7E', '~')
    return res
  • 標準化リクエスト文字列の生成
# 標準化リクエスト文字列の生成
canstring = ''
for k,v in sortedD:
    canstring += '&' + percentEncode(k) + '=' + percentEncode(v)

署名対象文字列 StringToSign の構築

ルールは次のとおりです。

StringToSign=
HTTPMethod + “&” +
percentEncode(“/”) + ”&” +
percentEncode(CanonicalizedQueryString)

したがって、この例では次のようになります。

        # 標準化リクエスト文字列の生成
        stringToSign = 'GET&%2F&' + percentEncode(canstring[1:])

HMAC 値の計算

# access_key_secret
access_key_secret = '<access_key_secret>'
# HMAC 値の計算
h = hmac.new((access_key_secret + "&").encode('utf8'), stringToSign.encode('utf8'), sha1)

署名値の計算

# 署名値の計算、signature 署名を生成
signature = base64.encodestring(h.digest()).strip()
これで signature 署名が生成されました。

署名の追加

# 署名の追加
D['Signature'] = signature

したがって、この例では最終的なリクエスト URL は次のようになります。

# 最終的な API 呼び出し
url = 'http://business.aliyuncs.com/?' + urllib.parse.urlencode(D)
http://business.aliyuncs.com/?BillingCycle=2021-12&Action=QuerySettleBill&Format=JSON&Version=2017-12-14&AccessKeyId=LTAI5tLumx55Vui4WJwZJneK&SignatureMethod=HMAC-SHA1&MaxResults=300&Timestamp=2021-12-16T12%3A27%3A58Z&SignatureVersion=1.0&SignatureNonce=0.30196531140307337&NextToken=&Signature=zFb4631sSGONvAeWD3xCIovMeoM%3D

ブラウザで直接アクセスすると、次の結果が得られます。

image.png

完全なサンプル

import sys, datetime
import time
import json
import urllib
import hmac
from hashlib import sha1
import base64
import random
import requests


# リクエストに必要な共通パラメータ(API 呼び出しに常に必要なパラメータ)
D = {
    'BillingCycle':str(time.strftime("%Y-%m", time.gmtime())),
    'Action':'QuerySettleBill',
    # 'PageNum':'5',
    'Format':'JSON',
    'Version':'2017-12-14',
    'AccessKeyId':'<AccessKeyId>',
    'SignatureMethod':'HMAC-SHA1',
    'MaxResults' : '300',
    # 'NextToken':"", #?
    'Timestamp':str(time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())),
    'SignatureVersion':'1.0'
    # 'SignatureNonce':str_seed
}
# 現在時刻
now_time = str(time.strftime("%Y-%m-%d", time.gmtime()))

# ローカル DataKit に接続
datakit = DFF.SRC('datakit')

# Python の urllib ライブラリを使用してエンコード
def percentEncode(str):
        res = urllib.parse.quote(str.encode('utf8'), '')
        res = res.replace('+', '%20')
        res = res.replace('*', '%2A')
        res = res.replace('%7E', '~')
        return res


# 請求書の取得
def getBill():
    # 請求書の現在のレコード位置
    next_token = ""
    # ループで請求書を取得し、DataKit に書き込む
    for i in range(10000):
        random.seed()
        # 一意のランダム値。ネットワークリプレイ攻撃を防止。リクエストごとに異なるランダム値を使用
        D["SignatureNonce"] = str(random.random())
        D["NextToken"] = next_token
        # 署名は一意性(順序を含む)を要求するため、パラメータ名で並べ替える
        sortedD = sorted(D.items(),key=lambda x: x[0])
        # 標準化リクエスト文字列の生成
        canstring = ''
        for k,v in sortedD:
            canstring += '&' + percentEncode(k) + '=' + percentEncode(v)
        # 標準化リクエスト文字列の生成
        stringToSign = 'GET&%2F&' + percentEncode(canstring[1:])
        # access_key_secret
        access_key_secret = '<access_key_secret>'
        # HMAC 値の計算
        h = hmac.new((access_key_secret + "&").encode('utf8'), stringToSign.encode('utf8'), sha1)
        # 署名値の計算、signature 署名を生成
        signature = base64.encodestring(h.digest()).strip()
        # 署名の追加
        D['Signature'] = signature
        # 最終的な API 呼び出し
        url = 'http://business.aliyuncs.com/?' + urllib.parse.urlencode(D)
        # Alibaba Cloud の請求費用をリクエスト
        print(url)

技術路線の選択

アーキテクチャ構想

image.png

Crontab で Python スクリプトを定期実行し、Alibaba Cloud の請求データを取得して MySQL ストレージエンジンに書き込み、Grafana で請求分析データを表示するアーキテクチャを採用します。Grafana Dashboards から対応する Bills テンプレートを取得することで操作を簡略化できます。以下、このアーキテクチャ構想に基づいて技術調査を行います。

技術調査

現在のオープンソース可視化分野で最も人気があり、テンプレートも豊富なのは Grafana です。Kibana も優れた可視化プラットフォームですが、Grafana と比較すると ELK アーキテクチャでの使用に適しており、今回の要件には Kibana はあまり適していません。Grafana はオープンソースの可視化ツールで、さまざまなデータストアで使用でき、Graphite-web の高機能な代替品であり、ダッシュボードの作成や編集を容易に行えます。一意の Graphite ターゲットパーサーを備えており、メトリクスや機能の編集を簡単に行えます。ラインやポイントなどのスマート軸フォーマットを使用して包括的なチャートを作成できます。また、Grafana には組み込みのアラートエンジンが付属しており、ダッシュボードパネルに条件ルールをアタッチして、トリガーされたアラートを選択した通知エンドポイント(例: メール、Slack、PagerDuty、カスタム Webhook など)に送信できます。これは Alibaba Cloud 費用のアラート要件にも適しています。しかし、Grafana はシステムの CPU、メモリ、ディスク、I/O 使用率などのメトリクスの分析と可視化を目的としており、全文データクエリを許可しないため、ユーザーエクスペリエンスが低下します。そこで、オープンソースコミュニティを調べたところ、「Guance」という製品が要件を満たしていることがわかりました。これは Grafana と Kibana のすべての利点を網羅し、さらに多くの独自機能を備えており、Serverless オンラインプログラミングスケジューリング機能も持っています。これにより、Python スクリプトで Alibaba Cloud 請求データを取得する際のスケジューリング管理の課題を解決できます。また、オープンソースの商用製品として、UI の美しさは Grafana をはるかに凌駕しており、無料枠が要件を十分に満たし、問題が発生した場合には公式の製品サポートも受けられます。

技術比較

Grafana Guance
使用の複雑さ インストールと設定が煩雑で、追加のストレージエンジンが必要 1 コマンドでインストール完了、30 分で即利用可能
ドキュメントの充実度 Grafana 公式サイトには充実したドキュメントがあるが、日本語ドキュメントは少なく、英語が苦手なユーザーには課題 非常に充実した日本語ドキュメントと多数の使用事例ガイドコースが用意
コミュニティの活発度 コミュニティは活発、開発・メンテナンスチームは強力、バージョンアップデートは速い 商用製品だがコミュニティは非常に活発、開発・メンテナンスチームは強力、問題解決は迅速、バージョンアップデートは速い
機能の完全性 54 のデータソース、173+ のダッシュボード、ヒートマップ、折れ線グラフ、チャートなど豊富なダッシュボードプラグイン、簡単なアラート対応など 200+ のデータソース、200+ のダッシュボード、複数の OS に対応、標準的な統一 DQL クエリで複数データタイプをサポート、メトリクスデータ、ログデータ、APM データ、インフラストラクチャ、コンテナ、ミドルウェア、ネットワークパフォーマンスを一元管理、異常検出機能は強力で高度な権限機能もあり、複雑なアラートルール設定に対応
発展傾向 市場シェアは上昇傾向、自身も急速に発展・改善中 成熟した商用製品として、可観測性分野のリーダー、市場シェアは上昇傾向、自身も急速に発展・改善中
パフォーマンス リソース消費は低い 一元管理、リソース消費は低い、データはバイナリファイル、転送効率が高く、帯域幅消費は低い
Serverless プログラミング なし Python3.x ベースのサンドボックス環境
費用 無料 無料
サービス コミュニティサポート 専門技術チームによるサポート

要件との適合

上記の比較から、「Guance」を使用することで運用コストを大幅に削減でき、インストール設定管理が非常に簡単であることがわかりました。Grafana が表示プラットフォームとして外部ストレージエンジンをデータソースとして依存する必要があるのに対し、「Guance」はメトリクスデータ、ログデータ、APM データ、インフラストラクチャ、コンテナ、ミドルウェア、ネットワークパフォーマンスなど、複数のデータを一元収集・一元管理できるため、ストレージエンジンのインストールやメンテナンスなどの煩雑な手順が不要で便利です。また、Grafana には充実した日本語ドキュメントがなく、英語が得意でないユーザーには難しい場合があります。一方、「Guance」は充実した日本語ドキュメントと多数の使用事例ガイドビデオを備えており、製品の使い方を簡単に習得でき、要件自体に集中できます。「Guance」は商用製品であり、無料で使用しても専門の技術チームサポートを受けられ、大規模なコミュニティもあり、多くのユーザーと使用経験を交換できます。機能面でも Grafana よりも異常検出機能が強力で、高度な権限機能や複雑なアラートルール設定など、費用分析以外の要件にも対応できます。また、「Guance」はコンポーネントを可視化方式で一元管理でき、リソース消費が低く、データはバイナリファイルのため転送効率が高く、帯域幅消費も低いです。さらに、デザイン面でも「Guance」の製品 UI は目を引くミニマルスタイルを採用しています。したがって、今回の要件には「Guance」を選択して構築するのが最適です。

Guance による費用管理

デプロイメントの説明

Linux サンプルバージョン: CentOS Linux release 7.8.2003 (Core)

1 台のサーバーで全 Alibaba Cloud 請求費用データを収集します。

前提条件

DataKit のインストール

「Guance」でホストを監視する前に、DataKit をインストールする必要があります。DataKit は公式が提供するデータ収集アプリケーションで、数百種類のデータ収集をサポートします。収集ソースを設定することで、ホスト、プロセス、コンテナ、ログ、アプリケーションパフォーマンス、ユーザーアクセスなど、さまざまなデータをリアルタイムに収集できます。

DataKit のインストールを開始する前に、まず「Guance」アカウント を登録する必要があります。登録後、「Guance」ワークスペースにログインすると、DataKit のインストール手順が取得でき、最初の DataKit をデプロイできます。

インストール手順の取得

「Guance」ワークスペースにログインし、「インテグレーション」→「DataKit」の順にクリックし、DataKit のインストール方法を選択します。以下の情報を確認し、「インストール手順」をコピーしてホストで実行します。

  • インストールシステム: Linux

  • システムタイプ: X86 amd64

  • DataWay アドレス: OpenWay

image.png

ホストでのインストール手順の実行

コマンドラインターミナルを開き、サーバーにログインして、コピーした「インストール手順」を実行します。インストールが完了すると Install Success と表示され、DataKit のインストール結果のリンクから DataKit のインストール状態、マニュアル、更新記録を確認できます。

2.install datakit.png

「Guance」の使用開始

DataKit のインストールが正常に完了すると、ホストオブジェクトコレクター hostobject がデフォルトで有効になり、すぐに「Guance」ワークスペースの「インフラストラクチャ」→「ホスト」で、インストールした DataKit のホストを確認できます。ホストの状態、ホスト名、OS、CPU 使用率、MEM 使用率、CPU 単一コア負荷などが表示され、ホストをクリックするとさらに詳細を確認できます。

4.ホスト確認.png

Func 携帯版のインストール

システムおよび環境要件

DataFlux Func を実行するホストは次の条件を満たす必要があります。

  • CPU コア数 >= 2

  • メモリ容量 >= 4GB

  • ディスク容量 >= 20GB

  • ネットワーク帯域幅 >= 10 Mbps

  • OS: Ubuntu 16.04 LTS/CentOS 7.2 以上

  • クリーンなシステム(OS インストール後、ネットワーク設定以外の操作を行っていないこと)

  • 8088 ポートの開放(本システムはデフォルトで 8088 ポートを使用。ファイアウォール、セキュリティグループなどで 8088 のインバウンドアクセスを許可すること)

  • 外部 MySQL を使用する場合、MySQL のバージョンは 5.7 以上

  • 外部 Redis を使用する場合、Redis のバージョンは 4.0 以上

注意:DataFlux Func は MacOS、Windows をサポートしていません。仮想マシンやクラウドホストにインストールしてください。

注意:DataFlux Func はクラスター版 Redis をサポートしていません。高可用性が必要な場合はマスタースレーブ版を選択してください。

注意:Alibaba Cloud ECS に DataFlux Func をインストールし、Alibaba Cloud セキュリティプラグインが有効になっている場合、プラグイン自体がリソースを消費するため、システム設定を適宜上げてください。

携帯版ダウンロードコマンド
/bin/bash -c "$(curl -fsSL https://t.guance.com/func-portable-download)"

注意:本書のすべてのシェルコマンドは、root ユーザーで直接実行可能。非 root ユーザーの場合は sudo を追加して実行してください。

注意:本書では最も一般的な操作手順のみを提供します。詳細なインストールデプロイメントについては「メンテナンスマニュアル」を参照してください。

自動インストールスクリプトの実行

ダウンロードした dataflux-func-portable ディレクトリで、
次のコマンドを実行すると、自動的に設定が行われ、DataFlux Func 全体が起動します。

注意:インストール前にシステム要件とサーバー設定を確認してください。

注意:DataFlux Func は Mac をサポートしていません。Linux システムにコピーしてからインストールを実行してください。

sudo /bin/bash run-portable.sh

自動インストールスクリプトを使用すると、数分で高速インストールと実行が可能です。自動設定の内容は以下のとおりです。

  • MySQL、Redis、DataFlux Func(Server、Worker、Beat を含む)の実行

  • すべてのデータを自動的に /usr/local/dataflux-func/ ディレクトリに保存(MySQL データ、Redis データ、DataFlux Func 設定、ログファイルなど)

  • MySQL root ユーザーパスワードとシステム Secret をランダム生成し、DataFlux Func 設定ファイルに保存

  • Redis はパスワードなし

  • MySQL、Redis は外部アクセスを提供しない

実行後、ブラウザで http://{サーバーIPアドレス/ドメイン}:8088 にアクセスして初期化操作を行います。

注意:実行環境のパフォーマンスが低い場合は、docker ps コマンドですべてのコンポーネントが正常に起動したことを確認してからアクセスしてください(以下のリスト参照)

  1. dataflux-func_mysql

  2. dataflux-func_redis

  3. dataflux-func_server

  4. dataflux-func_worker-0

  5. dataflux-func_worker-1-6

  6. dataflux-func_worker-7

  7. dataflux-func_worker-8-9

  8. dataflux-func_beat

RAM アクセス制御の取得

  1. RAM コンソールにログイン https://ram.console.aliyun.com/users

  2. 新規ユーザー作成: 人員管理 - ユーザー - ユーザーを作成 image.png

  3. AccessKeyIDAccessKey Secret の CSV ファイルを保存またはダウンロード(設定ファイルで使用)

  4. ユーザー権限付与(請求書権限)

設定の実装

DataFlux Func へのログイン

Func にログイン。アドレスは http://ip:8088(デフォルト admin/admin)

スクリプトセットの作成

タイトル/説明情報を入力

image.png

スクリプトの編集

スクリプトを作成し、請求データを DataKit に書き込んでレポート作成の準備をします。

完全なスクリプトは以下のとおりです。

import sys, datetime
import time
import json
import urllib
import hmac
from hashlib import sha1
import base64
import random
import requests


# リクエストに必要な共通パラメータ(API 呼び出しに常に必要なパラメータ)
D = {
    'BillingCycle':str(time.strftime("%Y-%m", time.gmtime())),
    'Action':'QuerySettleBill',
    # 'PageNum':'5',
    'Format':'JSON',
    'Version':'2017-12-14',
    'AccessKeyId':'<AccessKeyId>',
    'SignatureMethod':'HMAC-SHA1',
    'MaxResults' : '300',
    # 'NextToken':"", #?
    'Timestamp':str(time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())),
    'SignatureVersion':'1.0'
    # 'SignatureNonce':str_seed
}
# 現在時刻
now_time = str(time.strftime("%Y-%m-%d", time.gmtime()))

# ローカル DataKit に接続
datakit = DFF.SRC('datakit')

# Python の urllib ライブラリを使用してエンコード
def percentEncode(str):
        res = urllib.parse.quote(str.encode('utf8'), '')
        res = res.replace('+', '%20')
        res = res.replace('*', '%2A')
        res = res.replace('%7E', '~')
        return res


# 請求書の取得
@DFF.API('getBill')
def getBill():
    # 請求書の現在のレコード位置
    next_token = ""
    # ループで請求書を取得し、DataKit に書き込む
    for i in range(10000):
        random.seed()
        # 一意のランダム値。ネットワークリプレイ攻撃を防止。リクエストごとに異なるランダム値を使用
        D["SignatureNonce"] = str(random.random())
        D["NextToken"] = next_token
        # 署名は一意性(順序を含む)を要求するため、パラメータ名で並べ替える
        sortedD = sorted(D.items(),key=lambda x: x[0])
        canstring = ''
        for k,v in sortedD:
            canstring += '&' + percentEncode(k) + '=' + percentEncode(v)
        # 標準化リクエスト文字列の生成
        stringToSign = 'GET&%2F&' + percentEncode(canstring[1:])
        # access_key_secret
        access_key_secret = '<access_key_secret>'
        # HMAC 値の計算
        h = hmac.new((access_key_secret + "&").encode('utf8'), stringToSign.encode('utf8'), sha1)
        # 署名値の計算、signature 署名を生成
        signature = base64.encodestring(h.digest()).strip()
        # 署名の追加
        D['Signature'] = signature
        # 最終的な API 呼び出し
        url = 'http://business.aliyuncs.com/?' + urllib.parse.urlencode(D)
        # Alibaba Cloud の請求費用をリクエスト
        response = requests.get(url)
        billing_cycle = response.json()["Data"]["BillingCycle"]
        account_id = response.json()["Data"]["AccountID"]
        next_token = response.json()["Data"]["NextToken"]
        if next_token is not None:
            bill = response.json()["Data"]["Items"]["Item"]
            print(bill)
            # 当日の請求書を Guance に書き込む
            for i in bill:
                print(i["UsageEndTime"])
                time = i["UsageEndTime"].split(" ")[0]
                print(time,now_time)
                if time == now_time:
                    measurement = "aliyunSettleBill"
                    tags = {
                        "BillingCycle":billing_cycle,
                        "AccountID":account_id
                    }
                    fields = {
                        "ProductName":i["ProductName"],
                        "SubOrderId":i["SubOrderId"],
                        "BillAccountID":i["BillAccountID"],
                        "DeductedByCashCoupons":i["DeductedByCashCoupons"],
                        "PaymentTime":i["PaymentTime"],
                        "PaymentAmount":i["PaymentAmount"],
                        "DeductedByPrepaidCard":i["DeductedByPrepaidCard"],
                        "InvoiceDiscount":i["InvoiceDiscount"],
                        "UsageEndTime":i["UsageEndTime"],
                        "Item":i["Item"],
                        "SubscriptionType":i["SubscriptionType"],
                        "PretaxGrossAmount":i["PretaxGrossAmount"],
                        "Currency":i["Currency"],
                        "CommodityCode":i["CommodityCode"],
                        "UsageStartTime":i["UsageStartTime"],
                        "AdjustAmount":i["AdjustAmount"],
                        "Status":i["Status"],
                        "DeductedByCoupons":i["DeductedByCoupons"],
                        "RoundDownDiscount":i["RoundDownDiscount"],
                        "ProductDetail":i["ProductDetail"],
                        "ProductCode":i["ProductCode"],
                        "ProductType":i["ProductType"],
                        "OutstandingAmount":i["OutstandingAmount"],
                        "BizType":i["BizType"], 
                        "PipCode":i["PipCode"],
                        "PretaxAmount":i["PretaxAmount"],
                        "OwnerID":i["OwnerID"],
                        "BillAccountName":i["BillAccountName"],
                        "RecordID":i["RecordID"],
                        "CashAmount":i["CashAmount"],
                    }
                    try:
                        status_code, result = datakit.write_logging(measurement=measurement, tags=tags, fields=fields)
                        print(status_code,result)
                    except:
                        print("挿入に失敗しました!")
                else:
                    break
            else:
                continue
            break
        else:
            break

スクリプトの公開

保存 してから 公開 します。

image.png

定期タスクの作成

自動トリガータスクを追加します。管理 - 自動トリガー設定 - タスクを作成。請求書は日次で発行されるため、収集頻度は 1 日 1 回で問題ありません。

image.png

アップロードデータの確認

ログプレビュー

image.png

エクスプローラーの作成

エクスプローラーをインポート

image.png

フィードバック

このページは役に立ちましたか?