GCPを使って日次のLine push通知を作ってみた

日次でとある情報をクローリングしてLineにPush通知する機能を作りました。

自宅で常時起動しているマシンはないので、最近仕事で使うことが多いGCPを使い、なるべく低コストで実現することにしました。
※すべて2019年7月時点の情報です。料金体系などは変更になっていることもあるので実際の料金は公式ホームページでご確認ください。

# 構成
![linepush.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/d0f08cfb-ba50-58dc-f995-dc8bd7bb7ff1.png)


図のような構成にしました。それぞれの詳細は後述します。

1. 定時にcloud schedulerがpubsubのtopicにメッセージを送信
2. pub/subのtopicをトリガーにcloud functionsを起動
3. cloud functionsでwebページをクローリング
4. 情報を整形してLineへPush通知

# LINE Developers

LineにPush通知を行うにはLine Developersに登録する必要があります。
https://developers.line.biz/

## 登録
Line Developersにログインしたら新規プロバイダーを作成します。
<img width="980" alt="スクリーンショット 2019-07-11 22.27.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/7ed1674c-72dd-bebf-0ea5-ff49d75b93cd.png">

次に作ったプロバイダーに新規チャンネルを作成します。
今回はLineへPush通知をしたいのでMessaging APIを選びます。

<img width="749" alt="スクリーンショット 2019-07-11 22.28.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/0f57063e-8389-aa2d-9085-66523395bb72.png">

最後にチャンネル基本設定＞メッセージ送受信設定＞アクセストークンを発行します。
アクセストークンを発行するときに失効までの時間を聞かれますが、これは再発行の場合の古いトークンの有効期限でこれから発行するトークンの期限ではないです。
発行したアクセストークンは特に有効期限はなく使えそうです。

## 料金
LineのPush通知はフリープランで可能です。(2019年7月時点)
https://at.line.me/jp/plan

# Cloud Pub/Sub
Pub/Subはパブリッシュ/サブスクライブ方式でイベント駆動のシステムを簡単に作ることができるものです。
https://cloud.google.com/pubsub/

今回は定時起動するCloud Schedulerからメッセージを受信して、Cloud Functionsに通知する役割で使用します。
Cloud SchedulerやCloud Functionsを作成するときにPub/Subのトピックを選択する必要があるので最初に作成しておきます。

## 登録
GCP>Cloud Pub/Sub
「トピックを作成」をクリックして作成します。

特に難しいことはなく名前を入れて、暗号化はGoogleが管理する鍵を選択して作成終わりです。
<img width="499" alt="スクリーンショット 2019-07-11 23.08.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/6dae8a9c-1c54-a474-82e9-d18b6d996fee.png">

## 料金
1ヶ月１０GBまで無料で使えます。日次で１通送るだけなので余裕で無料枠内です。
https://cloud.google.com/free/

# Cloud Scheduler
Cloud Schedulerで日次で起動するジョブを登録します。定時に先ほど登録したpub/subにメッセージを送信するジョブを登録します。
https://cloud.google.com/scheduler/

## 登録
GCP>Cloud Scheduler
ここで新しいジョブを作成しましょう。
頻度はcronと同じ記述方法です。ターゲットは先ほど登録したpub/subのトピックを指定します。ペイロードは今回は特に渡すデータはないので空にしました。

<img width="514" alt="スクリーンショット 2019-07-11 22.42.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/98b1534a-d68f-d56d-fc18-4208d32545fb.png">

## 料金
月３ジョブまでは無料です。私は他にジョブを登録していないので無料。
https://cloud.google.com/scheduler/#header_2

# Cloud Functions
Cloud Functionsではサーバーレスで関数を定義することができます。
登録した関数はPub/Subをトリガーに起動させることができます。
今回はクローリングとLineへのPush通知を行う関数を登録します。
https://cloud.google.com/functions/

## 登録
GCP>Cloud Functions
「関数を作成」をクリックして作成します。

トリガーには先ほど登録したPub/Subのトピックを指定します。
ソースコードは様々な方法がありますが、真面目にソース管理するならCloud Source Repositoriesを使ったほうがいいと思いますが趣味で簡単なソースを書くだけならインラインエディタでも良いと思います。
ランタイムはお好きな言語を。今回私はNode.jsにしました。

<img width="462" alt="スクリーンショット 2019-07-14 21.36.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/df817752-34cd-10d4-027e-b8313ab30768.png">

インラインエディタを選んだ場合、すぐ下のテキストエリアにソースを書くだけです。
なお、LineのPush通知ではアクセストークンなどを登録する必要があるので、下部にあるEnvironment variablesのところを開いて環境変数に登録すると良いです。
<img width="468" alt="スクリーンショット 2019-07-14 21.36.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/fdb1cd05-7b86-ed19-120e-6da8ea8ed1de.png">


## 料金
1ヶ月あたり200万回呼び出しても無料みたいです。今回は1日１回なので余裕ですね。
https://cloud.google.com/free/

# 最後に
各々の機能の料金は「料金」のところに記載しましたが、結果として全て無料枠内で作ることができました。
GCPでは今回紹介した機能以外でも個人で使う分には無料枠の範囲で使えることが多いので今後も積極的に活用してきたいと思います。
↓GCP無料枠
https://cloud.google.com/free/