Oracle Cloud : 通知サービスとoci-cliを使って一時間ごとにDBCSの状態を通知する


通知サービスは1か月あたり1,000通までのメール送信までは無償で使用することができ、AlwaysFree環境でも使用することができます。

今回は１時間ごとにDBCSの状態をメール通知することで、使いすぎを予防するために作成しました。
本当は起動している時だけ１時間ごとに通知したかったのですが、今回の記事は起動の有無によらず１時間ごとに送り続ける実装になっています。

DBCSを使う時だけcrontabを動かし、停止したら止めるという少々アナログな使い方をしていますが、通知がくると無駄遣いしなくなりました。

##手順で引用させて頂いた記事はこちら

■イベント・サービスと通知の使い方
<a href="https://qiita.com/kenwatan/items/b5dcd705d51bb2c2c995">[OCI] イベント・サービスと通知を使用してADBインスタンス起動通知
</a>

■DBCSの状態をCLIで取得する
<a href="https://qiita.com/mikika/items/5a93c669d725a9dfc846">Oracle Cloud にあるデータベースをコマンドライン（CLI）から起動・停止してみた
</a>

##作業手順
1.「通知」の設定
2.トピックの作成
3.サブスクリプションの作成・有効化
4.OCI CLIでDBノードの状態を取得
5.OCI CLIでmessageを送信
6.messeage送信の動作確認
7.crontabの設定
8.crontabの動作確認

###今回使用したサービスと技術
・OCI　通知サービス
・OCI　CLI
・Oracle Database Cloud Service
・crontab

###著者の環境
Mac OS X 10.15.7

##1.「通知」の設定　ー　3.サブスクリプションの作成・有効化
<a href="https://qiita.com/kenwatan/items/b5dcd705d51bb2c2c995">[OCI] イベント・サービスと通知を使用してADBインスタンス起動通知
</a>「「通知」の設定」〜「サブスクリプションの有効化」までを実行


##４.OCI CLIでDBノードの状態を取得

<a href="https://qiita.com/mikika/items/5a93c669d725a9dfc846">Oracle Cloud にあるデータベースをコマンドライン（CLI）から起動・停止してみた
</a>「コマンド実行：状態確認」を参考にして状態を取得します。

なお、mikikaさん作成のmydb.shはとても便利なので、DBCSを使う際にとても便利です。
日々の運用に活用させて頂いています。

##５.OCI CLIでmessageを送信

OCI CLIでメッセージを送信するためのシェルを作成します。
--db-node-id のOCIDと、--topic-idのOCIDに「xxx...」の記載がありますが
こちらはユーザー固有の値となります。

```myons.sh
$ #!/bin/bash
dbcs_node_get=$(oci db node get --db-node-id ocid1.dbnode.oc1.ap-tokyo-1.xxx...)
oci ons message publish --topic-id ocid1.onstopic.oc1.ap-tokyo-1.xxx... --title "DBCS Info" --body "${dbcs_node_get}"
```

crontabで使用できるように、実行権限を変更します。

```terminal
chmod 755 myons.sh
```

### 通知サービス　トピックIDのOCIDが記載されている箇所

「コンソール」ー「メニューバー」ー「アプリケーション統合」ー「通知」
![ONS1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487835/a6eb255f-7a37-d581-5cec-64ab3fdc42dc.jpeg)

「通知」ー「トピック」ー「トピックOCID」
![ONS2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487835/45a23569-a6f2-b91f-a68d-ffe02801c6d9.jpeg)

##6.messeage送信の動作確認
myons.sh を実行し、通知サービスの「サブスクリプション」に登録したメールアドレスに通知が届くことを確認します。

![ONS3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487835/df564f80-8e84-9546-82e2-3911e510ecc0.jpeg)


##7.crontabの設定

6. でメールが届いたので、あとはcrontabを設定するだけと思っていたところ、
著者の環境では普段crontabを使用していないため、色々と設定が必要でした。

###7-1.Macのシステム環境設定を変更
・「システム環境設定」ー「セキュリティとプライバシー」ー「フルディスクアクセス」を開く。
・ポップアップウィンドウ画面左下鍵のマークをクリックし、ユーザ名とパスワードを入力。
・「＋」マークをクリック
・Shift+Cmd+G を入力し、「/usr/sbin/cron」を追加

###7-2.crontabを編集

```terminal
$ crontab -e
```
###7-３.crontabに以下の内容を追加

<font color="Crimson">**PATHを追加しない場合、crontab実行時に「oci: command not found」が発生します。**</font>
5.の作業で、ターミナルから直接シェルを実行した場合は発生しないため要注意です。

```terminal
PATH="/usr/local/bin/oci:/usr/local/bin:/usr/bin:/bin"
*/60 * * * * /Users/ipaccho/ons_instance_test.sh
```

「*/60」で６０分ごとに実行します。

##8.crontabの動作確認
動作確認時はcrontabの設定を「*/60」から「*/1」に変更し、１分ことにメッセージを送ります。
動作確認後「*/60」に戻します。

下記を実行し、内容を確認します。
エラーがない場合は、下記のようなメッセージが表示されます。
メーラーにも、6.と同じ内容のメールが届きます。

```terminal
cat /var/mail/ユーザー名

From ipaccho@iPaccho-no-MacBook-Pro.local  Mon Jan 11 23:55:07 2021
Return-Path: <ipaccho@iPaccho-no-MacBook-Pro.local>
X-Original-To: ipaccho
Delivered-To: ipaccho@iPaccho-no-MacBook-Pro.local
Received: by iPaccho-no-MacBook-Pro.local (Postfix, from userid 501)
	id 711983003AFAA7; Mon, 11 Jan 2021 23:55:07 +0900 (JST)
From: ipaccho@iPaccho-no-MacBook-Pro.local (Cron Daemon)
To: ipaccho@iPaccho-no-MacBook-Pro.local
Subject: Cron <ipaccho@iPaccho-no-MacBook-Pro> /Users/ipaccho/ons_instance_test.sh
X-Cron-Env: <PATH=/usr/local/bin/oci:/usr/local/bin:/usr/bin:/bin>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <LOGNAME=ipaccho>
X-Cron-Env: <USER=ipaccho>
Message-Id: <20210111145507.711983003AFAA7@iPaccho-no-MacBook-Pro.local>
Date: Mon, 11 Jan 2021 23:55:07 +0900 (JST)

{
  "data": {
    "message-id": "8a0e2ed9-7978-0f27-6f70-d514bab143d2",
    "time-stamp": null
  }
}

You have mail in /var/mail/ipaccho
```

##参考
<a href="https://docs.oracle.com/en-us/iaas/Content/Notification/Tasks/publishingmessages.htm">Oracle Cloud Infrastructure Documentation Publishing Messages</a>
<a href="https://docs.oracle.com/ja-jp/iaas/Content/Notification/Concepts/notificationoverview.htm
">Oracle Cloud Infrastructureドキュメント　通知の概要</a>
<a href="https://www.oracle.com/jp/devops/notifications/
">Oracle Cloud Infrastructure Notifications</a>


###再掲
■イベント・サービスと通知の使い方
<a href="https://qiita.com/kenwatan/items/b5dcd705d51bb2c2c995">[OCI] イベント・サービスと通知を使用してADBインスタンス起動通知
</a>

■DBCSの状態をCLIで取得する
<a href="https://qiita.com/mikika/items/5a93c669d725a9dfc846">Oracle Cloud にあるデータベースをコマンドライン（CLI）から起動・停止してみた
</a>