Google Cloud SchedulerでMicrosoft Teamsに時報を投げる

#目的
定期実行といえばcron。無料でcronっぽいことをしてくれるGASの記事はよく見かけるけど、時間が少し不安定だったり色々とかゆいところに手が届かない。
というわけで、GCPにあるCloud Schedulerなるサービスを触ってみる。
同様の記事は少ない気がしたので、自分なりのメモも兼ねる。

Microsoft TeamsやGCPのコンソール自体の操作にはあまり触れないのであしからず。

#やったこと

##構成を考える
Microsoft Teamsには、連携できるアプリがいっぱいあるらしく、その中で今回はIncomming Webhookに目をつけました。

Webhookは、超絶ざっくり言うと特定のPOSTリクエストが来たときに反応するよ、っていう技術です。つまり、Teamsのとあるチャンネルに自動で何かを投稿したいなら、「hogehoge.com」にリクエストをぶん投げてね、ってことです。

そして、Google Cloud Schedulerでは時間指定で特定の動作を行うことができるのですが、この特定の動作の種類が「App Engine HTTP」、「HTTP」、「Pub/Sub」の3種類です（2019/9/20現在）。

この中のHTTPがまさにHTTPリクエスト（今回だとPOST）のことなので、まとめると
・Cloud Schedulerで時間を指定して特定の動作を行う
・特定の動作を「hogehoge.comへリクエストを送信する」に設定する
以上、というわけであります。

##Teams側の設定
さて、チャンネルにメッセージを投稿するには「hogehoge.com」へリクエストを送ると言いましたが、もちろんこれはダミーURLです。
本当は、チャンネルごとにこれが存在する（発行できる）ので、発行していきます。

まずは、TeamsチャンネルでIncomming Webhookを連携する必要があります。

アプリの連携は、[チームの管理]→[アプリ]で行うことができます。
こんな感じの画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/846df2e3-492a-b375-0e21-c6532fcad81b.png)

連携を始めるときには、画像右上部分の[アプリの連携]から[Incomming Webhook]を検索して連携します。

次に、[チームに追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/767cd154-4e4f-e383-b277-f39450f94105.png)

すると、どのチャンネルに投稿したいのか聞かれるので、チャンネルを選択します。
私は「実験」チャンネルを作って、そこに投稿することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/3c42964b-c4da-4e90-2aa0-56d34428820e.png)

[コネクタを設定]をクリックすると、名前と画像を決める欄が出てきます。
名前は必須ですが、適当にtestとしておきます。
画像は実際に時報を送ってくる奴のアイコン画像になります。とりあえずデフォルトのまま進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/348a7710-88e0-95b0-781e-707444e7efc4.png)


すると、同じ画面の下部に発行されたURLが出てきますが、これが前述の「hogehoge.com」に該当します。これは使いますので、忘れずにコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/9c64613c-aca5-8d78-3a37-40e43dcec98a.png)

##Cloud Schedulerの設定
GCPのコンソールへログインします。
左側のハンバーガーボタンから、下の方にある「Cloud Scheduler」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/44d8455a-03ee-a126-ec03-49d525f6d88c.png)

すると、こんな感じの画面になるので、「Create Job」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/49730226-2277-6642-8b1a-a7e4dcc9752a.png)

名前、頻度、タイムゾーン、ターゲット（何をするのか）をそれぞれ決めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/d1fc942d-b0d6-95ae-9dbc-b6cb075be662.png)

私はこんな感じで設定しました。
頻度のところは、cronと同じ書き方です。詳しくは<a href="https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules?&_ga=2.23453886.-544689865.1568954358#defining_the_job_schedule">ここ</a>を見るか、cronでググってください。

タイムゾーンは日本、ターゲットはHTTPリクエストを送るのでHTTPとなります。
URLは、先程Teams側で発行されたものをコピペします。
WebhookはそもそもPOST前提なので、HTTPメソッド部分はPOSTでOKです。

本文のところは、JSONで送ります。
今回は{text:"Hello!"}としてみました。
JSONデータのキー部分はtextと決まっていますが、メッセージ本体は好きな内容でOKです。
（例：{ text: "おやすみなさい" }　等）

最後に作成ボタンをクリックすると、ジョブが完成します。
ジョブ一覧画面に戻るので、右側の「今すぐ実行」をクリックして挙動を確かめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/91dd80d2-c545-da79-69e6-b3691284c8c6.png)

無事に届きました！！
ちゃんと1分おきにも実行されています。

#応用する
Cloud SchedulerではHTTPリクエストを叩いているだけですが、構成さえ工夫できれば自前の処理を埋め込むこともできます。
例えば、Cloud SchedulerでGASのスクリプトを叩く→GASのスクリプト内でTeamsへのPOSTリクエストを送信　のようにすれば、例えば時報だけでなく天気予報APIを使って天気を投げたりすることもできますね。

#まとめ
* Cloud SchedulerとTeamsを使って正確な時報を投げることができる！
* Cloud Schedulerの料金表は<a href="https://cloud.google.com/scheduler/pricing?hl=ja">ここ</a>
* 2019/9/20現在、アカウントあたり3ジョブまでなら無料！