SORACOM LTE-Mボタンを押して、Slackのワークフローを発動させる

これは、[SORACOM Advent Calendar 2019](https://qiita.com/advent-calendar/2019/soracom)の21日目の記事です。

--- 

**SORACOM FunkとSORACOM Napterは神。**
だと思っている人です。

---

### 前説
ボタンネタで書こうと思ったものの、何を書くかなーと悩んでました。

そういえば、ボタンを使って承認するって話しあったなー。
承認するといえば、ワークフロー。
そういえば、最近Slackにワークフローできたなー。

よし。ボタン押したら、SORACOM Funk経由で、Lambdaを呼び出して、SlackにPOSTして、ワークフローを起動させよう。

っていうのをやってみた話です。

Funkが使える #しろボタンと#ひげボタン はもちろんですが、
AWS IoT-1ClickからLambdaを呼び出すことができるので、#あのボタン でも使えます。

### 構成図

<img width="909" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/64b56128-709b-8f17-9f59-63633311f711.png">

### ソース
githubにおいてあります。
https://github.com/Kenichiro-Wada/advent-calendar/tree/master/soracom-2019

AWS LambdaのNode v12.xランタイムにおいて動作確認しています。
デプロイはServerless Frameworkで実施してます。

Slackのチャネル名、チャネルID、下で取得するSlackのトークンはAWS Key Management Service (KMS)で暗号化しています。
[serverless-kms-secrets を導入する手順](https://dream-yt.github.io/post/serverless-kms-secrets-101/)
を参考にしました。

### SORACOM側設定
SORACOM Funkに作成したLambdaを
[SORACOM Funkを使ってみた。](https://qiita.com/keni_w/items/4b511f89c8dbd259a78d) に書いてあるので、こちらをみてください（宣伝）

### Slack API設定
以前使ったことがある**Incoming Webhook**だと、できなそうだったので、APIを叩いています。
利用するために、トークンが必要なので、ワークスペースにAPIの設定を行って、取得しています。

https://api.slack.com/apps
にアクセスして、Create New Appをクリックして、追加するワークスペースと、名前を設定
<img width="342" alt="slack1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/c3910e8d-9c48-9d58-cf15-2eaa0279bf07.png">

完成したら、左ペインの **OAuth & Permissions**
を選んで、権限を付与していきます。

<img width="673" alt="slack2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/2b1dca41-dc2f-b2c2-ea79-a6f95afbe078.png">

こんな感じ

<img width="662" alt="slack3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/588030f7-1cf2-fd11-4128-1ca9b430ae4b.png">

権限設定が終わったら、
**OAuth Tokens & Redirect URLs** にある**Install App to Workspace**を押して、トークンを生成します。

上記の通り、生成したトークンは、Lambdaの環境変数にAWS KMSを使って暗号化した上でセットしています。

### Slackワークフロー
Slackのワークフローの作り方は、こんな感じ。
[公式](https://slack.com/intl/ja-jp/help/articles/360035209114)

ワークフロービルダーを起動して、作成開始
<img width="1228" alt="SlackWorkflow1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/9ef41582-b2c8-a56d-7ac4-21ab255c034f.png">

名前をつけます
<img width="558" alt="SlackWorkflow2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/d4ab2c1b-50b5-9462-2191-6d00be467956.png">

発動条件を決めるます
ワークフローの発動条件としては、以下がありますが、今回は**絵文字リアクション**を設定させています・
- チャンネルへの追加
- アクションメニュー
- 絵文字リアクション

<img width="539" alt="SlackWorkflow3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/c92b8c42-d689-a63f-c980-e316cbd2a7e8.png">

発動させるチャンネルと、絵文字を設定します。
<img width="542" alt="SlackWorkflow4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/ab547c79-4dc9-89ab-def3-89f808549223.png">

そのあとのアクションを決めます。
今回は**フォーム作成する** にしています。
<img width="548" alt="SlackWorkflow5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/abff4367-3e63-c0d6-2b40-20af3c444b0e.png">

表示内容などを設定します。
<img width="546" alt="SlackWorkflow6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/790b4564-efc1-73a8-13c1-ae4fffa3915a.png">

で、完成。あとは公開すればOK
<img width="761" alt="SlackWorkflow7" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/2a52f90a-a73c-79d3-c3a8-ef430f6e20ad.png">

### 動作
今回ボタンの動作で、以下のようなアクションにしています。
- シングルクリック : 承認 -> 承認メッセージ追加
- ダブルクリック : 否認　-> 依頼メッセージに、NGアイコンを表示して、それを条件に否認理由入力するためのワークフロー発動させています
- ロングクリック : 保留　-> 依頼メッセージに、ハンドアイコンを表示して、それを条件に否認理由入力するためのワークフロー発動させています

シングルクリック(承認)の場合
<img width="557" alt="承認" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/652f5c1e-272a-88c6-61d1-1d0ce05de2ec.png">

ダブルクリック(否認)の場合
<img width="694" alt="否認" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/c3a520c9-75db-2f12-c81e-5882606a381e.png">

ロングクリック(保留)の場合
<img width="697" alt="保留" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/d3e746fe-e289-2324-7bee-c56df3c68ab2.png">

自分個人のSlackワークスペースで作ってみたので、他にユーザーいないので。自己承認・自己否認になってますw

### 実際のところは・・・。
使うのか・・・と言われると。。。
こういうこともできるよってネタになります。

作ってて、思ったのですが、
最後のポストしか承認できないから、
むむむ。上申の印鑑もらう行列と同じような承認もらう行列になってしまうー。

### 注意事項
Slackのワークフローは、**無料プランでは利用できません。**
有料プランにする必要があります。はい。

---

## 最後に
あまりボタンのことを書いてなかったのでw、Twitterには呟いたんですが、ボタンについての所見等々を

**SORACOM LTE-M Button powered by AWS**が発売されてから約1年たち、**Enterprise button**、**Button Plus**が発売されて、色々な使い方ができるようになった気がします（自分では大した事例出せないのが申し訳ない）。
また、IoT1-Click経由でしかLambdaを呼べなかったけど、Funnel->AWS IoT Coreで呼ベるようになり、そして、Funkを使うことで、簡単にLambdaを呼べるようになりました。
いや、ほんとすごい。

通信環境も、今年も押しまくってた時期があったんですが、1年でだいぶ改善された感じがしてます。あれ、以前より通信の成功率上がったな感(えらい上目線w)。

来年、2020/02/18には[SORACOM Technology Camp 2020](https://www.technology-camp.soracom.jp/)があり、今回もナイトイベントあるらしいので、そこでLT募集でもあったら、募集申し込んでみようかと思う2019年の師走の午後でした。