Google Cloud Platform - Cloud Run
Cloud Run がサーバーレスのキラープラットフォームになるぜ!という某先輩のお言葉に inspire されて使い始める。
Google Cloud Platform - Cloud Run
Quickstart: Build and Deploy は素直に簡単に動いたので、初めての人はやってみることをおすすめする。
Cloud Run てどんな感じ?
何がオイシイか?
AWS Lambda や Azure Functions や Google Cloud Functions はどれもクラウドプロバイダごとの癖があり、どうしても標準化されない。 Serverless Framework で共通管理・デプロイで来たらなぁ、と思っていたときが私にもありました。 Cloud Run はもうちょっと管理できるレイヤーが広がって、 Dockerfile で定義できる範囲は全て自分で書ける。(現時点ではそういうイメージ) だから docker さえわかっていれば (Kubernetes の知識は不要!) とってもとっつきやすくて、後はその上に自分の好きにアプリケーションを定義できる。
(Cloud Functions, App Engine, Cloud Run, Kubernetes Engine, Compute Engine の違いをわかりやすく話している Google Cloud Next ‘19 の movie をどうぞ)
動作イメージ
- pay as it did (cpu and mem @ 100ms granularity)
- SSL termination
- platform: GKE or 完全マネージドの環境を選べる
- 勝手に scale up/down してくれる。 0 にまでスケールダウンする
- どんな言語でも使える
- 構成: express, sinatra, flask など好きな言語に合わせて web サーバを用意し、その裏で自分が好きなようにロジックを組む。
- 開発方法: docker container内でコードを書き、 build して deploy する (build, deploy 部分をローカルでやることでテストもしよう)
だいたいの利用条件 (Container runtime contract から気になるところを抜粋)
0.0.0.0:8080
で HTTP を listen する必要がある (Cloud Run では環境変数でPORT=8080
に固定されるが、 portability のために hard-code はしないほうが良い.${PORT}
を見て動的に listen するポートを決めさせるべき)- リクエストを受けてから 4分以内に http server が稼働しないといけない. 間に合わないと
504 Gateway Timeout
となる - Concurrency: 1つの Cloud Run コンテナインスタンスはデフォルトで複数のリクエストを同時に受けることができるように設定されている (2019/09/20 時点では 80)
- stateless に作る必要がある. ファイルシステムは on-memory であり、書き込み可能だが、コンテナが停止したら吹っ飛ぶ。
ざっくり作り方
- http なコンテナインスタンスを作る
- コンテナイメージをビルドする
- Cloud Build を使う場合のコマンド:
$ gcloud builds submit --tag gcr.io/<project_id>/<image_name>
- ローカルでビルドする場合の手順:
$ dokcer build . --tag gcr.io/<project_id>/<image_name> $ gcloud auth configure-docker $ docker push gcr.io/<project_id>/<image_name>
- Cloud Build を使う場合のコマンド:
- コンテナイメージをデプロイする
- webコンソールからの場合: リンクを見てね. authentication 必須かどうかの toggle を忘れずに。
- cliの場合:
$ gcloud beta run deploy <service_name> --image gcr.io/<project_id>/<image_name> --platform managed # service_name: 自分がつけたいサービス名. 省略すると <image_name> が使われているように見える # --platform: この例では managed cloud run 環境へのデプロイを指定している。
- 出来上がると URL が表示される:
https://helloworld-XXXXXXXX-YY.Z.run.app
みたいな感じ。
Quickstart: Build and Deploy やってみたコマンド履歴 (2019/09/20)
$ gcloud components install beta
$ gcloud components update
$ gcloud config set project <my_project_id>
$ gcloud config set run/region asia-northeast1
# cloud run を動かせる好きなリージョン選ぼう。
# 候補:
# asia-northeast1
# europe-west1
# us-central1
# us-east1
# ここまでは必要ならやるって感じ。 cli tool が入っていなければとか、専用の project を作っているなら、とか。
$ mkdir cloudrun-tutorial
$ cd cloudrun-tutorial
$ git clone https://github.com/knative/docs.git
$ cp -rp docs/docs/serving/samples/hello-world/helloworld-nodejs .
$ cd helloworld-nodejs/
$ code .
# ただ中身を眺めたいだけ
$ gcloud builds submit --tag gcr.io/<my_project_id>/helloworld
Creating temporary tarball archive of 7 file(s) totalling 21.1 KiB before compression.
Some files were not included in the source upload.
Check the gcloud log [/Users/hogehoge/.config/gcloud/logs/2019.09.19/23.57.02.733438.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).
Uploading tarball of [.] to [gs://<my_project_id>_cloudbuild/source/hogehoge.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/<my_project_id>/builds/hogehoge].
Logs are available at [https://console.cloud.google.com/gcr/builds/hogehoge?project=hogehoge].
------------------------------------------------ REMOTE BUILD OUTPUT -------------------------------------------------
...
...
latest: digest: sha256:hogehoge size: 2201
DONE
----------------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
1bc3175d-0be3-hoge-hoge-93a5c201bf18 2019-09-19T15:04:52+00:00 34S gs://<my_project_id>_cloudbuild/source/hogehoge.tgz gcr.io/<my_project_id>/helloworld (+1 more) SUCCESS
$ gcloud beta run deploy --image gcr.io/<my_project_id>/helloworld --platform managed
Service name (helloworld): # この名前で良いので Enter だけ押す
Allow unauthenticated invocations to [helloworld] (y/N)? # とにかく試すなら認証不要のy
Deploying container to Cloud Run service [helloworld] in project [<my_project_id>] region [asia-northeast1]
✓ Deploying new service... Done.
✓ Creating Revision...
✓ Routing traffic...
✓ Setting IAM Policy...
Done.
Service [helloworld] revision [helloworld-00001] has been deployed and is serving 100 percent of traffic at https://helloworld-hogehoge-an.a.run.app
# deploy 出来たので、試しにアクセスしてみる
$ http GET https://helloworld-hogehoge-an.a.run.app
HTTP/1.1 200 OK
Alt-Svc: quic=":443"; ma=2592000; v="46,43,39"
Content-Length: 12
Date: Thu, 19 Sep 2019 23:05:15 GMT
Server: Google Frontend
X-Cloud-Trace-Context: hogehoge;o=1
content-type: text/html; charset=utf-8
etag: W/"c-hogehoge"
x-powered-by: Express
Hello World!
# やったね!
Google Container Registry API とか Cloud Run API を有効化しないと進まないが、適宜 Error message に従えば自然とそれをやることになる