比較対象サービス
今回は静的webホスティングサービスの選択肢として頻繁に目にする以下のサービスについての比較を行います。
- Netlify
- AWS Amplify console( ≒ s3 + cloudfront )
- firebase hosting
- Github Pages
-
Azure Static WebApps
(+Vercel。気が向いたら詳細追記します)
結論
Github Pages
またはVercel
が良さそう
後述しますがNetlify
はレスポンス性能の観点から敬遠した方が良いかと思われます(Pro版は解消されているのやも。ドキュメント読むに)
比較基準
「個人ブログ、サービスのホスティング」に焦点を当てて評価します。
評価における優先順位は
コスパ/レスポンス速度 > 堅牢性/可用性
とします
評価方法
- 機能(コストや無料枠)
- デプロイ ~ CIパイプライン構築までの手軽さ
- レスポンス
を各々評価します。
計測はNuxt + Contentfulで作ったブログアプリケーションをデプロイした上でapach bench + lighthoueにより計測します
基本性能比較
プロバイダー | 自動デプロイ | 帯域幅(無料) | CDN | ストレージ(無料) | プレビュー環境 |
---|---|---|---|---|---|
Azure Static Web Apps | ○ | 100GB | x | 0.5GB | ○ |
Amplify Console | ○ | 0 | ○ | 15GB | ○ |
Firebase Hosting | ○ | 10GB | ○ | 1GB | ○ |
Netlify | ○ | 100GB | ○ | 10GB | ○ |
Github Pages | x | 100GB | ○ | 1GB | x |
カスタムドメイン、SSL/TLS対応は当たり前の様に付いていたので除外しました。
注目したいポイントは「帯域幅、CDN、自動デプロイの有無」あたりでしょうか。
パッと見Netlify
が抜けていて、継いでStatic Web Apps
、Github Pages
が良い感じに見えますね。
Static Web Appsに関してはCDNが無い点、ストレージ要領が少ない点が気になりますが
- 近くのエッジロケーションから配信している
- 個人開発SPAアプリケーションのビルド後アセットが0.5GB超える事まあ無い(はず)
のでそこまで大きなマイナスには感じられませんでした。
同様にGithub Pages
も自動のCICDパイプラインこそサポートされていませんが、Github Actions
と併用すれば解決する為大きなマイナス要素ではないと考えられます
レスポンス比較
最後に各サービスのレスポンスを比較します。比較にはLighthouse
とapache bench
を使います
プロバイダー | Light House Performance | AB (time per request) | AB(Transfer rate) |
---|---|---|---|
Azure Static Web Apps | 97 | 94.133 | 30.77 [Kbytes/sec] |
Amplify Console | 98 | 55.795 | 55.38 |
Firebase Hosting | 99 | 114.294 | 26.75 |
Netlify | 90 | 157.934 | 17.94 |
Github Pages | 94 | 65.634 | 51.17 |
プロバイダー | AB (time per request) | AB(Transfer rate) |
---|---|---|
Azure Static Web Apps | 94.133 | 30.77 [Kbytes/sec] |
Amplify Console | 55.795 | 55.38 |
Firebase Hosting | 114.294 | 26.75 |
Netlify | 157.934 | 17.94 |
Github Pages | 94 | 65.634 |
Github Pages
のlighthouseパフォーマンスがabと比較して悪いのは殆どキャッシュ設定してないからだと思います。まあLighthouseは多少ブレるので目安程度にお願いします
目立つポイントとしては
-
Amplify Console
が最高値でNetlify
が最低値 - CDNが懸念点だった
Azure Static Web Apps
の性能が2番手 ~ 3番手
あたりでしょうか。
特にNetlify
の性能の悪さは以外でした。スループットも抜群に悪いです。
調べたところNetlifyは遅いで言及されていて
Netlify の無料プランの場合、CDN は世界で 8 箇所しかなく、日本は含まれていない
らしいです。それにしても遅い気がする。
性能を追求したいならAmplify Console
、Github Pages
が良さそうですね。
まとめ
基本的にGithub Pages | Vercelがお勧めです。性能を求めるならaws
また、VScodeユーザーであればStatic Web Apps
も良さげ。機能面は網羅的にサポートされていますし、何より開発体験が良い感じ
修正等御座いましたら是非教えていただけると幸いです!
おまけ: デプロイ/CICDの比較
各サービスの特徴、デプロイフローを軽くさらっていきます
Netlify
- 100GBの無料帯域幅、10GBのストレージ
- CDN標準搭載
- Lambdaをラップしたサーバレス環境の構築
- シンプルなUI
更に有料プランに加入すれば
- adn(cdnより凄いらしい)
- 10倍の帯域幅/ストレージ
- 認証機能やフォーム機能
が使える様になります。**安い!上手い!早い!**みたいなサービス
デプロイフロー
$ npm install netlify-cli -g
$ netlify login
$ netlify init
$ netlify deploy
$ netlify deploy --prod
netlify deploy
でプレビュー環境が作成され、deploy --prod
で本番環境に以降します
コマンドも直感的で分かり安いですよね。
GUIの場合もNew site from Git
ボタンからスルスル設定できてしまいます
github等のレポジトリーと連携させる事で自動でCICDパイプラインも作ってくれます
これ以上省くところがないくらいシンプルで良いですね。
Amplify console
awsで静的webサービスをホスティングする一般的なワークフローをAmplifyを使って簡略化してくれるサービスです。
- s3 + cloudfrontによるホスティング
- githubやcode commitと連携させたCICDパイプラインの作成
- プルリクエストのプレビュー環境
- パスワード保護
- ワンクリックのカスタムドメイン設定
等の機能がサポートされています。
料金体系は
1年間の無料枠の後、従量課金に代わり転送量は100GB当たり1200円前後掛かってしまうみたいですね。ただ実際使っていた感覚としては幸か不幸か3ドル前後の範囲に収まるんじゃないかな〜と思います()
デプロイフロー
こちらの記事(AngularのアプリをAmplifyでホスティングしてみた)が凄く参考になりました
まずプロジェクトを作成します。GET STARTEDのHost Your Static Web Appをクリックすれば自動で飛びます
好きなプロバイダーを選んだら指示に従いレポジトリとブランチを選択した後ビルド設定を行います
amplify.yaml
はamplifyの設定ファイルでビルドコマンド等はこのファイルで定義します。さっそく書き換えたい所ですが、初回デプロイでは編集できない様です。一旦スルーしてそのままデプロイします。
2~3分待つとデプロイが完了しエンドポイントにアクセス出来る様になります。が、まだAccess Denied
の画面が表示されるだけなのでメニューのビルド設定から先ほど言及したamplify.yaml
を書き換えます
再度デプロイしてデプロイフローは完了です。
cloud front + s3 + cicdパイプライン
が自動構築されている!と考えると優秀ですが、個人開発アプリのホスティングという用途には適していないですね。多機能さがあだになってる気がします。cliで完結出来ない、デプロイが長過ぎる、無料枠が限定的 な点も不満です。
「静的ホスティングサービスを使いたい」ではなく「awsのサービスを使いたい」場合には滅茶苦茶便利なサービスだと思います。
github pages
GitHub Pages は、GitHub のリポジトリから HTML、CSS、および JavaScript ファイル を直接取得し、任意でビルドプロセスを通じてファイルを実行し、ウェブサイトを公開できる静的なサイトホスティングサービスです
Netlifyと同じくくLet's Encrypt
を使ったssl/tlsに対応しており、cdnも無料で使えます。
デプロイフロー
github pagesのエンドポイントはhttp://<username>.github.io/<repository-name>
の形式になるらしく、カスタムドメインを使わない場合はnuxt.config.js
に以下の設定を加筆する必要があるみたいです。
export default {
target: 'static',
router: {
base: '/<repository-name>/'
}
}
後はデプロイします
npm install push-dir --save-dev
"scripts": {
"deploy": "push-dir --dir=dist --branch=gh-pages --cleanup"
}
これでorigin/gh-pages
にdist以下がデプロイされます。githubレポジトリーのPagesからエンドポイントが参照できるはずです。
次にcicdパイプラインの構築ですが、github actions
を使う事で簡単に設定する事ができます。
githubリポジトリのActions
をクリックし.github/workflows/xx.yaml
を編集しましょう
name: cd
on:
push:
branches:
- master
jobs:
cd:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- name: Install dependencies
run: npm install
- name: build && export
run: npm run build && npm run export
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
peaceiris/actions-gh-pages@v3
がgithub pagesにデプロイする為のactionで、publish-dir
に設定したdirectory(nuxtならdist
)をgh-pages
ブランチにデプロイしてくれます。
後はcommitして終わりです。
自動のCICDはサポートされていませんが、github actions
との連携が簡単なので気になりませんでした。全てがgithub上で完結する点も管理が楽で良い感じです。
ただカスタムドメインを使わない場合はroutingにbase urlを設定する必要が有ったり、yaml書く面倒までは省けないという事でnetlifyには一歩劣るかな〜
firebase hosting
GCPのfirebaseが提供するホスティング機能です。デフォルトでCDNが搭載されています。
デプロイフロー
$ firebase login
$ firebase init
...
? What do you want to use as your public directory? dist
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
? Set up automatic builds and deploys with GitHub? Yes
? File dist/index.html already exists. Overwrite? No
...
? For which GitHub repository would you like to set up a GitHub workflow? (format: user/repository)
? Set up the workflow to run a build script before every deploy? Yes
? What script should be run before every deploy? npm install && npm run build && npm run export
? Set up automatic deployment to your site's live channel when a PR is merged? Yes
? What is the name of the GitHub branch associated with your site's live channel? master
✔ Firebase initialization complete!
これでプロジェクトとcicdパイプラインが作成されます。後はdeployするだけです。
$ firebase deploy --only hosting
ホスティング完了です。CICDパイプライン整備されている為当然git push origin master
でも更新できます。
又、プレビュー環境も用意されていてpull requestを出すと自動で一時的なプレビュー環境を立ち上げてくれます。cliからも以下のコマンドでプレビュー環境を作成する事ができます。
$ firebase hosting:channel:deploy preview
cliで完結する点、cicdの自動生成、プレビュー環境と文句なしです。netlifyと同じくらいデプロイしやすいです。コンソール画面はこっちの方が優れてるかな?
Azure Static Web Apps
最近GAとなったAzureの静的webホスティングサービス
- GitHub Actions又はAzure DevOpsを使ったCICDパイプラインの自動構築
- Azure Functionsと連携する事でサーバレスなバックエンドAPIを利用可能
- 無料SSL証明
- Firebase的なルーティング規制
- swa cliによるローカル開発
- カスタム認証機能
と、機能面で言えばここまで紹介した他プロバイダーと同程度のサービスを提供している様に思います。特にfirebaseとの類似点が多いな〜って印象です。
マイナス点としてはCDNが存在しない点ですが、クライアント近くのエッジから配信されるみたいなので気にならないと思います。後述しますが普通に早いです。
デプロイフロー
ドキュメント的に推しっぽいVscodeの拡張機能を使ってみます。nuxtの方にも既にstatic web apps用のクイックスタートが用意されていました。
まずデプロイ準備としてpackage.json
のbuild
コマンドにビルドに必要なコマンドをまとめます。どうやらstatic web appsはデフォルトでnpm run build
コマンドを実行するらしく、他のコマンドを使う際は別途設定が必要になるみたいです。
"scripts": {
"build": "NODE_ENV=production nuxt build && NODE_ENV=production nuxt export",
}
次にvscodeの拡張機能を使います。
サイドバーにAzureのロゴがない場合はコマンドパレットからazure static web apps
と打ち込んでinstallしてください。
ロゴが表示されたらクイックスタート通りazureロゴ => +ボタンを押します。
するとアプリ名、location、framework、root path、ビルド先のフォルダ名を聞かれるのでそれぞれ入力。frameworkにnuxt
がなかったので私の場合はvue
を選択しておきました。
これだけでリソース作成からgithub actions
のyamlファイルの作成まで終わってるみたいです。少し待つとデプロイが終わり、リソースを右クリック => browse siteでエンドポイントが表示されます。
vscodeユーザーなら対話型のcliより楽にデプロイ出来ますね
デプロイフローまとめ
Netlify
、 Static Web Apps
、Firebase
がかなりお手軽でした。特にStatic Web AppsのVscode拡張機能は良い差別化だと思います。