Winter'20の新機能リアルタイムイベントモニタリングを試してみよう！

# はじめに
　こんにちは、初めて「Salesforce Platform Advent Calendar」に投稿させていただきます川口です。
　最近の私の担当は、構築したアプリケーションの導入、運用のサポート対応しております。
　プロジェクトの工程としては終盤で、私達が構築したアプリケーションが本番データ移行を行い、リリース、運用引き継ぎを行うフェーズです。最後に失敗できない大切な期間に入ってきました。
　あと一息ですねー。早く苦労を共にした人とビールが飲みたい！

　今、本番リリースを間近に控えており、最も気になっていたのがログです。
　お客様にとって稼働直後にトラブルが発生しないか、その予兆を知るすべがないか、サーバリソースの稼働状況を知りたいという要望があり、Salesforceで出力されるログについて調べておりました。
　最近リリースされたWinter’20では、ログ関連の機能が拡充がされており、その中で興味を持ったのが新機能としてGAになった『リアルタイムイベントモニタリング』です。
　Salesforceのイベントとはユーザのクリックやレコードの状態の変更のことで、リアルタイムにアラートを検知しトレンドを分析できることや、セキュリティポリシーで特定のユーザ（運用担当者）にアラートを通知、ユーザの操作をブロックすることも可能です。

　今年のDreamforceの『Developer Keynote』の後半に紹介され、『Salesforce Developer Blog』の『DF19 Developer Keynote Highlights』でも取り上げられている機能です。
いいタイミングでリリースされましたね。

　このブログでは、イベントログの紹介から、実際にイベントログを動かしてみて基本的な流れを確認していきます。

