OCIのコスト状況はコンソールの「コスト分析」からフィルタを付けたりグループ化してチャート表示したりすることができます。より詳細な分析を行いたい場合などはAutonomous AI Databaseを利用すると、明細となるコスト・レポートのデータをデータベース上からビューとして参照することができます。SQLで直接アクセスが可能なので、より高度な分析などに活用することが可能となりそうです。
コスト分析やコスト・レポートの基本的な機能については、以下のドキュメントや資料を参考にしてください。
今回試すADBのビューは以下のドキュメントに記載されています。
いくつかのビューがありますが、コスト・レポートを参照できるのはOCI_COST_DATA_EXTというビューになります。以前はOCI_COST_DATAビューという名前だったのですが、最近はOCI_COST_DATA_EXTビューになっています。
今回は最新ドキュメントに従って新しいビューを使っていきます。
また、使用状況レポートの廃止に伴ってOCI_USAGE_DATA_EXTビューは利用できなくなっていますが、コストレポートに使用状況(Usage)のデータも含まれますのでコストレポートを参照すれば問題はありません。
事前準備
-
OCIコンソール上ではコストレポートが出力されて表示できている状態になっています。
-
まだ設定していない場合は以下のドキュメントを参考にIAMポリシーを追加します。
-
https://docs.oracle.com/ja-jp/iaas/Content/Billing/Concepts/costusagereportsoverview.htm#policy
define tenancy usage-report as ocid1.tenancy.oc1..aaaaaaaaned4fkpkisbwjlr56u7cj63lf3wffbilvqknstgtvzub7vhqkggq endorse group <group> to read objects in tenancy usage-report -
注)このテナンシOCIDはサービス共通のテナンシを指しているので、自テナンシのOCIDに変えたりしないこと。
-
-
コンソールから参照すると、コストレポートはcsv形式でzip化されてアップロードされていることがわかります。ダウンロードして開いてみるとレポートの中身を参照可能です。
-
-
Autonomous AI Databaseの作成
- 今回はトランザクション処理タイプで1 ECPUとしました。
Autonomous AI Databaseビューを使用したコストレポートの追跡の有効化
以下のドキュメントに従って有効化を行っていきます。
-
ドキュメントを参考に、ADBを対象とした動的グループを作成しておきます。ここでは、tk_dgという名前の動的グループを作成しました。
- メニュー「アイデンティティとセキュリティ」 → 「ドメイン」 → デフォルトのドメインを選択 →「動的グループ」タブを開く
- 「動的グループの作成」を行う
- 一致条件を追加する。リソースのOCIDやコンパートメントのOCIDなどを一致ルールとして設定できます。
-
以下のIAMポリシーを追加します。あらかじめユーザーによる参照権限を与えているのと同様に、サービス・テナンシ内に存在するコスト・レポートをADBからも参照できるようにするという意味になります。
Define tenancy usage-report as ocid1.tenancy.oc1..aaaaaaaaned4fkpkisbwjlr56u7cj63lf3wffbilvqknstgtvzub7vhqkggq Endorse dynamic-group <group-name> to read objects in tenancy usage-report -
ADBのデータベース上からリソース・プリンシパルを有効化します。
SQLの発行はどのようなクライアントツールを使ってもよいですが、私はOCIコンソールの「データベース・アクション」のメニューから「SQL」をクリックしてSQL Worksheetを利用しました。-
リソース・プリンシパルを有効にします。
EXEC DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL(); -
Autonomous AI DatabaseインスタンスでADMINユーザーに対してリソース・プリンシパルが有効になっていることを確認します。
SELECT owner, credential_name FROM dba_credentials WHERE credential_name = 'OCI$RESOURCE_PRINCIPAL' AND owner = 'ADMIN'; OWNER CREDENTIAL_NAME ----- --------------------- ADMIN OCI$RESOURCE_PRINCIPAL
ここまでできれば準備は完了です。
OCI_COST_DATA_EXTビューの参照
さっそく実際にビューを問い合わせてみます。
-
試しに以下のSQLを実行してみます。
select * from oci_cost_data_ext where rownum < 10;結果が返ってきました。問題なくビューの参照はできていることが確認できました!あとはビューの内容を必要に応じてSQLで問い合わせて活用していくことができます。
-
もし何らかのエラーでビューの参照に失敗する場合は、動的グループの設定、ポリシーの設定が正しいかを見直してください。動的グループやポリシーを変更した後には、一度データベース上でリソース・プリンシパルの無効化/有効化を行うと設定が反映されます。
-
リソース・プリンシパルの無効化
EXEC DBMS_CLOUD_ADMIN.DISABLE_RESOURCE_PRINCIPAL(); -
リソース・プリンシパルの有効化
EXEC DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL();
-
-
おまけ:どんなビューの定義なのか見てみる。
少し気になったので、ビューの中身を見てみたいと思います。
-
まずは以下のSQLでビューの定義を確認します。
select * from DBA_VIEWS where view_name = 'OCI_COST_DATA_EXT' -
TEXT_VC列には以下のように定義されていました。OCI_COST_DATA_EXTビューはOCI_COST_DATA_EXT$という表からSELECTしているようです。おそらくこれがコスト・レポートのCSVを定義している外部表だと思われます。
SELECT "REFERENCE_NUMBER","TENANT_ID","INTERVAL_USAGE_START","INTERVAL_USAGE_END","SERVICE_NAME","COMPARTMENT_ID","COMPARTMENT_NAME","REGION","AVAILABILITY_DOMAIN","RESOURCE_ID","BILLED_QUANTITY","BILLED_QUANTITY_OVERAGE","SUBSCRIPTION_ID","PRODUCT_SKU","PRODUCT_DESCRIPTION","UNIT_PRICE","UNIT_PRICE_OVERAGE","MY_COST","MY_COST_OVERAGE","CURRENCY_CODE","BILLING_UNIT_READABLE","SKU_UNIT_DESCRIPTION","OVERAGE_FLAG","IS_CORRECTION","BACK_REFERENCE_NUMBER","ATTRIBUTED_COST","ATTRIBUTED_USAGE","CREATED_BY","CREATED_ON","FREE_TIER_RETAINED","TAGS" FROM TABLE(DBMS_CLOUD_OCI_VIEWS.get_cost_data_tbl( CURSOR(SELECT file$name, file$path, row_data FROM OCI_COST_DATA_EXT$) ) ) WITH READ ONLY -
ということで、以下のファンクションを使用して外部表の定義を見てみます。
SELECT DBMS_METADATA.GET_DDL('TABLE','OCI_COST_DATA_EXT$','C##CLOUD$SERVICE') FROM DUAL; -
このような結果が返ってきました。外部表の定義ではこのテナンシのコストレポートのCSVをすべて参照している様子がわかりました。
CREATE TABLE "C##CLOUD$SERVICE"."OCI_COST_DATA_EXT$" SHARING=METADATA ( "ROW_DATA" CLOB COLLATE "USING_NLS_COMP" ) DEFAULT COLLATION "USING_NLS_COMP" ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER ACCESS PARAMETERS ( RECORDS DELIMITED BY newline COMPRESSION GZIP NOBADFILE NOLOGFILE NODISCARDFILE CREDENTIAL 'OCI$RESOURCE_PRINCIPAL' FIELDS(row_data char(32767)) ) LOCATION ( 'https://objectstorage.my$home_region.oraclecloud.com/n/bling/b/my$tenancy/o/reports/cost-csv/*.csv.gz' ) ) REJECT LIMIT UNLIMITED PARALLEL





