皆さんこんにちは。気が付いたら年末になりつつあることに恐怖を覚えているid:k-furusawa--gです。忘年会は先月しませんでしたっけ?
本記事の目次です。
前書き
ところで皆さん、請求書好きですよね。インスタンス立ち上げっぱなしに気づいて慌ててSTOPしにいったあとに見に行くコスト画面なんてスリリングこの上ないです。
そんな皆さんに朗報です。
いままで一部のテナントにのみ開放されていたOCIのコスト分析画面が、この度正式に使えるようになりました。
「今までも使えてましたよ?」という方は、おそらく契約が新しいテナントだと思います。弊社の契約は少し古く、先月までコスト分析画面が開けませんでした。
正式に使えるようになった分析画面と請求書画面
コスト分析画面はまだちょっと機能不足で、MFの時の超過金が出てきません。発生しているコストがそのまま記載されるだけです。
同時に、MF契約でも請求書のダウンロードができるようになりました。PayG契約だとできていたんですが、MFでは開くことができなかった画面です。
相変わらずファイル名が謎の通し番号なのが気に入らないですね。そしてなぜか日付順に並んでいません。ソートくらいしてほしいです。
せっかく請求書がダウンロードできるようになったので、今回は請求書を一緒に読んでいこうと思います。お付き合いください!
請求書を見てみよう
ダウンロードして請求書の中身を見てみましょう。
謎すぎる通し番号と数量の部分は無視していいと思います。
請求書なので請求される金額が淡々と載っているだけなのですが、少し注意が必要なところがあるため軽く説明していこうと思います。
課金体系のおさらい
請求書を読む前に、課金体系のおさらいです。
ご存じのように、OCIの課金体系は2つあります。
-
Monthly Flex(月次フレックス)
契約更新日に決められた金額がチャージされ、チャージ金を超えた利用があった分だけ超過金として請求される形態。チャージ金内に収まる利用をすれば無駄な出費を抑えられる。以下、MF。
-
Pay As You Go(従量課金制)
利用した分だけ請求される、従来の請求方式。AWSやAzureは基本的にこちらになる。MFよりも単価が高い設定となっている。以下、PayG。
ほとんどのテナント契約ではMFを選択されると思いますが、中にはPayGの場合もあると思います。この課金体系の違いは請求書にも影響するので、よく把握しておいてください。
記載される請求の期間について
金額の説明の前に、期間について触れておきます。割と重要です。
請求書に記載される期間は、発行月の一日から月の終わりまでです。
課金体系がMFであろうとPayGであろうと変わりません。MF契約で更新日が10日であろうと20日であろうと、関係なく発行月の一日から月の終わりまでの範囲で請求額を計算し、記載されます。
記載される金額について
請求書の先頭には請求される総額が記載されています。その下には、商品ごとの請求金額が並んでいます。MFとPayGで記載される金額の意味が違います。
MFの場合
MFの場合は、その月の間の超過金の総額です。これが分かりにくいので注意してください。
例えば、契約更新日が15日だったとします。すると、チャージされるのは毎月15日になります。すでに超過金が発生している場合、いったんチャージ金で賄われるので請求書記載対象外になり、次の更新日までに超過金が発生すれば記載されます。
しかし先にも触れたように請求書は発行月の1日から月の終わりまでに発生した請求額を記載するので、チャージ日を跨いで計算します。
図でいうと以下のようになります。
※図ではインスタンスとしていますが、実際には複数のサービスになります。
更新日から次の更新日までの超過金を記載してくれれば、もっとわかりやすい請求書になると思うのですが、今のところそうはなっていないようです。
PayGの場合
PayGの場合はわかりやすいです。その月の一日から月の終わりまでに利用した金額がそのまま記載されます。
これは特に説明不要ですね。
請求明細の読み方
次に請求明細です。
記載される商品について
請求明細には請求が発生したすべての商品が記載されますが、同商品であってもリージョンが違う場合は記載が分かれます。
明確に書いてあれば大丈夫なのですが、明細にリージョンは記載されていないようですので、同じ商品が別の金額で2つ書かれていることがあります。
期間の記載について
請求明細に商品名と集計期間が書かれていますが、この記載は請求金額が集計できた期間が記載されるだけです。
PayGなら特に問題ないのですが、MFの場合は少し面倒です。
例えば、上の図の例でいうと、インスタンスの超過金を集計できたのは今月1日~翌月1日の間です。この場合は請求書に問題なく「01-Sep-2019 - 30-Sep-2019」のように記載されます。
しかし、これがもし、更新日から翌月の1日以降まで超過金が発生せずにいた場合、請求明細には「01-Sep-2019 - 15-Sep-2019」のように更新日までの期間で記載されます。もちろん、それ以前から超過金がない場合はその期間までになります。
APIで同じ情報を取得したい場合
そんな奇特な人がいるのかは不明ですが、以前ご紹介したMeteringAPIを用いて同じコスト情報を取得したい時は以下のようなリクエスト内容を投げます。
GET /metering/api/v1/usagecost/cacct-****?startTime=2019-09-01T00:00:00.000&endTime=2019-10-01T00:00:00.000&usageType=TOTAL&timeZone=UTC&dcAggEnabled=Y&computeTypeEnabled=Y HTTP/1.1 Host: itra.oraclecloud.com Content-Type: application/vnd.com.oracle.oraclecloud.metering.cloudbucks+json X-ID-TENANT-NAME: idcs-***** Authorization: Basic ay**** Accept: */* Host: itra.oraclecloud.com
期間指定が月の最終日ではなく、翌月の01日にしないとズレますのでご注意ください。
レスポンスに含まれているgsiProductId
が商品番号です。これを基点に合算を行えば請求書と同じ金額にできます。ただしdataCenterId
が違う場合は合算してはいけません。
overagesFlag
がY
で返ってくるものが超過金で、MFの場合は請求書記載対象です。PayGはきにしなくていいです。
ちなみにこのAPIでリクエスト時にcomputeTypeEnable
をY
にしておくとcomputeType
がレスポンスで返ります。
これは、課金体系を表しており、各商品ごとにMFかPayGかを返します。PayGの場合はPAYG
と記載され、MFの場合はUsage
もしくはOverrage
と記載されます。
サポートで問い合わせたところ、テナント全体の課金体系を返してくれるAPIは存在せず、商品ごとの課金体系で判断するしかないそうです。API設計と運用がかみ合っていないように思いますね。
念のために言っておくと、MeteringAPIにアカウントのサブスクリプションを取得するAPIがあり、そのレスポンスに payg
というものがあるのですが、これはどんな状態でも N
になる致命的なバグを抱えているそうです(SRに確認済み)。
なのでテナントがPayGなのかMFなのかを知る手掛かりは各サービスのコストに記載される値を見るしかありませんので、自前で計算などを考えている方はご注意ください(実はドキュメントにないAPIで課金体系を取得できたりしますが公式が開示してないので秘密です)。
おまけ:単価について
日本契約のOCIの単価は少し特殊で、公式の単価表に書かれている内容は一部使えません。
分かりやすいもので、Windowsサーバーの単価を見ればわかります。実際に請求されている金額とどうやっても合いません。
なぜなのかというと、日本の場合は契約時に決まった単価で請求が行われるためです。つまり、場合によっては契約時期によってテナントごとに単価が違うわけですね。
そのため、公式の単価表は大体の目安として使うといいでしょう。これを計算に用いてはいけません。
ちなみに、SRで問い合わせると「レートの変動の影響を受けているからだ」と説明されますが、レートは関係ないのでご注意ください。
幸いなことに、MeteringAPIで返ってくる単価はこの契約時の単価がちゃんと反映されています。違っていたらコスト分析画面なんて作れませんよね。
おしまいに
如何だったでしょうか。
AWSの請求書も大概ですが、OCIもMFの兼ね合いから分かりにくいようになっていますね。PayGなら割とシンプルだと思います。
私もあまりコスト気にして作業していなかったりするのですが、これを機に利用しているサービスの月額などを棚卸してみたらいかがでしょうか。