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


やったこと

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

検証内容

トピックの作成

  1. メニュー→[アプリケーション統合]→[通知]
  2. コンパートメントを選択して、「トピックの作成」ボタンを押下
  3. 適当な名前と説明を入力して、「作成」ボタンを押下
  4. 「サブスクリプション」のリンクを押下。コンパートメントを選択して、「サブスクリプションの作成」ボタンを押下
  5. トピックに、3.で指定した名前のトピックを選択。「電子メール」に通知先のメールアドレスを入力。「作成」ボタンを押下
  6. 指定したメールアドレスに、確認メールが送信される。件名が「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にログインして、通知メソッドを構成

  1. 画面上部の歯車アイコン→[通知]→[スクリプトとSNMPv1トラップ]
  2. 「実行」ボタンを押下

  3. 適当に名前をつけ、作成したスクリプトのフルパスをOSコマンドに入力し、「OK」ボタンを押下

EMCCからインシデント・ルールを作成

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


3. 適当に名前を付けます
4. ターゲットは、「すべてのターゲット」を選択します
5. ルールから「作成」ボタンを押下します


6. 「作成するルールタイプを選択」ウィンドウがポップアップするので、「受信イベントおよびイベントの更新」を選択(デフォルト)し、「続行」ボタンを押下
7. タイプから「ターゲット可用性」を選択して、「次」を押下


8.「追加」を押下


9. 他はデフォルトのまま、拡張通知で上記手順で設定した通知メソッドにチェックします


10. その他はデフォルトのままポチポチして、インシデント・ルールを作成・保存します

動作確認

  1. 監視対象DBを停止させるなどして、可用性イベントを発生させます。
  2. トピックの宛先に設定したメールアドレスに、以下のようなメールが送信されることを確認