ボタンを押したら Salesforce に通知がとぶ簡単なアプリを作ってみた
Salesforce ハッカソンというイベントがあり、その時に検証した仕組みについてメモを残しておきます。
やりたいこと
シンプルに、、、
ボタン (物理) がクリックされたら、リアルタイムに Salesforce の画面に通知する です。
これを AWS IoT Enterprise Button を利用して実現していきます。
AWS IoT Enterprise Button とは?
amazon が出してる ボタンのみのインターフェースを持つ IoT デバイスのことです。
2,500 円くらいで買えます。(このために自腹で買いました)
AWS IoT エンタープライズボタン - アマゾン
AWS IoT Enterprise Button でできること
AWS IoT 1-Click (AWS の IoT ボタンを管理するやつ) にてシングル、ダブル、長押しの クリックの検知
クリックされたら、以下いずれかの アクションを実行
Lambda 関数の実行
SMS を送信する
E メールの送信
が、できます。シンプルですね。
やりたいことのアーキテクチャ概要
イベントの通知はリアルタイムで行っていきたいので、pub/sub モデルを利用します。
amazon のデバイスを使っている以上、イベントの通知は一旦 AWS に飛んでしまいます。
そこから Salesforce に接続しにいくので、当然、認証 (認可) をどうするかについても考えないといけないですね。
以下のように概要設計してみました。
1. AWS IoT 1-Click にて、シングルクリックの検知
2. AWS Lambda 関数を実行
2-1. Salesforce への接続 (OAuth2 JWT Bearer Token フローを利用)
2-2. Salesforce の Platform Event に Publish
3. Subscriber である Lightning Component がイベントを検知して画面に表示
図にしてみました
https://gyazo.com/0d6c6e95cda1dfea6541831f526b2d98
以下、詳細を書いていきますが、インターネット上にはとてもわかりやすい記事がたくさんありますので、その記事へのリンクを主に貼っていきます。
Lightning Component の作成
まず、下記のトレイルヘッドをそのままやります。
インスタント通知アプリケーションの作成
プロジェクト形式のトレイルヘッドのため、Heroku アプリから Pratform Event を Publish して Salesforce に通知する簡単なアプリが出来上がるはずです。このアプリの Heroku から通知する部分を、IoT ボタンからの通知でも動くように設定していきます。
AWS IoT 1-Click の設定
次に、IoT ボタンの設定を行っていきます。下記記事が大変参考になります。
アプリをポチポチするだけで簡単に設定が可能です。便利ですね。
【国内販売開始】AWS IoT Enterprise Button試してみたらホンマに簡単にLambda関数を実行できた
AWS Lambda 関数の実行と、JWT Bearer Token フローによる Salesforce への接続
メインとなる部分です。Salesforce 上に接続アプリケーションと、AWS 上に Lambda 関数を作成します。
AWS Lambda は、説明してませんでしたが、サーバレスで関数を実行できるすんごい便利なサービスのことです。
AWS Lambda 関数の中では、JWT Bearer Token フローを利用して Salesforce へ接続します。
JWT Bearer Token フローってのは OAuth のフローの一種です。なぜこの方式を選ぶのかというと、OAuth ってたいていのフローではユーザに認証だの認可だのを 画面上で やって貰う必要があるんですけど、IoT ボタンに画面なんてものはありません。
なので、画面での認証が不要な JWT を利用します。
重要なので色をつけました
下記記事を参考に Salesforce 上に接続アプリケーションを作成しましょう。
OAuth2 JWT Bearer Token フローを使ってSalesforceへアクセスする
(上の記事、大変参考になりました。わかりやすい記事ありがとうございます・・・!!)
記事中のソースは、下記のように修正します。
ここ (↓) のところを、
code: js
conn.query('SELECT Id, Name FROM Account LIMIT 5').then(function(qr) {
console.log('Done:', qr.done);
console.log('Fetched Records:', qr.records);
});
こう (↓) 。(Platform Event の API 参照名はトレイルヘッドのものと同じにしています。)
code:js
conn.sobject('Notification__e').create({
'Message__c': 'test message!',
}, function (err, ret) {
if (err || !ret.success) {
return console.error(err, ret);
}
});
これだけで OK!
実際にやってみた
こんな感じになりました。
UI まわりはトレイルヘッドのものから、いくらか修正しています。
(ボタンを押したらトーストが出て画像が切り替わるだけです)
https://gyazo.com/38cb9c5f5bdd174f90d4312a1980d9e2
レイテンシが高いですね。。。ネットワークが弱いのか、それとももう少し課金したら良くなるのでしょうか。
とはいえ、繋ぐところまでは検証できたので目的は達成できました。あとはこれをどう応用させるかなのですが、応用例がいろいろと考えられる良い仕組みなんじゃないかなぁ、と個人的には思ってます。