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


はじめに

どうも、怠けたい社会人、nyaaayutaです

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

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

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

この記事を読むべき人

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

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

Webアプリの紹介

百聞は一見に如かず

Vizfis|有価証券報告書のビジュアライズ

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

主な利用したサービス

*はGoogle Cloud Platformのサービス

このWebサービスのレシピ

それでは、あなたも同じWebアプリを作れるように、作り方を全てお伝えします。

このサービスの全体像がこちらです。
Gifで動きます。

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

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

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

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


1. ComputeEngine ( GCE ) の自動起動・シャットダウン

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

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

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

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

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

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

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

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

Cloud Schedulerの設定


Cloud Schedulerには [ 頻度 ] で [ ターゲット ] の [ トピック ] に [ ペイロード ] を送信という設定をします。

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

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のインスタンスの名前なのですが…
ここでは、頭の隅っこにでも置いておいていただければ大丈夫です

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 インスタンスのスケジュール設定
Google Compute Engineでcronを使って日次バッチ処理を実行する

順次更新予定


2. EDINET APIからのXBRLの自動取得

順次更新予定


3. BeautifulSoup4によるXBRLの解析

順次更新予定


4. BigQueryへの自動インポート

順次更新予定


5. データポータルでのビジュアライズ

順次更新予定


6. AppEngineでのサーバー立ち上げ

順次更新予定


7. FlaskとBootstrap4でフロントエンド

順次更新予定


8. Google広告とAdSenseでビジネス

順次更新予定


これからやりたいこと

順次更新予定

おわりに

順次更新予定

参考資料

順次更新予定