tag:crieit.net,2005:https://crieit.net/tags/GAE/feed
「GAE」の記事 - Crieit
Crieitでタグ「GAE」に投稿された最近の記事
2020-03-22T06:54:01+09:00
https://crieit.net/tags/GAE/feed
tag:crieit.net,2005:PublicArticle/15775
2020-03-20T13:51:56+09:00
2020-03-22T06:54:01+09:00
https://crieit.net/posts/Nuxt-5-Firebase-GAE-Netlify-Heroku
Nuxtアプリを無料で公開するときに試した5つの環境まとめ(Firebase/GAE/Netlify/Heroku)
<p>最近Nuxtでいろいろ作っているけど、無料で使える環境をいろいろ試してる。<br />
いろいろメリデメあるけど、SPAならNetlify/SSRならHerokuがよさそう。<br />
いままで試したものをまとめてみた。</p>
<h3 id="ほしかったもの"><a href="#%E3%81%BB%E3%81%97%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">ほしかったもの</a></h3>
<p>主に開発してるのが<a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">CGM系のWebサービス</a>なので、</p>
<ol>
<li>動的なOGP画像などが設定できる(OGP芸)</li>
<li>カスタムドメインが使える</li>
<li>日次のランキング集計などの定期実行ができる</li>
</ol>
<p>が、無料でできて、なるべく実装が楽で、そこまで遅くないのがうれしい。</p>
<h3 id="試した5つのパターン"><a href="#%E8%A9%A6%E3%81%97%E3%81%9F5%E3%81%A4%E3%81%AE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3">試した5つのパターン</a></h3>
<p>試したのは以下の5パターン。試してみた順で記載。</p>
<ol>
<li>Nuxt(SSR) + Cloud Function<br />
起動がかなり遅かった。。実装も大変なのでNG</li>
<li>Nuxt(SPA) + Firebase Hosting<br />
構築はかなり楽。ただ、OGP芸が大変でFunctionsが必要</li>
<li>Nuxt(SPA) + Netlify<br />
プレレンダリングでOGP芸が楽。定期実行はFunctionsでできる</li>
<li>Nuxt(SSR) + GAE(f1:256M)<br />
メモリの制限きつく、たまに落ちる。。定期実行はcron.yamlでできる</li>
<li>Nuxt(SSR) + Heroku(free:512M) + Cloudflare<br />
メモリ多くてよい。SSLはないのでCloudflareを併用。定期実行はHeroku Scheduler</li>
</ol>
<p>SPAで十分であれば、「3.Nuxt(SPA) + Netlify」が構築も簡単で良かった。<br />
<a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、現在この構成。</p>
<p>SSRの場合、「5. Nuxt(SSR) + Heroku(free:512M) + CloudFlare」が良い感じ。<br />
<a target="_blank" rel="nofollow noopener" href="https://hen-ai.net/">へんあいマップ</a>がこの構成。</p>
<h3 id="各パターンについて"><a href="#%E5%90%84%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">各パターンについて</a></h3>
<h4 id="1. Nuxt(SSR) + Cloud Function"><a href="#1.+Nuxt%28SSR%29+%2B+Cloud+Function">1. Nuxt(SSR) + Cloud Function</a></h4>
<p>一番はじめに<a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>でやろうとした構成。</p>
<p><img width="870" alt="スクリーンショット 2020-03-20 11.43.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/7fa5a956-cec1-9117-1d5d-f769eae53a32.png"></p>
<p>細かいやり方は、以下の記事の「Firebase Cloud Functionsの設定してSSRできるようにする」あたりに。<br />
・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/04/02/115149">Nuxt.jsではじめるときのやることリスト(SSRも国際化も自動デプロイも) - くらげになりたい。</a></p>
<p>当時は動的ページのSEO対応するには、この方法が多く検索に出ていたので試したけど、<br />
Cloud Functionのコールドスタートがつらすぎてお蔵入り。。SPAでいくことに。。</p>
<h4 id="2. Nuxt(SPA) + Firebase Hosting"><a href="#2.+Nuxt%28SPA%29+%2B+Firebase+Hosting">2. Nuxt(SPA) + Firebase Hosting</a></h4>
<p><a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>をリリースしたときの構成。</p>
<p><img width="910" alt="スクリーンショット 2020-03-20 11.37.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/37459683-872a-5047-a383-71c33f0c640e.png"></p>
<p>課題だった動的ページのSEOは、Cloud Functionsを経由して返す方法で対応。<br />
こちらも当時よく検索に出てたけど、実装が大変そうだったので2番手に。</p>
<p>細かいやり方は、以下の記事に。(2020/03/22追記: OGP画像生成系の記事を追加)<br />
・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/08/07/150000">Nuxt(SPA)+FirebaseでSEO!OGP!: 特定のパスだけheadだけ返すやつ - くらげになりたい。</a><br />
・<a target="_blank" rel="nofollow noopener" href="https://qiita.com/kira_puka/items/8c1d1240c3aa200cbec0">Nuxt.js(SPA)+Firebaseで積読用の読書管理サービスを作ってみたときにハマったこと - Qiita</a><br />
・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/06/26/194500">Cloud Functions + ImageMagickでOPG画像の動的生成してCloud Storageにアップロードする - くらげになりたい。</a><br />
・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2020/02/19/150000">Cloud FunctionとSVGでOGP画像生成を試行錯誤したまとめ - くらげになりたい。</a></p>
<p>カスタムドメインについては、Firebase HostingでSSLと合わせて無料で設定可能。</p>
<p>定期実行は、Cloud Functionsでできるのでそれを利用した。<br />
・<a target="_blank" rel="nofollow noopener" href="https://firebase.google.com/docs/functions/schedule-functions?hl=ja">関数のスケジュール設定 | Firebase</a><br />
・<a target="_blank" rel="nofollow noopener" href="https://qiita.com/kira_puka/items/1f164dd8d1a5a281d9c1">Cloud Functions for Firebaseのcronみたいな定期実行を試したら簡単だった - Qiita</a></p>
<p>ただ、Cloud Functionsの定期実行は、<br />
「<strong>Googleアカウントごとに3つのジョブ</strong>を無料で使用できる」<br />
なので、注意が必要。<strong>プロジェクトごとじゃない</strong>。。</p>
<h4 id="3. Nuxt(SPA) + Netlify"><a href="#3.+Nuxt%28SPA%29+%2B+Netlify">3. Nuxt(SPA) + Netlify</a></h4>
<p><a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>の現在の構成。</p>
<p><img width="775" alt="スクリーンショット 2020-03-20 11.47.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/5010c13a-98a9-c9e0-ae3b-767d18cd8006.png"></p>
<p><a target="_blank" rel="nofollow noopener" href="https://docs.netlify.com/site-deploys/post-processing/prerendering/#set-up-prerendering">NetlifyのPrerendering</a>が無料化されて使えるようになり、よいという話を聞くように。。</p>
<p>実装が複雑で、変更もしにくかったので、この方法に。<br />
Netlify自体がCDNも提供していているので、すこしはやくなった(気がする)</p>
<p>カスタムドメインも、NetlifyのDNSを設定して無料で対応できる。</p>
<p>定期実行は、2.と同じ感じで、Cloud Functionsのまま。</p>
<p>コード量も減って変更もしやすくなったので、OGP画像の改善とかが楽にできるように。。(<em>´ω`</em>)</p>
<h4 id="4. Nuxt(SSR) + GAE(f1:256M)"><a href="#4.+Nuxt%28SSR%29+%2B+GAE%28f1%3A256M%29">4. Nuxt(SSR) + GAE(f1:256M)</a></h4>
<p>SPAの課題として、初期表示が遅いのでなんとかしたいなと、SSRの環境を模索しはじめ。。<br />
公開していないけど、1つ作ってみた。</p>
<p><img width="798" alt="スクリーンショット 2020-03-20 13.17.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/c24ce0b2-64b3-1ea4-9bd2-e2150ba13d14.png"></p>
<p>試してみたところ、起動するだけでメモリ上限すれすれで、複数アクセスがあったりすると、落ちる場合も。。<br />
(ts-nodeで動かしているのも悪い気がしている。。)</p>
<p><img width="561" alt="スクリーンショット 2020-03-20 12.22.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/e3940627-4141-4c17-3c82-b2ee13ca1e14.png"></p>
<p>ただ、定期実行はcron.yamlを用意すればURLに送信でき、無料範囲も広い。<br />
料金も「<a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/appengine/pricing?hl=ja#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9">その他のリソース</a>」をみるとcronは無料のよう。<br />
・<a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/appengine/docs/flexible/nodejs/scheduling-jobs-with-cron-yaml?hl=ja">cron.yaml を使用したジョブのスケジューリング</a></p>
<p>カスタムドメインやSSLも無料で利用できる感じ。(試してないので未確認)</p>
<h4 id="5. Nuxt(SSR) + Heroku(free:512M) + Cloudflare"><a href="#5.+Nuxt%28SSR%29+%2B+Heroku%28free%3A512M%29+%2B+Cloudflare">5. Nuxt(SSR) + Heroku(free:512M) + Cloudflare</a></h4>
<p>GAEでうまくいかなかったので、無料でメモリも多いHerokuを利用。<br />
<a target="_blank" rel="nofollow noopener" href="https://hen-ai.net/">へんあいマップ</a>がこの構成で稼働中。</p>
<p><img width="885" alt="スクリーンショット 2020-03-20 13.24.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/60f2ab5c-3f4a-9b4b-ac45-341ed99c4667.png"></p>
<p>定期実行は無料のアドオン(<a target="_blank" rel="nofollow noopener" href="https://elements.heroku.com/addons/scheduler">Heroku Scheduler</a>)が利用できる。<br />
Nuxt側で<a target="_blank" rel="nofollow noopener" href="https://ja.nuxtjs.org/api/configuration-servermiddleware/">serverMiddleware</a>を用意すればOK。</p>
<p>ただ、メモリは多く定期実行もが、Herokuの無料枠だと制限も多い。</p>
<ol>
<li>SSLは非対応</li>
<li>30分アクセスがないとスリープする</li>
<li>クレジットカードの登録で1000時間/月xアカウント<br />
(未認証だと550時間/月xアカウント)</li>
</ol>
<h5 id="1. SSLは非対応"><a href="#1.+SSL%E3%81%AF%E9%9D%9E%E5%AF%BE%E5%BF%9C">1. SSLは非対応</a></h5>
<p>単体だけだとSSLに対応していないので、<a target="_blank" rel="nofollow noopener" href="https://www.cloudflare.com/ja-jp/">Cloudflare</a>を併用。<br />
CloudflareがCDNも提供してくれるので良い感じに。</p>
<h5 id="2. 30分アクセスがないとスリープする"><a href="#2.+30%E5%88%86%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A8%E3%82%B9%E3%83%AA%E3%83%BC%E3%83%97%E3%81%99%E3%82%8B">2. 30分アクセスがないとスリープする</a></h5>
<p>これは、Heroku Schedulerを使えばOK。<br />
任意のURLを叩けるため、15分毎などスリープしないようにしておく。</p>
<h5 id="3. 無料枠は1000時間/月xアカウント"><a href="#3.+%E7%84%A1%E6%96%99%E6%9E%A0%E3%81%AF1000%E6%99%82%E9%96%93%2F%E6%9C%88x%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88">3. 無料枠は1000時間/月xアカウント</a></h5>
<p>1000時間あれば、24時間x31日でも744時間なので、大丈夫な感じ。<br />
ただ、アカウント単位での無料枠なので、複数アプリを無料で稼働はできない。。</p>
<h5 id="実際のやりかたとかは、"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AE%E3%82%84%E3%82%8A%E3%81%8B%E3%81%9F%E3%81%A8%E3%81%8B%E3%81%AF%E3%80%81">実際のやりかたとかは、</a></h5>
<p>以下の記事に。<br />
・<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2020/01/25/120000">Heroku+CloudflareなNuxtでSSRしてみる - くらげになりたい。</a></p>
<h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3>
<p>いろいろ試してみたけど、Nuxt.jsを無料で公開するときは、</p>
<ul>
<li>SPAならNetlify
<ul>
<li>prerenderingで動的ページのSEOも対応</li>
<li>カスタムドメインやSSLもNetlifyでOK</li>
<li>定期実行はCloud Functionsで。</li>
<li>ただし、定期実行は1アカウントにつき、3ジョブまで</li>
</ul></li>
<li>SSRならHeroku
<ul>
<li>SSRで動的ページのSEOも対応</li>
<li>定期実行はHeroku Schedulerで</li>
<li>Cloudflareを併用し、SSL対応</li>
<li>無料枠は1アカウントにつき、1アプリが限界かも</li>
</ul></li>
</ul>
<p>SSRの方は他に<a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/run?hl=ja">Cloud Run</a>や<a target="_blank" rel="nofollow noopener" href="https://zeit.co/">ZEIT now</a>がある。<br />
Cloud Runは立ち上げがGAEより遅いときので後手だけど、<br />
ZEIT nowは気になってるので試してみたい(<em>´ω`</em>)</p>
<p>以上!!</p>
<h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%21%21">こんなのつくってます!!</a></h2>
<p>積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!<br />
<a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p>
<p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p>
<p>要望・感想・アドバイスなどあれば、<br />
公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで!</p>
<h3 id="へんあいマップもリリースしました!"><a href="#%E3%81%B8%E3%82%93%E3%81%82%E3%81%84%E3%83%9E%E3%83%83%E3%83%97%E3%82%82%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81">へんあいマップもリリースしました!</a></h3>
<p>「偏愛マップ」を簡単に作れるWebアプリです!<br />
<a target="_blank" rel="nofollow noopener" href="https://hen-ai.net">へんあいマップ</a>も、Nuxt.js+Firebaseで開発してます!</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/63686f5c-390b-0b09-3f9a-0ce6676c3cce.png" width="600"/></p>
<p>偏愛マップは人見知りや口下手な人にも優しいコミュニケーションツールで、<br />
勉強会、懇親会、オフ会などの余興・アイスブレイクや自分のプロフィールにも!</p>
<p>よかったら遊んでみてください(<em>´ω`</em>)</p>
きらぷか@積読ハウマッチ/SSSAPIなど