皆様、こんにちは。y.kobayashiです。
今回は、Enterprise Manager(以下EM)で検知したアラートを、OS Command通知メソッドを使用してOCI Notificationsへ連携する方法をご紹介します。
目次
全体の構成
BaseDB(PDB)でメトリックのしきい値を超過すると、EMエージェントがこれを検知してOracle Management Service(以下OMS)へ通知します。
OMSはこの通知を受けてインシデント・ルールを評価し、ルールにマッチした場合はOS Command通知メソッドを実行します。
実際には、OMSサーバ上でシェルスクリプトが起動し、スクリプト内のoci-cliがOCI Notificationsのトピックへメッセージをパブリッシュ(publish)します。
最終的に、そのトピックに登録されたサブスクリプション(メールなど)へ通知が配信される、という流れになります。
なお、マルチOMS環境では、どのOMSノードが通知を処理するかは一定ではありません。
そのため、すべてのOMSノードに同じパスでスクリプトを配置しておく必要があります。
前提
EMとBaseDBは構築済みで、ターゲット登録も完了していることを前提とします。
本記事では、EMとBaseDBの構築手順、EMへのターゲット登録手順は扱いません。
事前準備
トピックの作成
トピックの作成方法は以下のドキュメントをご参照ください。
【OCI】通知を受け取るためのお知らせサブスクリプションの作成 #oracle - Qiita
ポリシー設定
EMからインスタンスプリシンパルでOCI Notificationsを利用するためには、EMがインストールされているインスタンスに以下の動的グループとポリシーを設定する必要があります。
| No | 種別 | 設定値 | 説明 |
|---|---|---|---|
| 1 | 動的グループ | instance.id = '<EMがインストールされているインスタンスのOCID>' | OCI Notificationsへの通知を実行するEMのインスタンスを動的グループに関連付ける |
| 2 | ポリシー | allow dynamic-group <動的グループ名> to use ons-topics in compartment <コンパートメント名> | EMが通知先のNotiticationsトピックへメッセージをpublishするために必要な権限 |
oci-cliのインストール
本記事では、OMSサーバのOSにOracle Linux8を使用しているため、以下のコマンドでoci-cliをインストールします。
sudo dnf install python36-oci-cli -y
通知スクリプトの作成
スクリプト本体
以下のスクリプトを任意のディレクトリに配置します。
EMのOS Command通知では、アラートの情報はすべて環境変数として渡されます。
スクリプト内で使用している「TARGET_NAME」や「SEVERITY_CODE」といった変数の詳細は以下のドキュメントをご参照ください。
Event Notification-Specific Environment Variables
#!/bin/bash TOPIC_OCID="<トピックのOCID>" LOG="<任意のパス>" # 件名 TITLE="[${SEVERITY_CODE}] EM Alert: ${SEVERITY}:${TARGET_NAME} - ${MESSAGE}" # 本文 BODY="ターゲット・タイプ = ${TARGET_TYPE} ターゲット名 = ${TARGET_NAME} ホスト名 = ${HOST_NAME} メッセージ = ${MESSAGE}" if [ -n "${ACTION_MSG}" ]; then BODY="${BODY} 対処方法 = ${ACTION_MSG}" fi BODY="${BODY} 重大度 = ${SEVERITY} イベント発生時刻 = ${EVENT_REPORTED_TIME}" if [ -n "${TARGET_LIFECYCLE_STATUS}" ]; then BODY="${BODY} ライフサイクル = ${TARGET_LIFECYCLE_STATUS}" fi if [ -n "${ASSOC_INCIDENT_ID}" ]; then BODY="${BODY} インシデントID = ${ASSOC_INCIDENT_ID} インシデント状況 = ${ASSOC_INCIDENT_STATUS} インシデント所有者 = ${ASSOC_INCIDENT_OWNER}" fi BODY="${BODY} イベント・タイプ = ${EVENT_TYPE} イベント名 = ${EVENT_NAME}" BODY="${BODY} ルール名 = ${RULE_NAME} ルール所有者 = ${RULE_OWNER} コンソールURL = ${MESSAGE_URL}" # ログ出力 echo "[$(date '+%Y-%m-%d %H:%M:%S')] START - Target:${TARGET_NAME} Severity:${SEVERITY_CODE}" >> "${LOG}" 2>&1 oci ons message publish \ --topic-id "${TOPIC_OCID}" \ --title "${TITLE}" \ --body "${BODY}" \ --auth instance_principal \ >> "${LOG}" 2>&1 echo "[$(date '+%Y-%m-%d %H:%M:%S')] END" >> "${LOG}" 2>&1
スクリプト配置後に実行権限を付与します。
chmod +x <任意のパス>
EM側の設定
通知メソッドの登録
EMコンソールから「設定」→「通知」→「スクリプトとSNMPv1トラップ」をクリックします。

画面右上の追加プルダウンで「OSコマンド」を選択した状態で「実行」をクリックします。
OSコマンド入力画面が開くので以下の項目を入力し、「OK」をクリックします。
- 名前:任意(OCI_Notifications_Alert)
- 説明:任意(OCI Notificationsへアラートを送信)
- OSコマンド:任意(/home/oracle/scripts/oci_notify.sh)
インシデント・ルールへの紐づけ
EMコンソールから「設定」→「インシデント」→「インシデント・ルール」をクリックします。
「ルール・セットの作成」をクリックし、以下の項目を入力します。
- 名前:任意(OCI_Notifications_RuleSet)
- 説明:任意(OCI Notificationsへアラートを送信するルールセット)
- 適用先:ターゲット
- 有効:✔
- タイプ:エンタープライズ
- ターゲット:すべてのターゲット
- ルール:受信イベントおよびイベントの更新
- Event Compression:Allow policies to compress events within the same rule (Rule Level Compression)
ルールの項目の「作成」をクリックします。
作成するルールのタイプで「受信イベントおよびイベントの更新」を選択し、「続行」をクリックします。
新規ルールの作成:イベントの選択画面が表示されるので以下の項目を入力し「次へ」をクリックします。
- イベントタイプ:メトリック・アラート
- タイプメトリック:タイプメトリック・アラートのすべてのイベント
アクションの追加画面が表示されるので「追加」をクリックします。
以下の項目を入力し、「続行」をクリックします。
- アクションの条件:常にアクションを実行
- 拡張通知:✔ OCI_Notifications_Alert (OSコマンド)
アクションが追加されていることを確認し、「次」へをクリックします。
名前と説明の指定画面が表示されるので、以下の項目を入力し、「次」へをクリックします。
- 名前:任意(OCI_Notifications_Rule)
- 説明:任意(メトリック・アラートをOCI Notificationsへ送信するルール)
新規ルールの内容を確認し問題がなければ、「続行」をクリックします。
ルール・セットの作成画面で、「保存」をクリックします。
以上で、EM側の設定は完了です。
動作確認
実際にアラートを発報させるため、対象PDBの表領域使用率のしきい値を一時的に下げます。
「メトリックと収集設定」から対象メトリックを編集し、警告を15%に変更しました。
以下のように警告のメールが発報されます。
さいごに
本記事では、EMで検知したアラートをOCI Notificationsへ連携する方法をご紹介しましたが、いかがでしたでしょうか。
この仕組みにより、EMのアラートをOCI Notifications経由でメール通知できるようになり、さらにSlackなどへも拡張可能な形で構成できます。
OCI MonitoringではカバーしきれないDB内部の異常検知をEMが担うことで、DBの運用監視体制をもう一段階強化できるはずです。
本記事が、その一助となれば幸いです。
参考
以下のドキュメントもあわせてご参照ください。

















