Google Cloud Run の個人的なQ&A（2021年2月現在）

CloudRunを使う機会があったので、何ができるのか、自分の中で沸いた疑問ベースで調べたメモです。
私が調べただけなので、間違ってる可能性が十分にございます、ご注意ください。
また、CloudRunは新機能がどんどん出ているサービスなので、情報が古くなっている可能性もあります。

正確で最新の情報が欲しい場合は、公式ドキュメントを参考にしてください。
https://cloud.google.com/run

*CloudRunには、デプロイのプラットフォームとして、フルマネージドとAnthosの2種類がありますが、ここではフルマネージドの話をしています

# Q&A
## Google Cloud Runってどんなサービス？

- コンテナをデプロイできるフルマネージドのサーバーレスなサービス
- コンテナはどこかのポートでHTTPリクエストをリッスンしておけばよい
- http(s)リクエストか、Pub/Sub イベント経由で呼び出しできる
- スケーリングもしてくれる
- 課金対象は100ミリ秒単位で実行した時間のみ

## 料金体型は？無料枠は？
- 公式ドキュメント
    - https://cloud.google.com/run/pricing?hl=ja
- 100m秒単位で処理に使ったリソース分に対してのみ課金
- 無料枠もある
- ただし、後述する `最小インスタンス数` の設定によりアイドル状態のインスタンスは処理してなくても課金が発生する
    - シチュレーターで計算したところ、アイドル状態のインスタンスを1台アイドル状態にしておくと、¥850/月ほどかかるみたい（asia-northeast1, 1vCPU, 256MiBの場合)
    - https://cloud.google.com/products/calculator#id=c373f061-391a-49b9-a566-44e33e209f97

## リソース調整どんくらいできる？
- CPU 1~4
- memory 128MiB ~ 8GiB
- インスタンスは0台~1000台までスケール可

（半年ぐらい前まではメモリが最大2GiBだったと思うので、すぐにもっと幅広がるかも）

## 外部のネットワークからどうやってアクセスできるの？
- デフォルト設定でデプロイすると、自動でドメインが割り当てられるので、いきなりどこからでもアクセス可能
- カスタムドメインを設定することもできる
- デフォルト設定ではIPアドレスの制限とかはできない

## 任意のVPCネットワーク内にデプロイできるの？

- 無理
- サーバーレスVPCアクセスコネクタを使うと、VPCに接続することはできる
    - https://cloud.google.com/run/docs/configuring/connecting-vpc?hl=ja

## CloudRunで実行してるコンテナにSSH接続ってできるの？（踏み台として使いたい）

- 機能としては提供されていない
- 以下の記事を参考にすれば、ハック的なssh接続はできるかもしれない（試してない）
    - VMインスタンスから
        - https://binx.io/blog/2020/04/25/how-to-login-to-a-google-cloud-run-container/
    - herokuから
        - https://github.com/matti/google-cloud-run-shell


## コンテナ数を0にしないことは可能？

- 可能
    - https://cloud.google.com/run/docs/configuring/min-instances?hl=ja
- `最小インスタンス数` を1以上にすればOK
    - `最小インスタンス数`を1以上にするとアイドリング状態に対する課金をされます


## CloudRunからVPCに接続できるの？

- サーバーレスVPCアクセスを利用すれば可能
    - https://cloud.google.com/run/docs/configuring/connecting-vpc?hl=ja

## サーバーレスVPCアクセスって？

- GoogleCloudのサーバーレス環境からCompute Engine VM インスタンスや Memorystore インスタンスなど、内部 IP アドレスを持つリソースにアクセスできるようになる
- GoogleCloudのサーバーレス環境とは、Cloud Run（フルマネージド）、Cloud Functions、または App Engine スタンダード環境のこと
- サーバーレスVPCアクセスをするには、サーバーレスVPCアクセスコネクタを作成する

## 外向きのIPアドレスってどうなってるの？
- https://cloud.google.com/run/docs/configuring/static-outbound-ip?hl=ja
- Googleの動的IPアドレスプールから自動的にIPアドレスが割り振られて、インターネットの外部エンドポイントに接続する
- 自分で作成した静的IPアドレスを割り振ることはできない

## 外向きのIPアドレスを固定したい場合はどうすればいいの？
- https://cloud.google.com/run/docs/configuring/static-outbound-ip?hl=ja#route-cloud-run-traffic
- 静的IPアドレスを設定したCloudNATを経由する必要がある
- CloudNATを経由するには、CloudNATが構成されているVPCネットワークを経由する必要がある
- CloudRUNからVPCネットワークを経由するには、サーバーレスVPCアクセスコネクタが必要