#### <参考資料>
- [DF19 Developer Keynote](https://www.youtube.com/watch?v=id7Oa65Rs1k)
- [Developer Blog::DF19 Developer Keynote Highlights](https://developer.salesforce.com/blogs/2019/11/df19-developer-keynote-highlights.html)
- [リリースノート::イベントデータのほぼリアルタイムのストリーミングおよび保存 (正式リリース)](https://releasenotes.docs.salesforce.com/ja-jp/winter20/release-notes/rn_security_em_rtem_ga.htm)
- [Trailhead::プラットフォーム、生産性、インテグレーションの新機能の確認学習の目的](https://trailhead.salesforce.com/ja/content/learn/modules/winter-20-release-highlights/whats-new-platform-productivity-integration-winter-20)

# イベントモニタリングとは？
　今回のリアルタイムイベントモニタリングも含めてイベントモニタリングについて、もう一度目的を確認します。
>　イベントモニタリングとは、データの安全性を確保するために Salesforce に搭載されている多数のツールの 1 つで、このツールを使用すると、組織のユーザアクションをごく細部まで確認できます。
　こうしたアクションをSalesforceではイベントといっています。システム管理者は、個別のイベントに関する情報を参照したり、イベントのトレンドを追跡したりして、異常な行動をすばやく特定し、会社のデータを保護することができます。

> (引用：Trailheadのイベントモニタリングの使用開始、イベントモニタリングとは？から）

### ユースケース
　Trailheadで紹介されていたユースケースは以下の通りです。

>- **データ損失の監視** — ある営業担当者が退職して、主要な競合他社に転職したとします。その後、この他社に取引を次々と奪われていることに気付きます。そこで、退職した従業員がリードを記載したレポートをダウンロードして、他社に渡したのではないかと疑います。イベントモニタリングを使用していれば、会社の売上を失う前にこの不正行為を見抜くことができたものと思われます。
- **導入の促進** — イベントモニタリングはユーザの不正行為を捕らえるだけではありません。組織内のパフォーマンスが芳しくない部署に注意を向けることもできます。たとえば、取引先と取引先責任者を組み合わせて、エンドユーザがカスタム項目を追加できる新しい Visualforce ページを組織にロールアウトしたとします。総計値がなければ、ユーザがこのページをどのくらい、どのように使用しているかをはっきりと知ることができません。イベントモニタリングがあれば、組織のどの部署に導入を強化する必要があるかを把握でき、再開発が必要な領域を見極めることもできます。
- **パフォーマンスの最適化** — 時として、組織でページのパフォーマンスが低下した原因が判断つかないことがあります。たとえば、サンフランシスコとロンドンに支社があるとします。ロンドンのユーザから、レポートの動作が遅く、タイムアウトすることもあると告げられます。イベントモニタリングを使用すれば、原因がロンドンのネットワークの問題に関係しているのか、アプリケーションの設定方法に関係しているのかを判断できます。

> (引用：Trailheadのイベントモニタリングの使用開始、イベントモニタリングとは？から）

#### <参考資料>
[イベントモニタリングの使用開始](https://trailhead.salesforce.com/ja/content/learn/modules/event_monitoring/event_monitoring_intro)

# 機能説明
　リアルタイムイベントモニタリングでは、イベントモニタリングとトランザクションセキュリティポリシーの２つの機能があります。

- **イベントモニタリング** - ユーザのクリックやのレコードの状態変更などの事象をリアルタイムに配信し登録しているシステムに通知します。また、大量データを扱うSalesforceのオブジェクトに保存します。
　配信の保存期間は３日間、オブジェクトの保存期間は、６ヶ月間です。
- **トランザクションセキュリティポリシー** - ユーザ操作を監視し、疑わしい動作が発生したときに特定のユーザにアラート通知や操作をブロックできます。
 Apexによってポリシーを強化することもできます。

### 取得可能イベント
>| イベントオブジェクト | 使用事例 |
|:--|:--|
| ApiEvent | 会計年度中に特定のオブジェクトについて発生したすべての API アクティビティに関するデータを保存する。 |
| LightningUriEvent | Lightning Experience でいつエンティティが作成、アクセス、更新、削除されたかに関するデータを保存する。 |
| ListViewEvent | いつユーザが取引先責任者、取引先、カスタムオブジェクトなどのレコードのリストを操作したかに関するデータを保存する。 |
| LoginAsEvent | いつ Salesforce システム管理者が別のユーザとしてログインしたかに関するデータを保存する。 |
| LoginEvent | 不明な IP アドレスまたは場所からログインを試みたユーザの数とログインできないようにブロックされたユーザに関するデータを保存する。 |
| LogoutEvent | 正常にログアウトしたユーザに関するデータを保存する。 |
| ReportEvent | 機密レポートが何回誰によってダウンロードまたは表示されたかに関するデータを保存する。 |
| UriEvent | Salesforce Classic でいつエンティティが作成、アクセス、更新、削除されたかに関するデータを保存する。 |
（引用：Salesforce Help - リアルタイムイベントモニタリングのデータ保存から）

#### <参考資料>
[Help::リアルタイムイベントモニタリングの定義]
(https://help.salesforce.com/articleView?id=real_time_event_monitoring_definitions.htm&type=5)

# 利用条件

### 使用可能なエディション 

- Enterprise Edition、Performance Edition、Unlimited Edition、および Developer Edition
- Salesforce Shield または Salesforce Event Monitoring アドオンサブスクリプションが必要

### 必要なユーザ権限
- イベントの参照 :「データ漏洩検出イベントを表示」
- トランザクションセキュリティポリシーの作成、編集、管理 : 「アプリケーションのカスタマイズ」

#### <参考資料>
[リアルタイムイベントモニタリングへのアクセス権の有効化](https://help.salesforce.com/articleView?id=real_time_event_monitoring_enable.htm&type=5)

# イベントモニタリング
　今回は、イベントモニタリングの基本的な流れのみ説明します。非同期ＳＯＱＬや、ストリームのの受信については、紹介のみとさせてください。別に、テーマを絞って書きたいと思います。
　それでは実際に、試してみましょう！
　イベントの設定を行い、開発者コンソールでイベントログを確認できるところまで確認します。

## 1. 権限の付与
　機能が利用できるように、権限を付与します。
　権限セットかプロファイルで権限が付与することができます。
1)　[プロファイル] > [一般ユーザ権限] > [データ漏洩検出イベントを表示]にチェックを入れる。
2)　[プロファイル] > [システム管理者権限] > [アプリケーションのカスタマイズ]にチェックを入れる。

## 2. イベントモニタリングの設定
　リアルタイムにイベントをモニタリングできるように、配信とログを取得する設定を行います。
<手順>
1)　クイック検索：イベントモニタリングを入力 > イベントモニタリング設定を選択する。
2)　[イベントモニタリング設定]画面 > [イベントマネージャ]リンクをクリックする。
<img width="1431" alt="イベントモニタリング機能" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/35af0d0f-f3f4-4ed6-92df-20ca8272a94d.png">
3)　[イベントマネージャ]画面 > [行動]一覧 > 該当イベントの右プルダウンで[ストリーミングを有効化]または[ストレージを有効化]を選択する。
<img width="1171" alt="スクリーンショット 2019-12-12 5.12.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/eeabd2c8-236c-9cef-5017-ed81afb64dc6.png">
4)　設定されると、有効化したイベントの[データストリーミング中]または[データ保存中]にチェックが入っていることを確認する。
<img width="1177" alt="スクリーンショット 2019-12-12 5.17.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/f2801863-439d-bfb4-052d-79fa88fa7d06.png">

## 3. イベントレコードの確認
　イベントレコードの確認方法は、ビックオブジェクトへの検索とストリーミングの受信の２つあります。

### 3-1. ストレージの検索
　検索するデータ件数が少ないとわかっている場合、開発者コンソールやWorkbenchから検索することができます。
<img width="1177" alt="スクリーンショット 2019-12-12 5.28.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/bf7cd2f0-7d3c-b0aa-6fb9-ece443e6a7a7.png">

``` APIEvent.soql
SELECT EventIdentifier,EventDate,ElapsedTime,EvaluationTime,Operation,QueriedEntities,Query,Records,RowsProcessed,SessionKey,ApiType,ApiVersion From APIEvent
```
もう一つの方法は、非同期SOQLでREST APIで実行する方法です。
ここでは、割愛させていただきます。

#### <参考資料>
- [Platform Events Developer Guide (プラットフォームイベント開発者ガイド)](https://developer.salesforce.com/docs/atlas.ja-jp.222.0.platform_events.meta/platform_events/sforce_api_objects_apievent.htm)
- [リアルタイムイベントモニタリングのデータ保存](https://help.salesforce.com/articleView?id=real_time_event_monitoring_storage.htm&type=5)
- [非同期SOQLの使用例](https://developer.salesforce.com/docs/atlas.en-us.bigobjects.meta/bigobjects/async_query_examples.htm)

### 3-2. ストリーミングの受信
　サンプルのみの紹介です。

#### <参考資料>
- [イベント通知の受信：Javaサンプル](https://developer.salesforce.com/docs/atlas.ja-jp.platform_events.meta/platform_events/code_sample_java_add_source.htm)
- [Java、Aura コンポーネント、および Visualforce でのストリーミングイベント登録・受信方法](https://developer.salesforce.com/docs/atlas.ja-jp.222.0.api_streaming.meta/api_streaming/api_streaming_code_examples.htm)
- [ストリーミング API 開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.222.0.api_streaming.meta/api_streaming/intro_stream.htm)

# トランザクションセキュリティポリシー
　トランザクションセキュリティポリシーを利用するとユーザのセッション数が閾値を上回るときや不正なユーザアクションが実行されたときに、特定のユーザに通知やブロックすることができます。

## 1. トランザクションポリシー作成
　機能を有効化します。
1)　クイック検索：トランザクションセキュリティポリシー > [トランザクションセキュリティポリシー]メニューを選択する。
2)　[トランザクションセキュリティポリシー]画面 > [有効化]ボタンを押下する。
<img width="1440" alt="スクリーンショット 2019-12-12 5.54.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/7cfbf8d5-5087-1924-4eb0-9032018323f8.png">
3)　[トランザクションセキュリティポリシー]画面 > 右中段[新規]ボタンを押下します。
<img width="1182" alt="スクリーンショット 2019-12-12 6.00.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/6f242675-df2c-23d1-baf3-ff0ced687b9f.png">
4)　[種別]プルダウンから、対象のイベントを選択します。
APIイベント、リストビューイベント、レポートイベント、ログインイベントを選択することができます。
<img width="1440" alt="スクリーンショット 2019-12-12 6.54.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/7b874d96-72e5-2574-d170-c0beb29fdfde.png">
5)　[条件ロジック]に評価条件を設定します。
6)　条件を入力完了しましたら[次へ]ボタンを押下します。
<img width="1431" alt="スクリーンショット 2019-12-12 6.58.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/1f380886-a732-aab8-5d8a-886275c756fe.png">
6)　[アクション]プルダウンで[なし]または[ブロック]を選択できます。
<img width="1438" alt="スクリーンショット 2019-12-12 6.59.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/6d74fe96-55e8-fc3c-51a4-0eaf40d6be81.png">
7)　必要ならば[通知]方法を[メール通知]又は[アプリケーション内通知]をチェックします。
8)　[受信者] 項目に対象ユーザを選択します。
9)　[名前]や[説明]を入力し、[有効化]をONに設定し、[完了]ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/b0660384-51d6-851f-18ea-f6aa0a20674c.png)


