Oracle Cloud Account Metering REST APIの使い方 - Compartmentごとの課金情報を取得

　Oracle Cloud のMetering REST APIを使用すると、購入したクレジット、使用量、使用コスト、リソース割り当てなど、アカウントに関するサービス情報を取得できます。
　Metering REST APIの使い方、また今回はAPIを使いコンパートメントごとの課金情報を取得する方法について記載します。

以下リンクより参照できます。
[・Oracle Cloud Account Metering REST API](https://docs.oracle.com/en/cloud/get-started/subscriptions-cloud/meter/op-api-v1-usagecost-accountid-get.html)

## Metering REST APIの基本構造
Metering REST APIを使用し、Oracle Cloud のサービスリソースを操作するには、エンドポイントのURIを利用します。

URIは次の形式です。

```
https://itra.oraclecloud.com/{base_path}/{resource_name}
```
・base_path:リソースのベースURIです。例えば /metering/api/v1 など指定しますが上記リンク参照です。
・resource_name: 呼び出したいリソース名です。例えばアカウントのリソース使用状況は/usage/AccountIdなどと指定します。
ここまでざっとイメージだけ持てばOKです。

## サポートされているメソッド

|HTTPメソッド  |説明  |
|---|---|
|POST  |リクエスト本文のJSON形式のデータを使用してオブジェクトを作成します。  |
|GET  |リクエストURIで指定されたオブジェクトに関する情報を取得します。  |
|PUT  |リクエスト本文のJSON形式のデータを使用して、オブジェクトの属性を更新します。
  |
今回情報取得なのでGETを使用します。

## メディアタイプ
Oracle Cloud Metering APIはapplication/jsonを基本のコンテンツタイプとしてサポートしています。

## Metering REST APIで情報取得する際の認証について
　APIを呼び出すには、Oracle Cloudサービスアカウントのユーザー名とパスワードが必要です。
　OCIダッシュボードの 左メニュー より "identity (Primary)" を選択 
<img width="430" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/5291c594-e1de-42cf-dd8f-b949efe7d7a7.png">

該当ユーザを選択し、「ロール」タブで以下権限が付与されていることを確認してください。
<img width="493" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/28dbac78-1563-796d-8d58-4accc40a1660.png">



### アカウントIDとアイデンティティクラウドサービスIDの確認
API呼び出しに必要な情報を確認します。

  - アカウントID
ダッシュボード画面のURLを確認すると以下のように表示されていると思います。
https://myservices-cacct-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.console.oraclecloud.com/mycloud/cloudportal/dashboard
上記 cacct-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx の部分がアカウントIDです。

  - アイデンティティクラウドサービスID(以下IDCSID)
ユーザ管理画面など見ていると右上にアイデンティティ・コンソールへクリックできると思います。
<img width="364" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/fe11acf3-4c5c-b798-ff9f-a5f1e241959a.png">
遷移した画面のURLを確認すると以下のように表示されていると思います。
https://idcs-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.identity.oraclecloud.com/ui/v1/adminconsole
上記 idcs-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx の部分がIDCSIDです。

### Metering REST API 情報取得の実行確認
まずcurlを使ってクラウドアカウントIDを取得してみます。
今まで確認した、以下の情報をあてはめてきます。
・アカウント名
・アカウントパスワード
・アカウントID
・IDCSID

コマンドは以下の形式でとなります。
※<>は使わないです。

```
curl -X GET -u <アカウント名>:<アカウントパスワード> -H "X-ID-TENANT-NAME：<IDCSID>" "https://itra.oraclecloud.com/itas/<IDCSID>/myservices/api/v1/serviceEntitlements"

改行なしで列挙されるため、とりあえずjqで整えてもよいかと。
curl -X GET -u <アカウント名>:<アカウントパスワード> -H "X-ID-TENANT-NAME：<IDCSID>" "https://itra.oraclecloud.com/itas/<IDCSID>/myservices/api/v1/serviceEntitlements" | jq
```
アカウントIDに関する何らかの情報がJSON形式で取得できていると思います。
このJSON形式のレスポンスボディ情報も[Oracle Cloud のMetering REST API](https://docs.oracle.com/en/cloud/get-started/subscriptions-cloud/meter/op-api-v1-usagecost-accountid-get.html)で参照できます。
Metering REST APIを使い他のツールに情報を渡す際などプログラム内で使用すると思います。

またコマンドにパスワードを記載したくなければ。以下のようにパスワードを記載しないことで、パスワード入力が促されます。

```
curl -X GET -u <アカウント名> -H "X-ID-TENANT-NAME：<IDCSID>" "https://itra.oraclecloud.com/itas/<IDCSID>/myservices/api/v1/serviceEntitlements" | jq
Enter host password for user 'アカウント名':パスワードを入力
```

次にcurlを使用してクラウドアカウントのリソース使用コストを取得してみます。

```
curl -X GET -u <アカウント名>:<アカウントパスワード> -H "X-ID-TENANT-NAME:<IDCSID>" "https://itra.oraclecloud.com/metering/api/v1/usagecost/<アカウント名>?serviceName=Compute&startTime=2016-01-02T15:00:00.000&endTime=2016-01-02T15:00:00.000&usageType=DAILY&timeZone=UTC&dcAggEnabled=Y&computeTypeEnabled=Y" | jq
```
データがないかもしれないですが実行はできたと思います。

## OracleCloudAccount Metering REST APIを使いコンパートメントごとの課金情報を取得

それでは本題に入ります。
まず[こちら(Oracle公式)](https://docs.oracle.com/en/cloud/get-started/subscriptions-cloud/meter/op-api-v1-usagecost-accountid-get.html)より、アカウントのリソース使用コストの取得情報を参照します。
<img width="511" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/c8c07077-0e16-c136-6ba6-910fb81dae82.png">
　取得のためのbase_pathは /metering/api/v1/usagecost/<アカウントID>/tagged 、
resource_nameとなるクエリパラメータは、computeTypeEnabledからusageTypeまであり、
取得に成功する(200レスポンス)と、accountId、canonicalLink,itemsが表示されることがわかります。

　クエリパラメータのリンクを押すとわかりますが、startTimeとendTimeは必須項目です。
tagasパラメータはパイプ(|)でor句を使うことができます。その他パラメータについても参照して下さい。

※クエリパラメータについて
ドットは%3Aに置き換えられ、イコールは%3Dに、スペースは%20に置き換えられます。
例えばORCL.OCIService=Object Storageの場合は、ORCL%3AOCIService%3DObject%20Storageと入力します。

curlコマンドの例は

```
curl -X GET \
     -u <アカウント名>:<アカウントパスワード> \
     -H "X-ID-TENANT-NAME:<IDCSID>"  \
     "https://itra.oraclecloud.com/metering/api/v1/usagecost/<アカウントID>/tagged?startTime=2018-03-12T21%3A00%3A00.000Z&endTime=2018-03-12T23%3A000%300T3%3A000%300=HOURLY＆timeZone=UTC＆tags=ORCL％3AOCIService％3DObject％20Storage＆rollupLevel=RESOURCE"
```

などとなっております。
こちらの情報を参考に特定のコンパートメント名の料金を取得してみます。

```
curl -X GET -u <アカウント名>:<アカウントパスワード> -H "X-ID-TENANT-NAME:<IDCSID>" "https://itra.oraclecloud.com/metering/api/v1/usagecost/<アカウントID>/tagged?startTime=2019-06-30T15%3A00%3A00.000Z&endTime=2019-7-31T15%3A00%3A00.000Z&timeZone=UTC&UsageType=TOTAL&tags%3DORCL%3AOCICompartmentName%3D<コンパートメント名>" | jq
```

すると以下のようなjson形式が出力されます。
costsの部分に課金情報が表示されます。

```json
{

        "accountId": "<アカウントID>",
        "items": [{
      "subscriptionId": "xxxxxxx",
      "subscriptionType": "XXXXXXXXXx",
      "serviceName": "XXX",
      "resourceName": "XXXXXXXXXXXXXXX",
      "currency": "JPY",
      "gsiProductId": "xxxxxx",
      "serviceEntitlementId": "xxxxxxxxx",
      "costs": [
        {
          "computedQuantity": x,
          "computedAmount": xxxx.xxxx,
          "unitPrice": xxxx.xxxx,
          "overagesFlag": "X"
        }
      ],
      "startTimeUtc": "2019-06-30T15:00:00.000",
      "endTimeUtc": "2019-07-31T15:00:00.000"
    }
  ],

  ... SeerviceName毎にjson形式でたくさん表示される ...

        CanonicalLink: metering/api/v1/usagecost/<アカウントID>/tagged?startTime=2019-07-01T15:04:05.000&endTime=2019-07-30T15:04:05.000&timeZone=UTC&usageType=TOTAL&tags=ORCL%3AOCICompartmentName%3D<コンパートメント名>" | jq
}
```
以上になります。
アクセス権限の関係で403エラーなどなる方は、付与された権限やリクエストの内容について見直すといいかもしれません。
こちらの出力情報をプログラムで整えてチャットツールに通知してもいいかもしれないですね。