## アクセスIPの制限とかできるの？
- 可能
- `使用可能な上り（内向き）設定` で `内部負荷分散とクラウド負荷分散（ベータ版）` を選択すればロードバランサー経由のリクエストを受け付けられるので、CloudArmorで設定できると思われる
- https://cloud.google.com/run/docs/securing/ingress?hl=ja
- サーバーレス ネットワーク エンドポイント グループという機能を使ってもできそう
    - https://cloud.google.com/load-balancing/docs/negs/serverless-neg-concepts
    - サーバーレス NEG は、Cloud Run、App Engine、または Cloud Functions サービスを指す
    - CloudRunやGAEなどのサーバーレスアプリケーションの前段にLoadBalancerをおける
    - なので、CloudRunとGAEを同時に扱ったりできる
    - LoadBalancerをおけるので、CloudArmorの設定とかできる
    - まだ出たばかりのサービスなので制限事項が多い
        - https://cloud.google.com/load-balancing/docs/negs/serverless-neg-concepts#limitations

## 非公開にデプロイできるの？
- 可能
- `使用可能な上り（内向き）設定` で `社内（ベータ版）` を洗濯すれば、プロジェクト内からのリクエストのみがサービスにアクセスできるようになります

## 他の内部サービスからCloudRunのインスタンスにアクセスできるの？
- 可能
- https://cloud.google.com/run/docs/securing/ingress?hl=ja#internal-services
- VMインスタンスからのリクエスト、同じプロジェクトのVPCネットワーク内で実行されている他のリソースからのリクエストの場合は、CloudRunをデプロイ後に発行される公開URLでアクセスできる
- 勝手に内部からのアクセスに分類してくれるらしい
- 次のサンプルを見ると、CloudRun同士で通信しながらサービスを提供している
    - https://cloud.google.com/run/docs/tutorials/secure-services?hl=ja#limitations_or_non_goals_of_this_tutorial

## マイクローサービス的なことできるの？
- 可能
- 非公開のCloudRunも起動できるし、内部のサービスとも通信可能
- 次のサンプルが参考になりそう
    - https://cloud.google.com/run/docs/tutorials/secure-services?hl=ja#limitations_or_non_goals_of_this_tutorial

## ワーカー的な使い方できるの？
- 可能
- CloudTaskと組み合わせて使える
    - https://cloud.google.com/run/docs/triggering/using-tasks
- ポートをリッスンするようなアプリケーションにしておく必要はある
- スケールは簡単にさせられる
- たぶんCloudRunのDeadlineが最大で60分なので、実行に時間のかかるタスクは厳しいかもしれない
    - Cloud Tasks, Cloud Scheduler から Cloud Run を起動した時の Deadline が 30分になるらしい

## ポートをリッスンしてないアプリケーションをデプロイしたらどうなる？
- エラーするので、デプロイできませんでした
- どんな公開設定でもデプロイできませんでした

## 静的コンテンツを配信する機能ある？
- ない
- GAEにはStatic Contents Serverという機能があり、html, jsなどを配信することができる
- Firebase Hostingを使うパターンはできる
    - https://firebase.google.com/docs/hosting/cloud-run?hl=ja
- サーバーレス NEGを用いて、パスでバックエンドサービスを振り分けて対応するパターンも出来そう
    - /api/*の時はCloudRunへアクセス
    - その他の場合はGAEのStaticContentsServerとか、GCSとかにアクセス
    - 的な感じかな？


# その他参考になりそうな記事など
- CloudRunの開発者が管理してる非公式のFAQ
    - https://github.com/ahmetb/cloud-run-faq#how-is-it-different-than-app-engine-flexible
    - わかりやすいが、ちょいちょい情報古い
- Google On AirでのCloudRun紹介
    - https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-cloud-run-deep-dive-gcp-2019912
    - CloudRunの使い方をイメージしやすいかもしれない
    - しかし、こちらも情報はやはり古い
- GAEとの比較記事
    - https://zenn.dev/sinmetal/articles/appengine-vs-cloudrun
    - こちらは情報新しい（今は）

# 所感
- GAEやCloudFunctionと違ってコンテナ使えるのがうれしい
- 実行してない時はお金掛からないので、開発環境とか作ってもお金気にならないのでうれしい
- CloudFunctionでマイクローサービス＆ワークフロー管理すれば、個人開発者にかなりうれしいのではないだろうか
- 静的コンテンツの配信できないのがネック
- ポートを必ずリッスンするコンテナにしないといけないのでネック

# 最後に
まだ調べれてないことや疑問もあるので、随時更新するかもしれません。
（Pub/Subイベント経由での呼び出しとか）
これからCloudRunでなんか作ろうと思ってるので、知見を追記するかもしれません。

私の解釈が間違っていたり、情報が古くなっている場合は、コメントで教えていただけると嬉しいです！