一銭も払わずにクラウド上でWebサービスを公開する(2021/02時点)

# これはなに？
Webサービスを開発する際に使えるサービスのうち、無料枠があるものをまとめました。
自分でちょっとしたWebサービスを作ろうと思ったときに一銭も払いたくないなという気持ちがあるが、そもそもどの程度までちゃんとした構成が取れるんだっけというのをこれまでに100万回調べている気がするので自分用にまとめたメモです。
前提として、基本的にはAWSとGCPを対象に調べて、一部はそれ以外のサービスも追加で調べている、という感じです

# 最初に結論
- 「無料でWebサービスを提供する」というところだけに集中するならAWSよりはGCPのほうが良さそう(ハードルが低そう + できることが多そう)
    - 無料枠だけで完結させるならherokuはSQLも使えるし視野に入れて良さそう
- ドメイン周りだけはどうにもならないので諦めてお金を払うか各クラウドサービスのドメインのまま使いましょう
- 無料の範囲内で最低限のWebサービスのためのアーキテクチャ(アプリケーションサーバ/DBサーバ/静的ファイルストレージ)の例について考えてみたものを一番下に書いてあります

# まず最初に見ると便利なページ
- AWS、GCPは両方とも何が無料で使えるのか全部リストにしてくれていて便利
  - AWS: https://aws.amazon.com/jp/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc)
  - GCP: https://cloud.google.com/free?hl=ja

# 2大クラウドサービスの一般的な無料枠の概念について
AWS、GCPはそれぞれ

- 契約してから1年は無料で使える枠
  - AWSは各サービスごとに細かく定められています
  - GCPは$300の範囲まではどれだけ使ってもいいよ～という感じ
- 毎月必ずついてくる無料枠

の2つがあり、基本的には後者があるものを「(一定の範囲内で)無料で使える」とみなしています

# ある程度の範囲まで無料で使えるサービスたち

## コード投げつけたらいい感じに動かしてくれるやつら(heroku的PaaS)
- GAE
    - インスタンスクラスが「F」の場合は1日あたり28時間まで(つまり2インスタンス以上使わないと余る)、「B」の場合は1日あたり9時間まで無料
    - その他ログやらデプロイやら結構いろいろな無料枠の制限があって、普通にやってる分にはそこまで気にならないと思いますが脚注のリンク先(公式ページ)で詳しく見ておくと良いです[^gae]
- beanstalkは単体で動くPaaSではなく、他のコンポーネントのプロビジョニング/運用のためのサービスなので比較はできない[^beanstalk]
- heroku
    - クレジットカード番号を入力した認証済みアカウントだとweb, workerなどで共有のdyno(アプリケーションコンテナのインスタンス)の時間が毎月1000時間付与されます[^heroku]
    - リクエストがないと30分で休止し、時間が節約されます

[^gae]: https://cloud.google.com/appengine/pricing?hl=ja
[^beanstalk]: 「ボンネットを開けられる」(https://www.atmarkit.co.jp/news/201204/25/aws.html )というかボンネットの中身丸見えなbeanstalkをこのラインナップに並べるのはちょっと違和感があるが、まあ一般的にbeanstalkはPaaSとして扱われてそうなのでこの枠で言及しました
[^heroku]: https://jp.heroku.com/free


## 任意のdockerコンテナ動かすPaaS
- Cloud Runは1GiBまで無料枠がある[^cloudrun]
- GAE FlexibleEnvironment、ECSは無料枠はありませんでした。

## データベース
いわゆるNoSQLは継続的に無料で使えそう。herokuだけは無料枠があるPostgreSQLがあります

- RDS: 最初の1年の無料枠以外はなし
- Cloud SQL: 無料枠なし
- DynamoDB
    - 25GBまでは無料で、その他操作の回数などに制約がある
    - どこまでが無料になるのかが若干難しいので[ドキュメント](https://aws.amazon.com/jp/dynamodb/pricing/)を読むと良いです
    - ざっくりいうと `Provisioned Capacity mode` の方にだけ読み書きの無料枠があり、読み書きの容量/秒間の操作回数に制約がある形です
    - キャパシティユニット(容量等の制約については [クラスメソッドさんの記事](https://dev.classmethod.jp/articles/optimize-costs-of-dynamodb/) も参考になりそう
- Firestore: 1GBまでは無料
- Heroku: 1万レコード&1GBまで、同時接続数が20までなどの制約がありますが毎月99.5%は動くようです(つまり毎月0.5%≒4時間くらいは止まる)[^herokusql]

[^cloudrun]: https://cloud.google.com/run/pricing?hl=ja
[^herokusql]: https://elements.heroku.com/addons/heroku-postgresql

## 関数系
- AWS lambda: 100万回までの呼び出しは可能
- Google Cloud Functions: 200万回の呼び出しまで無料

## Storage
- Google Cloud Storage: 5GBまで無料
- S3は無料枠がありませんでした。

## CDN
調べた範囲では継続的に無料で使えるものはありませんでした

- Fastly: $50までの(多少の機能制限もあるが)無料枠がある[^fastly]
- CloudFront: 契約して最初の1年間の無料枠があるが、それ以外に毎月の無料枠はない[^cf]
- Cloud CDN(+ Cloud Load Balancing): 無料枠なし[^ccdn]

[^fastly]: https://docs.fastly.com/ja/guides/accounts-and-pricing-plans
[^cf]: https://aws.amazon.com/jp/cloudfront/pricing/ 
[^ccdn]: https://cloud.google.com/cdn/pricing?hl=ja

# まとめ/構成例
とりあえず無料で使えるサービスで、ドメイン周り以外は揃うことがわかりました。
なので構成としては以下のような感じぐらいまでが無料の限界かなと思います。
無料枠の範囲内の柔軟性はGCPのほうが上かなという感じです。

## GCP
- アプリケーションサーバ: GAE
- DB: Firestore
- ストレージ: Cloud Storage

## AWS
- アプリケーションサーバ: lambda
- DB: DynamoDB(provisioned capacity mode)
- ストレージ: 無料枠がないのでcloud storageとかに逃がすしかなさそう

## heroku
- アプリケーションサーバ: heroku(固有のサービス名が振られてないので適当)
- DB: postgresql
- ストレージ: なさそう https://devcenter.heroku.com/ja/articles/active-storage-on-heroku