Google Cloud Next 2019 in San Franciscoで発表、リリースされ1ヶ月ぐらい経ったCloudRunですが、気になっていたので触ってみました。
CloudRunにはCloudRunとCloudRun on GKE 2種類の動作モードがありますが、今回はCloudRunを使ってみました。

CloudRunとは?

Googleがオープンソースで公開しているKnativeをベースとしたフルマネージドなサーバレスコンテナ実行環境です。

  • KubernetesやKnativeのように設定を管理するためのyamlファイルなどは必要無い
  • コンテナのスケール設定は全自動
  • デプロイはコマンド一発でBlueGreenデプロイ

LambdaやCloudFunctionなど既存のFaaSとの違い

  • FaaSはコードを予め用意された実行環境へ直接デプロイするのに対して、CloudRunはコンテナをデプロイする
  • FaaSは1コンテナ1リクエストで処理を行うが、CloudRunは1コンテナnリクエスト(並行)で処理を行う
  • CloudRunの1コンテナあたりの最大リクエスト同時実行数は80

CloudRunの利用方法

動かすソースコードはチュートリアルを参考にしました。

CloudRunのために準備するもの

  • GCPアカウント + CloudRunを利用するためのIAM権限
  • gcloudコマンド
  • アプリケーションが動くように固めたDockerfile
    コンテナの環境変数 PORT に指定したポート番号でコンテナとアプリケーションが起動するようにDocker Imageを作成する必要があります。
  • Dockerfileのサンプル
FROM node:10-alpine

WORKDIR /usr/src/app
RUN apk --no-cache add graphviz ttf-ubuntu-font-family
COPY package*.json ./
RUN npm install --only=production
COPY . .

# Configure and document the service HTTP port.
ENV PORT 8080
EXPOSE $PORT

# Run the web service on container startup.
CMD [ "npm", "start" ]

デプロイ方法

gcloudコマンドを利用します。
(まだbata版のため今後デプロイ時のコマンド実行方法がが変わる恐れあり)

# カレントディレクトリの中身を確認
$ ls
Dockerfile              app.js                  index.js                package.json            test.Dockerfile
README.md               index.html              package-lock.json       test

# Dockerfileがある階層でコマンドを実行する事でGCRへイメージをビルド&プッシュ
$ gcloud builds submit --tag gcr.io/projectid-xxxxxx/graphviz
Creating temporary tarball archive of 10 file(s) totalling 333.6 KiB before compression.
.
. //省略
.
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                 IMAGES                                 STATUS
864a9532-6a40-43e3-8151-74d3632272ed  2019-05-10T07:42:31+00:00  28S       gs://xxxxxxxx_cloudbuild/source/1557474148.25-8a41a65199ba420aada63d6686abcfe5.tgz  gcr.io/projectid-xxxxxx/graphviz (+1 more)  SUCCESS

