Zoomのクラウドレコーディング完了をAPI, Lambda経由でSlackに通知する

# これは何
zoomのクラウドレコーディング完了を、slackの特定のチャンネルに通知
今回は

- Slack App (Incoming Webhook)
- AWS Lambda（python）
- AWS api gateway
- Zoom App (Outgoing Webhook)

などを使用します。
※練習も兼ねて手順を細かめにメモしています。

▼クラウドレコーディングが終わってしばらくすると通知が来る。それだけ。こっからカスタマイズしていきたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/4d649e2b-805c-603c-412a-a3d118fec9cb.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/a9d862d6-63b0-baa0-498f-b95f2eab059d.png)



###  作成のきっかけ
- エンコードに時間がかかること、MTGが一旦終了しないとエンコードが始まらないぽい？ ことが手伝って動画をアップ&共有することを忘れがちです。なので楽したい。
    - でもZoom側でエンコードしてくれるのは正直ありがたいです。
- Lambdaの練習
- 今後のZoom APIを絡めたカイゼンのステップとして
- Zoomの容量はすぐにいっぱいになるので要改善





# Slackの設定
処理の後方から設定していきます

▼https://api.slack.com/apps へ行って「Create New App」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/9a55f8d6-050f-ca7f-9bb4-1b34f8a750e0.png)


▼「App Name」（後で変更可能）と、ワークスペースを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/a42a3b00-5628-a170-5eb8-3db0d9470d7f.png" width=50%>

▼Incoming Webhooksの項へ行って、Activate Incoming WebhooksをONに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/05076bbc-43f9-64c7-bf85-01775ae3e2fd.png)


▼Add New Webhook to Workspace
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/36dbe382-adf6-9358-1128-82ab14544620.png)

▼投稿するチャンネル先を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/43868e7c-8a0b-15be-956a-effce26174de.png)

▼「Copy」を押してURLを取っておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/f208c7d6-b4af-635d-e7d9-29870266193e.png)

# Lambdaの設定
▼https://aws.amazon.com/jp/lambda/ へ。まずリージョンを確認、今回は東京にしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/c380f8f4-29ff-3186-4f9f-e02ef8c3fa2e.png)

▼関数の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/e32dc795-2343-60a4-2dcc-c4afd60fe86c.png)

▼「一から作成」
ランタイムを「Python 3.8」としました
ロールはデフォルト「基本的な Lambda アクセス権限で新しいロールを作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/7869465e-211f-9d8b-6601-d58c92bd9076.png)

▼Slackまでの接続確認用の簡易コードはこんなかんじ。
※slack_urlには slack設定で得たURLを貼る

```python
import json
import urllib.request

def post_slack(slack_url, message, icon_emoji="robot_face", username="BOT"):
        send_data = {
                "text": message,
                "icon_emoji": icon_emoji,
                "username" : username,
        }
        send_text = json.dumps(send_data)
        request = urllib.request.Request(slack_url,
                data=send_text.encode('utf-8'),
                method="POST"
        )
        with urllib.request.urlopen(request) as response:
                response_body = response.read().decode('utf-8')

def lambda_handler(event, context):
        message = "hogehoge"
        slack_url = "https://hooks.slack.com/services/****/****/****"
        post_slack(slack_url, message)
```

▼接続確認コードを貼り付けたら一旦テスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/9047a45b-0c49-35cf-c23b-8f973055df04.png)

▼テストイベントをそのまま「作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/c9dae436-6e0d-ee1f-547b-08cb18e7b99f.png)

▼もう一度「テスト」を押すと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/ff68df3b-8e1c-c0a7-088c-a9e33d1d4f75.png)


▼slackに通知が来ました。なんとかなりそうな気がしてきた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/a8db5aa1-4e84-d96d-8230-32e86a168076.png)

▼本番のコード

