皆さま、こんにちは!y.takanashiです。
今回はサーバレスな環境で、オブジェクトをアップロードした際に、イベント・サービスを経由して自身のSlackのチャンネルに通知させる方法についてご紹介します。
今回の構成について
今回は以下の構成図の流れで検証を行います。
1.オブジェクトとして、コスト分析でスケジュール済レポートを作成
↓
2.オブジェクト・ストレージのバケットにレポートが自動的にアップロードされる
↓
3.バケットにレポートがアップロードされたことをイベント・サービスが検知し、通知サービスに連携
↓
4.通知サービスと連携したSlackチャンネルにレポートが作成されたことを受信
以下が今回検証で利用するサービスの公式ドキュメント一覧です。
またコスト分析の詳細については、先日私が記事を執筆しましたのでこちらも是非ご参考にしてみてください。
Cloudiiブログ - 【Oracle Cloud】コスト管理に関連する各サービスについて
Slackの設定
まず最初に、受信用のSlackのチャンネルを作成します。
チャンネル名(ここでは「oci-billing」)を入力後、「作成」を選択します。
作成したチャンネルの詳細画面の「インテグレーション」から「アプリを追加する」を選択します。
アプリ一覧に「Incoming WebHooks」がありますので「表示する」を選択して、その後は指示に従って操作を行なってください。
作成したチャンネル名(ここでは「oci-billing」)を入力し、「Incoming Webhook インテグレーションの追加」を選択します。
設定完了後、連携したチャンネルにIncoming Webhookアプリケーションが追加された旨が通知されます。
同様に、認証トークン用のURLが発行されますので、そのURLを控えておくようにしましょう。
通知サービスとSlackを連携
続いて、OCIの通知サービスとSlackのチャンネルを連携する作業を行います。
OCIコンソール画面左上のハンバーガーアイコンから「開発者サービス」→アプリケーション統合内の「通知」を選択します。
「トピックの作成」から任意のトピック名(ここでは「OCI-Topic」)を入力し、「作成」を選択します。
作成後、トピックの詳細画面から「サブスクリプションの作成」を選択します。
プロトコルには「Slack」を、URLには控えておいたIncoming Webhook用アプリケーションのURLを指定し、「作成」を選択します。
サブスクリプションの作成後は、状態が「Pending」と表示されます。
作成から少し時間が経過したのち、連携したSlackのチャンネルにも通知が届きます。
この通知の中に、赤枠で囲まれたURLが表示されますので、そのURLを選択してください。
URLを選択すると、以下の画面が表示され、サブスクリプションの連携が完了となります。
完了後はサブスクリプションの状態が「Active」に切り替わります。
バケットについて
トピックの作成後、レポートを格納するバケットを作成します。
OCIコンソール画面左上のハンバーガーアイコンから「ストレージ」→オブジェクト・ストレージとアーカイブ・ストレージ内の「バケット」を選択します。
「バケットの作成」から任意のレポート名(ここでは「Report-Bucket」)を入力し、その他はデフォルトの設定で「作成」を選択します。
イベント・サービスと連携させたい場合は、赤枠の「オブジェクト・イベントの出力」を有効にする必要があります。
「オブジェクト・イベントの出力」にチェックを入れ、「変更の保存」を選択することで、オブジェクト・イベントが有効化され、イベント・サービスと連携させることができます。
スケジュール済レポートについて
今回オブジェクトとして使用するコスト分析の機能には「スケジュール済レポート」というものがあり、コスト分析の結果を自動的にレポートとして出力し、指定したバケットに保存することができます。
バケットにレポートを保存する際には、バケットの読み取り許可を与えるポリシーが必要となります。
そのため、スケジュール済レポートの設定を行う前に、以下のステートメントで構成されるポリシーを作成しておきましょう。
Allow service metering_overlay to manage objects in tenancy where all {target.bucket.name='BUCKET_NAME', any {request.permission='OBJECT_CREATE', request.permission='OBJECT_DELETE', request.permission='OBJECT_READ'}}
※'Bucket_NAME'にはレポートを保存するバケット名に変更してください。
ポリシーの作成後、OCIコンソール画面左上のハンバーガーアイコンから「請求とコスト管理」→コスト管理内の「スケジュール済レポート」を選択します。
「Create a scheduled report(スケジュール済レポートの作成)」から、以下の項目を入力して「Create(作成)」を選択します。
- レポート名
- 説明(オプション)
- 保存済レポート
※スケジュール済レポートを作成する際には、事前に保存済レポートを作成する必要があります。 - 開始日
※翌日以降の日付を設定できます。 - 反復
※毎日、毎月、1回から選択できます。
1回を選択した場合、翌日のみレポートがバケットに保存されます。 - フォーマット
※CSVとPDFから選択できます。 - ネームスペース(選択不可)
- リージョン
- コンパートメント
- バケット
※ポリシーで指定したバケットを選択します。
レポートは設定した開始日以降に「Successful(成功)」の状態となり、指定したバケットにレポートがgzip形式で保存されます。
イベント・サービスの設定
最後にイベント・サービスの設定を行います。
今回は、バケットにオブジェクトがアップロードされた際に、作成したトピックに通知するルールを設定したいと思います。
OCIコンソール画面左上のハンバーガーアイコンから「監視および管理」→イベント・サービス内の「ルール」を選択します。
「ルールの作成」から、以下の項目を入力します。
- 表示名
- 説明
- ルール条件
- 条件:イベント・タイプ
- サービス名:Object Storage
- イベント・タイプ:Object - Create
- アクション
- アクション・タイプ:通知
- 通知コンパートメント:トピックを設定したコンパートメント
- トピック:通知サービスで作成したトピック名
設定後、イベント・ルールが生成されます。
以上でSlackのチャンネルの連携〜イベント・ルールの作成までの一連の設定は完了となります。
レポートのアップロード
一連の設定を完了後、設定した開始日以降、スケジュール済レポートが指定したバケットに「レポート名_日付」という名前でgzip形式で自動的にアップロードされます。
同様に、連携したSlackチャンネルに通知が届き、メッセージがJSON形式で表示されていることが確認できます。
以上で今回の検証についての説明を終了とさせていただきます。
まとめ
このように、OCIの複数のサービスを組み合わせることにより、複雑なシステムでも構築することができます。
また、OCI側の設定は全てコンソール上で操作が完結しますので、簡単に行うことができる点も大きなメリットであると考えています。
しかし、今回はJSON形式でメッセージを出力したため、見づらいと感じる人もいるかもしれません。
そのため、メッセージを別の方式に変換して見やすくする方法について、また別の機会で紹介したいと思います。
以上となります。
この記事を通じて読者の皆様の問題解決の一助となれば幸いです。
最後まで読んで頂き、ありがとうございましたm(_ _)m