# GCRにプッシュしたイメージをCloudRunへデプロイ
$ gcloud beta run deploy graphviz-web --image gcr.io/projectid-xxxxxx/graphviz
Deploying container to Cloud Run service [graphviz-web] in project [projectid-xxxxxx] region [us-central1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
Done.
Service [graphviz-web] revision [graphviz-web-00001] has been deployed and is serving traffic at https://graphviz-web-njodhiggsa-uc.a.run.app

デプロイオプション

1コンテナあたりの同時実行数やCPU、メモリサイズはデプロイコマンド実行時に指定します。

$ gcloud beta run deploy -h
Usage: gcloud beta run deploy [[SERVICE] --namespace=NAMESPACE] [optional flags]
  optional flags may be  --add-cloudsql-instances | --allow-unauthenticated |
                         --async | --clear-cloudsql-instances |
                         --clear-env-vars | --cluster | --cluster-location |
                         --concurrency | --connectivity | --cpu | --help |
                         --image | --memory | --namespace | --region |
                         --remove-cloudsql-instances | --remove-env-vars |
                         --set-cloudsql-instances | --set-env-vars | --timeout |
                         --update-env-vars

料金プラン

リクエスト回数に応じた課金 + コンテナが使用したリソース(CPU&Memory)の時間に応じた課金が発生します。詳しくは Pricing を参照。

CloudRunを使っていて気になった所

  • 非公式FAQ ※2019/07/04追記
    以下につらつらと色々書いてますが、FAQをまとめてくださっている方がいらっしゃったのでこちらの方が参考になると思います。

  • コールドスタート問題
    FaaS同様コールドスタートが発生する。
    コールドスタートが発生する原因としてはCloudRunではリクエストがない場合、コンテナの数を0にするため。
    ※所感としては、少し動かしてみた限りでは問題となるほどの遅延は確認できなかった。

  • VPC内のリソースへのアクセスができるか?
    GCPではマネージドサービスからVPC内のリソースへのルーティングに関してはServerless VPC Accessというサービスが提供されているが、CloudRunではまだ利用できない。そのためVPCのリソースに対してアクセスする場合インターネット経由のアクセスが必要。
    そのうち対応される事を期待しますが、現状VPCアクセスが必要な場合はCloudRun on GKEを使う必要があるようです。
    ※2019/07/02追記
    他サービスとの連携状況は以下のドキュメントにまとまっており順次更新されているみたいです。

  • Cloud SQLへインターネット経由以外でアクセスができるか?
    デプロイオプションをよく見ると --add-cloudsql-instances--set-cloudsql-instances がある。
    Cloud SQLのみCloud SQL Proxyを使うことでアクセスできるみたいです。

  • アクセス制御は可能か?
    エンドポイントは必ずInternetに公開される。
    WAFなどでアクセス制御を行う仕組みは提供していない。
    唯一、IAMによる認証で呼び出し元が制限できるみたいですが今回は試していません。

  • キャッシュコントロールは可能か?
    アプリケーション側でCache-Controlヘッダをつけてコントロールできるのであれば可能のようです。
    多分エンドポイントはCloudCDNからコンテンツ配信を行なっていると思われるので、以下のドキュメント通り設定を行うとキャッシュが効くのではないかと思います。
    ※2019/06/25修正
    まだon GKEではないCloudRunはCloudCDNやCloudLoadBalancerは対応してなさそうです。
    ドキュメントを読んでもどこにも対応しているとは書いていませんでした。
    サンプルコードがキャッシュコントロールヘッダを付けていたの勘違いしていました。
    ※2019/07/02追記
    Firebase Hostingがベータですが、サポートをしているようです。

  • ロギング・モニタリング方法は?
    基本的にはStackDriverを使う事で可能です。

クォータと制限

タイムアウトが最大15分となっているのが気になりますね。

所感

個人的な印象としては単一のコンテナを動かすだけならかなり使いやすかったです。設定ファイルのyaml管理から解放され、デプロイフローも整備しやすい点が嬉しいですね。
Cloud SQLに対してもセキュアにアクセスできる方法が提供されているので、シンプルで規模の小さいサービスであれば直ぐに動かす事ができるのではないかと思います。
普段はAWSをメインで利用しているので、ECS Fargateと比べならが使っていましたが、単純なコンテナを動かし、管理するだけなら設定のコード化がほとんど必要ないCloudRunの方が使いやすそうです。
逆にFargateと比べ、CloudRunはVPCアクセスができなく、その欠点をCloudRun on GKEが補っていますが、GKEの運用をするとなると利用するハードルが少し高くなるのでどうなのかなというところですね…。
あとはFargateもそうでしたが、この手のサービスは料金プランが単純に仮想マシンを提供するサービスと比べて高いので、大規模なサービスを運用するにはお高いですね。料金が少し安くなるまでは常時起動するようなサービスでの利用にはなかなか踏み込めないと思うのでバッチ処理などがメインになるのかな…?

まとめ

Knativeベースのサーバレスコンテナ実行環境 CloudRunについて簡単に調べまとめました。
まだベータ版のサービスとなるので、今後更に便利になる事を期待しています。

※2019/06/25追記
CloudRun on GKEの裏側に関して詳しく調べてた方が記事をあげてくれており、面白かったので載せておきます。