```python

import json
import urllib.request
import ast
import datetime
import dateutil.parser

def post_slack(slack_url, message, icon_emoji="robot_face", username="BOT"):
        send_data = {
                "text": message,
       "icon_emoji": icon_emoji,
       "username" : username,
        }
        send_text = json.dumps(send_data)
        request = urllib.request.Request(slack_url,
                data=send_text.encode('utf-8'),
                method="POST"
        )
        with urllib.request.urlopen(request) as response:
                response_body = response.read().decode('utf-8')

def lambda_handler(event, context):
        # bodyの取得
        dict_body = ast.literal_eval(event['body'])

        # 開始時間の取得
        start_time = dict_body['payload']['object']['start_time']
        JST = datetime.timezone(datetime.timedelta(hours=+9), 'JST')
        jst_timestamp = dateutil.parser.parse(start_time).astimezone(JST)
        str_jst = jst_timestamp.strftime('%Y-%m-%d %H:%M:%S')
        
        # いろいろ取得
        topic = dict_body['payload']['object']['topic'] # nnのミーティング
        share_url = dict_body['payload']['object']['share_url']
        password = dict_body['payload']['object']['password']
        
        #message作成
        message = str_jst + " 開始 【" + topic + "】のクラウドレコーディングが完了しました" + "\n"
        message += "<" + share_url + "|" + share_url + ">" + "\n"
        message += password + "\n"
        
        slack_url = "https://hooks.slack.com/services/****/****/****"
        post_slack(slack_url, message)
```

# AWS API Gatewayの設定

▼ https://aws.amazon.com/jp/api-gateway/ から作成を開始
Lambdaと同じリージョンでやります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/56f23ff5-fc24-2bd4-4d8e-5bc4526b3bd8.png)

▼APIを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/97cbde14-3e6c-2858-b0e0-ce98225c2940.png)

▼HTTP API
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/57f506cc-f3a2-910f-8604-b98aba2f1b5a.png)

▼統合を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/460215b3-b4b9-0a49-c162-12b3de9d929a.png)

▼Lambdaを選択して、Lambda関数を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/e63ff7e2-4476-5b42-b9c7-7e4b3041725b.png)

▼API名を決めて「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/b84d5f4d-15a6-874b-a897-8d04738fd554.png)

▼メソッドをPOSTにして「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/84186b96-9df4-f499-fef4-55cb57124415.png)

▼ステージ名はdefaultのまま「次へ」→「作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/d0639d93-722b-7f75-3b7f-fc1618db85d6.png)

▼LambdaにもどってAPI Gatewayをクリック、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/a56dc0ba-4f4e-b207-2f3e-bf30d2fa0f74.png)

▼API Gateway、
先ほど設定したAPIを指定、
デプロイされるステージは$default
セキュリティは今回はオープンにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/d8161391-1083-3bf8-912a-3b6aeaf9c53c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/31a5c9dd-6334-7071-eb18-50f2af46bfcc.png)

▼APIエンドポイントをコピーしておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/9b852665-5b9c-ff2f-7d02-8096c994d6ae.png)

# Zoom Appの設定

▼ https://marketplace.zoom.us/ へ行って、Develop > Build App
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/d43ab84b-b524-ff51-6d7a-076d23fa3fe5.png)

▼Webhook Only を「Create」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/8e656953-fe5d-5edc-5faf-1049cf6c004d.png)

▼app名を入力
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/2fa796df-196b-ca06-f352-5762470f5122.png" width="50%">

▼もろもろ入力して Continue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/4d941cbd-83e1-3fd2-616f-af02a31d72bf.png)

▼Event Subscriptionsをオンにして、
Sumbscription Name は適当に
Event Notification endpooint URLは、AWS API Gatewayで取得したURLを入力
Add eventsをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/5f74676c-b20e-b3ae-84ae-553fd3351e64.png)

▼Recording > All Recordings have completed
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/d71d183b-e7f1-a934-d2f6-24238b8d8510.png)

▼SaveしてContinue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/a7a4e952-f71f-3fed-045b-fac05e1fe860.png)

▼完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/3821f17e-1301-6dd9-b697-a375e43e6e28.png)

# 動作を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94687/4d649e2b-805c-603c-412a-a3d118fec9cb.png)

# 参考記事

> ###### slackのIncoming webhookが新しくなっていたのでまとめてみた - Qiita
> https://qiita.com/kshibata101/items/0e13c420080a993c5d16

> ###### 今度こそ理解する！俺式Lambda入門 | Developers.IO
> https://dev.classmethod.jp/articles/lambda-my-first-step/


> ###### GitHub - cloudnative-co/lambda-ZoomRecordingsTransfer  
> https://github.com/cloudnative-co/lambda-ZoomRecordingsTransfer?fbclid=IwAR3q09GtYvAujG2hU8X1I5fiihHwyd-XcpAIWsPjeqtbX8L0RDeGwcBhBMM
>> ▲着想、Zoom App部分はほぼここを参考にさせてもらいました m(__)m