手をかけなくても、自分で育ってくれるWebアプリを作りたい。

#はじめに
どうも、怠けたい社会人、nyaaayutaです:blush:

休みの日にベットでだらけているときも、会社に行く電車の中でも、もちろん仕事中も、働かなくて済む方法を四六時中考えています。

そんな私の代わりの働きもの（ヒモ）として、企業情報をデータ分析をするWebアプリを作ったので、その経緯やノウハウを皆さんにもシェアします。

さあみなさんも、一緒にだらけるために頑張りましょう！

###この記事を読むべき人
- 「自分じゃない誰かがお金を稼いでくれればいいのに」と思う
- 不労所得という言葉に魅力を感じる
- 自動化にロマンを感じる
- データには無限の可能性があると思う
- 会社が儲かってるとか赤字垂れ流してるとか見るのが好き

マニアックで一つしか当てはまらない？
十分です。ちなみに私は全部当てはまります。ダメ人間です:stuck_out_tongue_closed_eyes:

#Webアプリの紹介
###百聞は一見に如かず
[Vizfis｜有価証券報告書のビジュアライズ](https://vizfis.com)

なんとなく雰囲気が分かったら戻ってきてくださいね。

###主な利用したサービス
- データの取得
    - [EDINET API](https://disclosure.edinet-fsa.go.jp/EKW0EZ0015.html)
    - [Cloud Scheduler*](https://cloud.google.com/scheduler/)
    - [Google Compute Engine*](https://cloud.google.com/compute/)
- データの加工・管理
    - [BigQuery*](https://cloud.google.com/bigquery/)
- Webアプリの構築（裏側）
    - [Google App Engine*](https://cloud.google.com/appengine/docs/whatisgoogleappengine)
- Webアプリの構築（表側）
    - [Flask](https://a2c.bitbucket.io/flask/)
    - [Bootstrap4](https://getbootstrap.jp/docs/4.3/getting-started/introduction/)
- データのビジュアライズ
    - [データポータル](https://marketingplatform.google.com/intl/ja/about/data-studio/)

\*は[Google Cloud Platform](https://cloud.google.com/)のサービス

#このWebサービスのレシピ
それでは、あなたも同じWebアプリを作れるように、作り方を全てお伝えします。
![vizfis_model.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516519/7c903917-84fd-1237-ef07-a5d931e67413.gif)
このサービスの全体像がこちらです。
Gifで動きます。

この図を見てもさっぱりな方にも分かるように、
この１つ１つについてなるべく丁寧に説明します。

とはいえ、私がGoogleさんに足を向けて寝られないことは伝わったのではないでしょうか:thinking:

全８ステップです。長くなりますが、お付き合いいただければ幸いです:bow:

なお、[Google Cloud Platform](https://cloud.google.com/)のプロジェクト作成までは説明範囲外にします。
サイトにアクセスして誘導されるままにボタンを押せばできると思います。

---
### 1. ComputeEngine ( GCE ) の自動起動・シャットダウン
![Vizfisビジネスモデル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516519/a4beccd2-6895-8333-5e8d-715f9faad81c.png)

コンピューター周りの様々なサービスをクラウドで提供しているGoogleCloudPlatform ( GCP ) というサービスの一つに、GoogleComputeEngine ( GCE ) があります。いわゆるIaaSというもので、レンタルサーバーのようなものをイメージしていただければ近いです。

今回は、**毎朝午前4時に、データの取得をするプログラムをGCEで実行すること**が目的です。

そのために、**Cloud Schedulerを利用して毎朝午前4時にGCEを起動する設定をし、GCE起動時にプログラムを実行する設定をする方法**を紹介します。

GCEを常時起動して午前4時にプログラムを実行する方法もありますが、費用面からこの方法を採用しました。
GCEはサーバーを起動している時間に対して課金されるためです。
[GCEの料金](https://cloud.google.com/compute/all-pricing) ( 余談ですが、GCPのドキュメントは分かりにくいことで有名です^^ )

常時起動しているとべらぼうにお金がかかります（とはいえGCPは安い方、という印象もありますが…）。
働かないことを目指している私にとっては、1円でも節約したいところです。
そこで、システムを複雑に作って、
**「必要なときだけ使って、終わったらすぐ止めて、いいとこ取りしちゃおう大作戦」**でいこうと思います。

![Vizfisビジネスモデル (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516519/414bc637-a7cf-926d-207f-d9fffb04e7c9.png)

詳しいシステム図がこちらです。
[Google Cloud Pub/Sub](https://cloud.google.com/pubsub/)は、なにかアクションを受けたら設定したメッセージを送る、といったサービスです。
[Google Cloud Functions](https://cloud.google.com/functions/)は、なにかアクションを受けたら登録された関数を実行する、というサービスです。
Cloud Schedulerが午前4時にPub/Subのトリガーを起動すると、Pub/SubはCloud Functionsにメッセージを送ります。Cloud Functionsは受け取ったメッセージをもとに、GCEを起動する関数を実行します。関数は今回はPython3を使用しています。

Cloud Schedulerから直接Cloud Functionを実行することも出来ますが、その場合HTTPを使うことになるため、外部からも実行できてしまいます。Pub/Subを挟むことによって認証が加わるため、このフローになっています。

それでは各システムの設定を紹介します。

#### Cloud Schedulerの設定
![CloudShceduler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516519/f7bbfc9a-d480-def9-b139-1e1e5441f172.png)
Cloud Schedulerには **[ 頻度 ] で [ ターゲット ] の [ トピック ] に [ ペイロード ] を送信**という設定をします。

■ 頻度
頻度はcronというコマンド定期実行の仕組みで使う書き方で記述します。

```shell:cron
12 4 * * *
```
左から、[分] [時] [日] [月] [曜日] が対応しており、
上のコマンドの場合は、「4時12分」という条件に当てはまったときに実行されます。
もっと複雑な条件指定も可能ですが、私にはこれで十分でした。
気になる方は、 [ cron 書式 ] などで検索してみてください。

■ ターゲット
今回はPub/Subに送信しますが、他にHTTPとAppEngine HTTPという選択肢があります。
ただ、今回は前述の通り、セキュリティ上の理由から、Pub/Subを挟みます。

■ トピック
今回はこの後紹介するPub/Subの設定に、 [ switcher ] という名前をつけます。
このトピックは、Pub/Subのswitcherのトリガーを起動してね、という設定です。

■ ペイロード
ペイロードとは、送るメッセージの内容です。
Pub/Subに横流ししてもらい、Cloud Functionへ、
***{"switch": "on", "target": "worker"}***
というメッセージを送ってもらいたい、という設定にしています。

switch-on、は分かりますよね。
workerというのは、最終的に起動するGCEのインスタンスの名前なのですが…
ここでは、頭の隅っこにでも置いておいていただければ大丈夫です:thumbsup_tone2:

#### Cloud Pub/Subの設定
Cloud Pub/Subはこの後のFunctionsで設定するため、操作不要です！次行きましょう！

#### Cloud Functionsの設定
Cloud Functionsについては、
・普通のPCのハードウェアをクラウド化→GCE
・さらに環境構築までクラウド化→GAE（GoogleAppEngine）
・それでは飽き足らず、Configなどファイル周りまでクラウド化
したものって感じの雰囲気のイメージで捉えていただければ良いかと思います。
（別途ちゃんと調べてください。）

要は、Function（関数）だけ書けばコンピューターが動きます、というサービスです。
このCloud Functionsには、Cloud Scheduler→Pub/Subからのペイロードを受け取って、
それに応じてインスタンスを起動させるFunctionを実行してもらいます。

2019/11/26 引き続きちょっと最近仕事が忙しくて（不本意）、ちょっとまっていただけると嬉しいです…！ nyaaayuta

#### GCEの設定 ( 起動 )

#### GCEの設定 ( シャットダウン )


参考：
[Cloud Scheduler を使用した Compute インスタンスのスケジュール設定](https://cloud.google.com/scheduler/docs/start-and-stop-compute-engine-instances-on-a-schedule)
[Google Compute Engineでcronを使って日次バッチ処理を実行する](https://www.marketechlabo.com/batch-processing-on-gce/)

順次更新予定

---
### 2. EDINET APIからのXBRLの自動取得
順次更新予定

---
### 3. BeautifulSoup4によるXBRLの解析
順次更新予定

---
### 4. BigQueryへの自動インポート
順次更新予定

---
### 5. データポータルでのビジュアライズ
順次更新予定

---
### 6. AppEngineでのサーバー立ち上げ
順次更新予定

---
### 7. FlaskとBootstrap4でフロントエンド
順次更新予定

---
### 8. Google広告とAdSenseでビジネス
順次更新予定

---
#これからやりたいこと
順次更新予定

#おわりに
順次更新予定

#参考資料
順次更新予定