GAEの無料枠についてのメモ（2023年11月現在）

# 免責

自分用のメモの公開です。記述内容に一切の責任を負えません。
また料金体系の変更に応じてこの記事内容を更新する予定もありません。
料金に関する話なので、最終的な確認は全てご自身でお願いいたします。

# 背景

GAE、無料枠がパッと見で分かりにくいのでまとめる。

# 結論

- 無料もしくはできる限り安くしたい場合、スタンダード環境を選択する。
- 1日中動かす場合でも、Fクラスのインスタンスを選ぶと1インスタンスであれば無料枠（28インスタンス時間/日）に収まる。
- Fクラスを使う場合、スケーリングは自動になる。app.yml 内の automatic_scaling で min を 0、 max を 1 にしておくと、無料枠に収まりやすいはず。
- ネットワーク転送料の無料枠が1GiB/日なので、ここが用途にとってどうなのかを検討した方が良い。
- その他は使う機能による。

# 環境ごと

https://cloud.google.com/appengine/docs/the-appengine-environments?hl=ja

> スタンダード環境は、次の特性を持つアプリケーションに適しています。
> - 無駄な投資を抑え、無料または低コストで運用することを目的としている。たとえばトラフィックがない場合、アプリケーションを 0 インスタンスにスケーリングできます。

# スタンダード環境

https://cloud.google.com/appengine/docs/standard?hl=ja#quotas_and_limits

> スタンダード環境は、1 GiB のデータ ストレージとトラフィックを無料で提供

# リソース別

基本的にはこの割り当てと上限のページに無料枠の記載もある。
気になったらこのページを見る。

https://cloud.google.com/appengine/docs/standard/quotas?hl=ja

> 無料の割り当て: アプリケーションには、無料で利用できるリソースの量が設定されます。無料の割り当ての詳細については、このページのリソース セクションをご覧ください。アプリケーションが無料の割り当てを超えると、そのリソースの追加使用に対して料金が請求されます。

※課金が発生する制限のみ記載
※基本的に無料枠についての制限のみ記載。課金が発生する制限で無料枠が無いものは恐らくメールのみ...？メールなりタスクキューなり、機能として課金がありそうなものを使う際は個別にしっかり見た方が良い。
※ストレージなどの積み上げではない値で単位が無い場合は基本的に日毎の値のはず。


|    リソース    |    上限   |
| ------ | -------- | 
| インスタンス時間（F） | 28インスタンス時間/日 |
| インスタンス時間（B） | 9インスタンス時間/日 |
|  アプリごとのサービス数      |      5    |
|  アプリごとのバージョン数      |      15    |
|  手動/基本スケーリングを適用するバージョンごとのインスタンス数   |      20    |
|  アプリごとのバージョン数      |      15    |
| デフォルトの Cloud Storage バケットに保存されるデータ | 5 GiB |
| デフォルトの Cloud Storage バケットでのクラス A オペレーション | 20,000回/日 |
| デフォルトの Cloud Storage バケットでのクラス B オペレーション | 5,000回/日 |
| デフォルトの Cloud Storage バケットからのネットワーク送信（下り、外向き） | 1GiB |
| Blobstore の保存データ | 5GiB |
| コードと静的データの保存 | 1GB |
| Datastore（保存データ） | 1GiB |
| Datastore（エンティティの読み込み） | 50,000 |
| Datastore（エンティティの書き込み） | 20,000 |
| Datastore（エンティティの削除） | 20,000 |
| デプロイに使用するイメージの保存サイズ | App Engine 特有の無料枠なし。[Artifact Registryの無料枠](https://cloud.google.com/artifact-registry/pricing?hl=ja)に準拠？（Container Registry？）  |
| ログ | [Google オペレーションスイートの無料枠](https://cloud.google.com/stackdriver/pricing?hl=ja)に準拠 |
| メール | 無料枠なし |
| リクエスト（通信量） | [1GB/日](https://cloud.google.com/appengine/docs/standard/quotas?hl=ja#Requests) |
| 検索（ストレージ合計） | 0.25GB |
| 検索（クエリ） | 1,000クエリ/日 |
| 検索（インデックスへのドキュメントの追加） | 0.01GB/日 |


# app.yml による指定

https://cloud.google.com/appengine/docs/standard/go/config/appref?hl=ja

```app.yml
# インスタンスクラスの明示的な設定。デフォルト値は F1
instance_class: "F1"
# Fクラスを使用する場合は自動スケーリングのみサポートされている
automatic_scaling:
  min_instances: 0
  max_instances: 1
  min_idle_instances: 0
  max_idle_instances: 1

```

# クリーンアップ

https://cloud.google.com/appengine/docs/standard/python3/building-app/cleaning-up?hl=ja

## 「アプリを無効」でリクエストを受け付けない状態にできる

「App Engine > 設定」でアプリを無効にすることでリクエストを受け付けない非公開状態にできる。
いつでも同じ状態から再開できるが、使用している割り当て分で有料枠に該当する課金は止まらない。新しいリクエストは来なくなるので、とりあえず使わなくて無駄な出費をかけたくない場合は止めておいても良いかも。

（「課金を無効にする」っていう選択肢がこのページに書いてあるけど、単純に請求アカウントを停止するということなのでGAEに限らずその請求アカウントに紐づく全ての有料枠の利用が停止されるので注意。）

# 現状の確認

## インスタンス数

[App Engine > バージョン](https://console.cloud.google.com/appengine/versions)にインスタンス数の推測値の列がある。

## インスタンスクラス

[App Engine > バージョン](https://console.cloud.google.com/appengine/versions)の一番右に「構成」という列があり、行の「表示」リンクをクリックするとそのバージョンの設定値を見ることができる。そこに `instance_class: F1` のようにインスタンスクラスの記述がある。

## その他

- ダッシュボード
  - [App Engine > ダッシュボード](https://console.cloud.google.com/appengine?serviceId=default&hl=ja)
- 各種割り当て
  - [App Engine > 割り当て](https://console.cloud.google.com/appengine/quotadetails?hl=ja)
- メールの使用状況
  - [IAMと管理 > 割り当て](https://console.cloud.google.com/iam-admin/quotas?hl=ja)