Cloud Run でNuxtを動かす

TL;DR

Cloud Nextで発表された新サービス "Cloud Run" でNuxt.jsを動かした

そもそもCloudRunとは

httpリクエストを待ち受けるコンテナを動かすためのサービス。
GCRに上げたコンテナを選択すると良い感じに動かしてくれる。

GCPって他にもコンテナ動かすサービスあるよね

あるよね。わかる。

  1. GAE/FE
  2. GKE

そして新しく "Cloud Run"( と "Cloud Run on GKE" )が登場。

個人的に使い分け

いまどきCDパイプラインを作らないこともないと思うので、デプロイのしやすさは関係ない気がしていて、問題は関係するコンポーネントの数なのかなと。

"個人的に"コンテナを使い分けるなら以下の順で選定する気がした。

  1. Cloud Run
    • GCPでコンテナを動かす際の最初の選択肢
    • 他のサービスと異なり、「コンテナを単純に動かすことを考えればいい」印象
    • CloudSQLに接続できないのが地味に痛いけど、CloudFunctionsみたいなノリでそのうちサポートされそう
  2. GAE/FE
    • VMを意識することが地味あり、ハマりポイントが多い印象
    • 個人的にあまり使いたくないけど、単純なアプリケーションでGKEを使うぐらいならGAE/FEにロックインされたい
  3. GKE
  4. Cloud Run on GKE
    • Cloud Run をGKEのアドオンとして動かす。
    • 社内でFaaSをいくつかの動かしたいなら出てくる選択肢?

Nuxt.jsをCloud Run で動かす

とりあえずやってみよー

1. Nuxtプロジェクトの作成

Dockerで create-nuxt-app を使ってプロジェクト作成。

$ cd /path/to/your/dir/
$ docker run -v `pwd`:/app -w /app -it node:10.13-alpine npx create-nuxt-app cloudrun
$ cd cloudrun
$ ls
README.md         components        middleware        nuxt.config.js    package.json      plugins           static
assets            layouts           node_modules      package-lock.json pages             server            store

f:id:y-ohgi:20190430021925p:plain

2. Dockerize

シンプルなDockerfileを一枚用意します。
Cloud Run はアクセスがない時は0台でコールドスタートする(はず)なので、そこそこ気を使って軽量なDockerイメージを作ってあげたほうが良いでしょう。

./Dockerfile

FROM node:10.13-alpine

ENV HOST 0.0.0.0

WORKDIR /app

COPY ./package.json ./package-lock.json /app/

RUN npm install

COPY . .

RUN npm run build

CMD ["npm", "start"]

ビルドしてラン

$ docker build -t cloudrun .
$ docker run -p 3000:3000 cloudrun

> cloudrun@1.0.0 start /app
> cross-env NODE_ENV=production node server/index.js


16:32:27  READY  Server listening on http://0.0.0.0:3000

f:id:y-ohgi:20190430021817p:plain

3. GCRへpush

GCRへpush

$ prjid=$(gcloud config get-value project)
$ docker tag cloudrun asia.gcr.io/${prjid}/cloudrun
$ gcloud auth configure-docker
$ docker push asia.gcr.io/${prjid}/cloudrun

4. Cloud Run の起動

マネージドの方のCloud Runを使いたいので、まずはAPIの有効化をします。

$ gcloud services enable run.googleapis.com
Operation "operations/acf.99999-99999-99999-99999" finished successfully.

CLIからCloud Run を起動。
beta版の2019/04現在はus-central1しか動かすことが出来ないので、明示的にus-central1を指定。

$ gcloud beta run deploy \
    --allow-unauthenticated \
    --image asia.gcr.io/${prjid}/cloudrun \
    --region us-central1
Service name: (cloudrun):
Deploying container to Cloud Run service [cloudrun] in project [be-ogi-yusuke] region [us-central1]
Deploying new service...
  Setting IAM Policy...done
  Creating Revision...done
  Routing traffic...done
Done.
Service [cloudrun] revision [cloudrun-00001] has been deployed and is serving traffic at https://cloudrun-odtckksnea-uc.a.run.app

最後にURLが表示されるのでアクセスし、Nuxtのトップページが表示されれば成功。

コールドスタートっぽく、起動まで若干かかる。
ホットスタンバイはできないっぽくて、ここは Cloud Scheduler などで定期的にアクセスするかGAE/FEになるのかなーと。

GUI からもちゃんと見える f:id:y-ohgi:20190430021853p:plain

所感

現在の起動台数が見えなかったり、スケールアウトだけじゃなく同時接続も可能だったり、コンテナのためのサーバーレスFaaSっぽくて良いですね。
積極的に使っていきたいです。