Oracle Cloud 課金額をSlackへ毎日通知

# はじめに

Oracle Cloud の課金額をSlackに通知する仕組みを、サーバレス(Oracle Functions) で作成しました。GitHubに公開しているので、ご自由に利用可能です
<https://github.com/Sugi275/oraclecloud-billing-slack> 

クラウドサービスを使っていると、今いくらくらいの費用が掛かっているか気になるものです。
毎日、OracleCloudの課金ページを見に行くのはめんどくさいので、Slackで毎日自動通知してくれる仕組みを使って、Oracle Cloudライフを快適に過ごしましょう。



実行することで、昨日と今月の課金データをSlackへ通知することが出来ます。Oracle Functions を自動的に毎日実行することで、定期的に課金額を教えてくれます。
現在、Resource名がわかりにくいものとなっているため、わかりやすい内訳を確認したい場合は、Oracle Cloud のページを確認するとよいです。
(OracleCloudのMeteringAPIで取得できるデータがわかりにくいものになっているため、このようなSlack通知になっています)

![001.png](https://qiita-image-store.s3.amazonaws.com/0/104247/066a7c97-b739-2e1f-6031-a2487c0ed9eb.png)


# 概要

![006.png](https://qiita-image-store.s3.amazonaws.com/0/104247/935a6ade-37d5-3375-4d7e-f49c03b1c1cb.png)



# 使い方

## Slack

### Incoming Webhook の生成

以下の記事を参考に、Slackの Incoming Webhookを生成します。

<https://api.slack.com/incoming-webhooks> 

<https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008> 



## Oracle Cloud

### Userの作成

Oracle Cloud から課金額の取得するための Metering API があります。これを実行するには、Oracle Cloud の全権限を操作するための、「Cloud Account Administrator」権限が必要になっています。権限が強すぎるため、課金額の参照権限のみでAPIが実行できるようになってほしいです・・・が、現状は致し方ないと思うので妥協します。

なお、作成したユーザは、MFA(多要素認証)を有効にするとAPIから値を取得できないため、MFAを無効にする必要があります。



以下の画像のページに移動して、ユーザを作成します。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/104247/973f420d-d713-b7de-5d87-939d95f94f86.png)





画面に従ってユーザを作成した後、Cloud Account Administrator の Role を付与します。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/104247/b94dcf96-8559-1543-c54e-e96fa6b5855e.png)





### Dashboard Account ID の確認

Oracle Cloud の Dashboard を開いたときの、URLを確認します。以下の画像のページです。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/104247/3a61be83-99b1-22d3-441d-5bb01778d12e.png)



上記のDashboardのURLは、以下の形式となっています。

<https://myservices-cacct-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.console.oraclecloud.com/mycloud/cloudportal/dashboard> 

この中に含まれている、cacct-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx が、Account IDとなります。



### IdentityCloudService IDの確認

Identity Cloud Service のコンソールを開きます。以下のページとなります。

![005.png](https://qiita-image-store.s3.amazonaws.com/0/104247/94f364f0-73f5-ce15-4041-10ee0f0722c3.png)





上記ぺージのURLは、以下の形式となっています。

<https://idcs-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.identity.oraclecloud.com/ui/v1/adminconsole> 

この中に含まれている、idcs-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx が、IDSC の IDとなります。





## Oracle Functions 

### Oracle Functions の準備

以下の記事を参考に、Oracle Functions を有効にします

<https://qiita.com/sugimount/items/018e08f575ecefb1546c> 



Oracle Functions のコンソール画面で、適当なアプリケーション(枠組み)を作成します。今回の例では、`env-app` という名前を使用しています。 
env-app の名前は任意の名前に変更可能ですが、変更した場合は、下記Githubの手順にある makefile の中身を書き換える必要があります。



### GitHub から取得してDeploy

github  から clone します

```
git clone https://github.com/Sugi275/oraclecloud-billing-slack.git
```



makefileを使って、makeをします。これにより、Oracle Functions へ deploy します。

```
make
```





### 環境変数設定

Oracle Functions へ環境変数を設定します。

```
fn config func env-app oraclecloud-billing-slack ORACLECLOUD_USERNAME "username"
fn config func env-app oraclecloud-billing-slack ORACLECLOUD_PASSWORD "password"
fn config func env-app oraclecloud-billing-slack ORACLECLOUD_ACCOUNT_ID "idcs-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
fn config func env-app oraclecloud-billing-slack ORACLECLOUD_IDCS_ID "cacct-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
fn config func env-app oraclecloud-billing-slack SLACK_INCOMING_URL "https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx"
```



それぞれの環境変数は、Slack や Oracle Cloud でメモった値を使用して設定します。

- ORACLECLOUD_USERNAME : 作成したユーザ名
- ORACLECLOUD_PASSWORD : 作成したユーザのパスワード
- ORACLECLOUD_ACCOUNT_ID : Dashboard のURL に含まれているID (idcsから始まる文字列)
- ORACLECLOUD_IDCS_ID : Indentity Cloud Service のURLに含まれているID (cacctから始まる文字列)
- SLACK_INCOMING_URL : Slack Incoming Webhook の URL



### 実行

Oracle Functions を実行することで、Slack へ課金額が通知されます。

```
fn --verbose invoke env-app oraclecloud-billing-slack
```

![001.png](https://qiita-image-store.s3.amazonaws.com/0/104247/066a7c97-b739-2e1f-6031-a2487c0ed9eb.png)


### 定期実行(limited)

Oracle Functions では、現在、プレビュー版となっており、定期実行する機能が制限されています。GAされた場合は、おそらく有効になると定期実行が出来るようになると思います。

# 参考URL
MeteringAPI
https://docs.oracle.com/en/cloud/get-started/subscriptions-cloud/meter/op-api-v1-usagecost-accountid-get.html

JSON in GO
<https://stackoverflow.com/questions/17156371/how-to-get-json-response-in-golang> 

slack message attachments
<https://api.slack.com/docs/message-attachments>