LoginSignup
4
1

OCIのAlarmをLINE Notifyを利用して通知

Last updated at Posted at 2022-09-21

概要

Oracle Cloud Infrastructure(OCI)の監視アラームは通知機能(Notifications)があり、メールやslackでユーザ通知することができます。LINEには標準機能では通知できませんが、Functionsを利用することにより通知することができました
image.png

LINEトークルームを作成

-LINEでグループトークルームを作成します

LINE Notifyアクセストークン発行

-LINE Notify(https://notify-bot.line.me/ja/) にアクセス
-右上ユーザーからマイページを選択
image.png

-アクセストークンの発行より「トークンを発行する」ボタンを押下
image.png

-トークン名と通知するトークンルームを選択して「発行する」ボタンを押下
image.png

-トークンは再発行できないので確実にコピー
-作成したトークルームにLINE Notifyを友だち追加

OCI コンテナレジストリ設定

-OCIコンソールから開発者サービス>>コンテナレジストリから「レジストリの作成」を押下
リポジトリ名を作成して「リポジトリの作成」を押下
リポジトリ名:alarmtoline/alarmtoline
アクセス:プライベート
今回はalarmtoline/alarmtolineをFunctionsの格納先としました

OCI Functions設定

-以下のハンズオンを参考にFunctionsがVCNとコンテナリポジトリを使用できるようポリシーを作成します。
追加するポリシー:
Allow service FaaS to use virtual-network-family in tenancy
Allow service FaaS to read repos in tenancy

Oracle Functions ハンズオン

-OCIコンソールから開発者サービス>>ファンクション>>アプリケーションから「アプリケーションの作成」を押下
名前やネットワークを選択
image.png

今回はalarmtolineを作成しました

指定するサブネットについては
パブリック・サブネットが指定されている場合、インターネット・ゲートウェイへの通信ができるようRouting tableおよびセキュリティリストが設定されている必要があります。
プライベート・サブネットが指定されている場合、サービス・ゲートウェイとNATゲートウェイへの通信ができるようRouting tableおよびセキュリティリストが設定されている必要があります。

ファンクションの呼出しの問題

ネットワークセキュリティグループも設定できますので必要な通信のみ許可します。
(サブネットのセキュリティリストに設定済の場合は不要)
image.png
-スタートガイドにて「Cloud Shell設定」を選択
-今回はCloud ShellにてFunctionsを作成するため、Cloud Shell設定を選択して"Cloud Shellセッションの開始"と"Cloud Shellでのfn CLIの設定"を順番に実施
image.png

-"ファンクションの作成、デプロイおよび呼出し"については以下の手順にて実施
OCIコンソール右上の開発者ツールからCloud Shellを選択
Cloud Shellが立ち上がったらFunctions名をalarmtolineとしてテンプレートを作成します

user@cloudshell:~ (ap-tokyo-1)$ fn init --runtime python alarmtoline
Creating function at: ./alarmtoline
Function boilerplate generated.
func.yaml created.

ディレクトリalarmtolineに移動します。func.py, func.yamlおよびrequirements.txtが作成されています。
それぞれのファイルを以下のように更新します

■func.py
LINEのアクセストークンは発行されたトークンです
メッセージ部分は通知したいメッセージ文字列です。今回はProdServiceDownとしました
メッセージに加え、JSON形式のアラームメッセージからアラートパラメータ"title"を抽出して通知対象としています。
その他パラメータについては以下を参考にします・
アラーム・メッセージの書式
アラームメッセージの例

func.py
import io
import json
import logging
import requests

def handler(ctx, data: io.BytesIO = None):
    try:
        body = json.loads(data.getvalue())
        title = body["title"]

        headers = {
           'Authorization': 'Bearer LINEのアクセストークン',
        }

        files = {
           'message': (None, 'メッセージ'+ title),
        }

        requests.post('https://notify-api.line.me/api/notify', headers=headers, files=files)

    except Exception as e:
        print('ERROR: bad Event!', flush=True)
        raise

■func.yaml
imageやtab等を定義します

func.yaml
schema_version: 20180708
name: alarmtoline
version: 0.0.0
runtime: python
build_image: fnproject/python:3.9-dev
run_image: fnproject/python:3.9
entrypoint: /python/bin/fdk /function/func.py handler
memory: 128

■requirements.txt
requestに関する依存関係を追加しています

requirements.txt
fdk>=0.1.51
requests>=2.28.1

作成できたらdeployします

fn -v deploy --app alarmtoline

-OCIコンソールから開発者サービス>>ファンクション>>アプリケーションから先程作成したアプリケーションを選択しFunctionsに作成されていることを確認
image.png

-OCIコンソールから開発者サービス>>コンテナレジストリから作成したリポジトリ名を選択してイメージが保管されていることを確認
image.png

通知設定

-OCIコンソールメニューから開発者サービス>>アプリケーション統合>>通知を選択
「トピックの作成」ボタンを押下
-トピックの名前を入力して「作成」ボタンを押下
-作成したトピックを選択
-「サブスクリプションの作成」ボタンを押下
-プロトコルで通知方法を「ファンクション」、アプリケーションはalarmtoline、ファンクションはalarmtolineを選択
-「作成」ボタンを押下
image.png

アラーム定義

-作成済みのアラーム定義のアラーム定義の宛先に作成済の通知設定(トピック)を選択

アラーム結果

アラームを発生させると以下のようにLINEに通知がとどきました
アラームメッセージ本体はProdServiceDownで、対象のアラーム定義はWebService(test)です。
image.png

問題切り分け

通信が失敗する場合、Functionsが起動するサブネットからLINEに通信可能か確認することが有効です。

curl -X POST -H 'Authorization: Bearer 【トークン】' -F 'message=【メッセージ】' https://notify-api.line.me/api/notify

また、ファンクション>>アプリケーションのログ設定を有効にしておけばログを確認することができます。
Functionsが失敗する際の切り分けとして有効です
image.png

エラーメッセージの内容はこちらから確認可能です。
ファンクションの呼出しの問題

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1