設定は、以上です。

### 2. 確認
　設定したトランザクションセキュリティーポリシーを確認します。

<設定したトランザクションセキュリティポリシー条件>
　今回はSQLで検索結果が２０件を超える場合、メール通知とアプリケーション内通知を特定のユーザに送信するように設定しました。

　開発者コンソールで、取引先への検索を実行し通知を出します。
1)　[開発者コンソール]画面を立ち上げます。
2)　QueryEditorのテキストボックスに、取引先の全件検索を入力します。
3)　2-3秒後に通知アイコンに通知が来たことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/27e720a8-dc88-360c-fa42-d81c1f2b86c9.png)

4)　受信ユーザ宛にメール通知が届いていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/60bdff7e-120b-155f-d55b-3f72407cd03e.png)



上記、メールで通知を確認できました。

# 最後に
　いかがだったでしょうか？
　イベントモニタリングでは、パフォーマンスの劣化や不要なアクションがないか監視できるようになりました。
　また、トランザクションセキュリテイポリシーを使うことで、同時ユーザアクセスや大量データの検索などユーザアクションのタイミングでセキュリティーチェックを行い予兆を検知や、事前に抑止する事ができるようになりました。
　お客様にとって、大変な苦労して構築した大切なシステムが、実際に使っていただくユーザに受け入れていただく大切な時期に、安定稼働できる強力にサポートできる機能が提供され、お客様が安心して稼働を監視できるようになりましたね。
では、