[Oracle Cloud] EMCCからアラートメールを通知する

#やったこと
OCIのマーケットプレイスからデプロイしたEMCCから、メール通知をさせたかったのだが、
東京リージョンで、メール配信を構成しようと画面をポチポチしたらこんな画面が。。

![notification01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/62ea7a1c-7466-2f67-a89f-3f9b6458cec0.png)

[リージョンごとのサービス提供](https://www.oracle.com/cloud/data-regions.html#apac)状況を見てみた。なるほど、サービス提供されていない。

![notification02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/a186679a-a3bf-384b-ea6e-cd8e9b9a9a79.png)

しょうがないので、oci cliを実行するシェルスクリプトを作成して通知させてみた。

#準備
## EMCCの準備
[[Oracle Cloud] Enterprise Manager の作成と、DBaaS で作成した Data Guard インスタンスのモニタリング](https://qiita.com/sugimount/items/96f2349b9938b3642f90)の記事と、[Setting Up Oracle Enterprise Manager 13.3 on Oracle Cloud Infrastructure](https://docs.oracle.com/en/enterprise-manager/cloud-control/enterprise-manager-cloud-control/13.3.1/emoci/index.html)を参考にデプロイし、データベースもターゲット登録しておきます。

デプロイ前の事前作業としてインスタンス・プリンシパルの設定が必要ですが、設定をミスっていると、Computeインスタンス起動後のセットアップが静かにこけていたりします。インスタンスが起動したらログインして、/var/log/emgc_setup.logをtailしておくとよいです

ちなみに、マーケットプレイスからデプロイしたEMCCはrootユーザにスイッチできないようになってます

```
$ sudo su -
Last login: Thu Oct 17 23:11:45 JST 2019 on pts/0
This account is currently not available.

$ sudo grep ^root /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
→ ログインシェルが、/sbin/nologinになってる。ログインシェルをbashに変えてあげたらログインできました
```

## oci cliのインストール
EMCCから通知するので、EMCCサーバのoracleユーザのホームにoci cliをインストールします。

## インスタンス・プリンシパルの設定
Notificationも実行できるようにポリシーを追加設定します。

※ポリシーでつまづきたくなかったので、検証では大きい権限を追加で与えて検証しました
　Allow dynamic-group OEM_Group to manage all-resources in tenancy

# 検証内容
## トピックの作成
1. メニュー→[アプリケーション統合]→[通知]
2. コンパートメントを選択して、「トピックの作成」ボタンを押下
3. 適当な名前と説明を入力して、「作成」ボタンを押下
4. 「サブスクリプション」のリンクを押下。コンパートメントを選択して、「サブスクリプションの作成」ボタンを押下
5. トピックに、3.で指定した名前のトピックを選択。「電子メール」に通知先のメールアドレスを入力。「作成」ボタンを押下
6. 指定したメールアドレスに、確認メールが送信される。件名が「Oracle Cloud Infrastructure Notifications Service Subscription Confirmation」のメールを受信して、本文に記載のリンクを押下。↓のような画面が表示されればOK。
7. 
![notification03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/41edb448-d292-fbaf-f530-1cf32d688e7a.png)
7. コンソールに戻ると、PENDINGだった画面がACTIVEになってるはず

![notification04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/2e85533a-3af5-c0ce-26d8-132a5ca255d8.png)


## スクリプト
oracleユーザ(EMCC起動ユーザ)から実行される前提で作りました。また、インスタンス・プリンシパルを使って認証しています。

※サンプルです。エラーハンドリングやロギングなどはほぼ考慮してません。また、一切の動く保証もありません。

```
#!/bin/bash

# VARIABLES
. /etc/profile
export PATH=/home/oracle/bin:$PATH

TENANCY_ID="テナントのOCID"
COMPARTMENT_NAME="コンパートメントID"
TOPIC_NAME="トピック名"

# CREATE MESSAGE
# $TARGET_NAME,$TARGET_TYPE,$HOST_NAME,$MESSAGEは、EMからの呼び出し時に設定される環境変数
# see https://docs.oracle.com/cd/F10572_01/EMADM/GUID-B48F6A84-EE89-498D-94E0-5DE1E7A0CFBC.htm#GUID-27E0C4B8-82F0-412A-9F0B-AF551DC19FBC

ALERT_MESSAGE="
$(date)

TARGET_NAME: ${TARGET_NAME}
TARGET_TYPE: ${TARGET_TYPE}
HOST_NAME  : ${HOST_NAME}
_________________________________________________

[MESSAGE]
${MESSAGE}
"

# GET COMPARTMENT OCID
COMPARTMENT_OCID=$(oci --auth instance_principal search resource structured-search --raw-output --query-text 'query all resources' --query 'data.[items[?"resource-type"==`Compartment` && "display-name"==`'${COMPARTMENT_NAME}'`]."identifier"] |[0] |[0]')

if ! echo ${COMPARTMENT_OCID} |grep -q -E -e '^ocid[0-9].compartment' ; then
    echo "failed to get compartment ocid."
    exit 1
fi

# GET TOPIC OCID
TOPIC_OCID=$(oci --auth instance_principal ons topic list --all --raw-output -c ${COMPARTMENT_OCID} --query 'data[?"name"==`'${TOPIC_NAME}'`]."topic-id" |[0]')

if ! echo ${TOPIC_OCID} |grep -q -E -e '^ocid[0-9].onstopic' ; then
    echo "failed to get topic ocid."
    exit 1
fi

# PUBLISH MESSAGE
# $EVENT_TYPE,$SEVERITY,$TARGET_NAMEは、EMからの呼び出し時に設定される環境変数
# see https://docs.oracle.com/cd/F10572_01/EMADM/GUID-B48F6A84-EE89-498D-94E0-5DE1E7A0CFBC.htm#GUID-27E0C4B8-82F0-412A-9F0B-AF551DC19FBC
if ! oci --auth instance_principal ons message publish --topic-id ${TOPIC_OCID} --title "EMALERT - ${EVENT_TYPE} - : ${SEVERITY} : ${TARGET_NAME} " --body "${ALERT_MESSAGE}" ; then
    echo "failed to publish message."
    exit 1
fi

exit 0
```
## EMCCにログインして、通知メソッドを構成
1. 画面上部の歯車アイコン→[通知]→[スクリプトとSNMPv1トラップ]
2. 「実行」ボタンを押下
![emcc01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/756baccc-13f4-0cb4-fde1-59cbcee31465.png)

3. 適当に名前をつけ、作成したスクリプトのフルパスをOSコマンドに入力し、「OK」ボタンを押下
![emcc02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/10708257-3a69-d7a1-991a-74bc2a233ef3.png)

## EMCCからインシデント・ルールを作成
ここでは、可用性イベントのアラートを設定します。
1.  画面上部の歯車アイコン→[インシデント]→[インシデント・ルール]
2.  「ルール・セットの作成」ボタンを押下

![emcc03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/f5708eea-4762-4634-3acb-34771186a644.png)
3. 適当に名前を付けます
4. ターゲットは、「すべてのターゲット」を選択します
5. ルールから「作成」ボタンを押下します

![emcc04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/d86bc162-9876-e495-76c0-25edada21027.png)
6. 「作成するルールタイプを選択」ウィンドウがポップアップするので、「受信イベントおよびイベントの更新」を選択(デフォルト)し、「続行」ボタンを押下
7. タイプから「ターゲット可用性」を選択して、「次」を押下

![emcc05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/cd788685-4c07-dfcf-07e2-532503d84fb7.png)
8.「追加」を押下

![emcc06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/360162ed-822d-3d45-ddbc-3a629cb1f9fe.png)
9. 他はデフォルトのまま、拡張通知で上記手順で設定した通知メソッドにチェックします

![emcc07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/2939e6b3-2c03-86ae-7f36-24fc46a17d3e.png)
10. その他はデフォルトのままポチポチして、インシデント・ルールを作成・保存します

## 動作確認
1. 監視対象DBを停止させるなどして、可用性イベントを発生させます。
2. トピックの宛先に設定したメールアドレスに、以下のようなメールが送信されることを確認
3. 
![mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/befbb0e8-82e4-ffb3-b69f-16509c89617b.png)