#やったこと
OCIのマーケットプレイスからデプロイしたEMCCから、メール通知をさせたかったのだが、
東京リージョンで、メール配信を構成しようと画面をポチポチしたらこんな画面が。。
リージョンごとのサービス提供状況を見てみた。なるほど、サービス提供されていない。
しょうがないので、oci cliを実行するシェルスクリプトを作成して通知させてみた。
#準備
EMCCの準備
[Oracle Cloud] Enterprise Manager の作成と、DBaaS で作成した Data Guard インスタンスのモニタリングの記事と、Setting Up Oracle Enterprise Manager 13.3 on Oracle Cloud Infrastructureを参考にデプロイし、データベースもターゲット登録しておきます。
デプロイ前の事前作業としてインスタンス・プリンシパルの設定が必要ですが、設定をミスっていると、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
検証内容
トピックの作成
- メニュー→[アプリケーション統合]→[通知]
- コンパートメントを選択して、「トピックの作成」ボタンを押下
- 適当な名前と説明を入力して、「作成」ボタンを押下
- 「サブスクリプション」のリンクを押下。コンパートメントを選択して、「サブスクリプションの作成」ボタンを押下
- トピックに、3.で指定した名前のトピックを選択。「電子メール」に通知先のメールアドレスを入力。「作成」ボタンを押下
- 指定したメールアドレスに、確認メールが送信される。件名が「Oracle Cloud Infrastructure Notifications Service Subscription Confirmation」のメールを受信して、本文に記載のリンクを押下。↓のような画面が表示されればOK。
7. コンソールに戻ると、PENDINGだった画面がACTIVEになってるはず
スクリプト
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にログインして、通知メソッドを構成
EMCCからインシデント・ルールを作成
ここでは、可用性イベントのアラートを設定します。
- 画面上部の歯車アイコン→[インシデント]→[インシデント・ルール]
- 「ルール・セットの作成」ボタンを押下
3. 適当に名前を付けます
4. ターゲットは、「すべてのターゲット」を選択します
5. ルールから「作成」ボタンを押下します
6. 「作成するルールタイプを選択」ウィンドウがポップアップするので、「受信イベントおよびイベントの更新」を選択(デフォルト)し、「続行」ボタンを押下
7. タイプから「ターゲット可用性」を選択して、「次」を押下
9. 他はデフォルトのまま、拡張通知で上記手順で設定した通知メソッドにチェックします
10. その他はデフォルトのままポチポチして、インシデント・ルールを作成・保存します
動作確認
- 監視対象DBを停止させるなどして、可用性イベントを発生させます。
- トピックの宛先に設定したメールアドレスに、以下のようなメールが送信されることを確認