TL;DR
Cloud Nextで発表された新サービス "Cloud Run" でNuxt.jsを動かした
そもそもCloudRunとは
httpリクエストを待ち受けるコンテナを動かすためのサービス。
GCRに上げたコンテナを選択すると良い感じに動かしてくれる。
GCPって他にもコンテナ動かすサービスあるよね
あるよね。わかる。
- GAE/FE
- GKE
そして新しく "Cloud Run"( と "Cloud Run on GKE" )が登場。
個人的に使い分け
いまどきCDパイプラインを作らないこともないと思うので、デプロイのしやすさは関係ない気がしていて、問題は関係するコンポーネントの数なのかなと。
"個人的に"コンテナを使い分けるなら以下の順で選定する気がした。
- Cloud Run
- GCPでコンテナを動かす際の最初の選択肢
- 他のサービスと異なり、「コンテナを単純に動かすことを考えればいい」印象
- CloudSQLに接続できないのが地味に痛いけど、CloudFunctionsみたいなノリでそのうちサポートされそう
- GAE/FE
- VMを意識することが地味あり、ハマりポイントが多い印象
- 個人的にあまり使いたくないけど、単純なアプリケーションでGKEを使うぐらいならGAE/FEにロックインされたい
- GKE
- みんなだいすきKubernetes。
- 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
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
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 からもちゃんと見える
所感
現在の起動台数が見えなかったり、スケールアウトだけじゃなく同時接続も可能だったり、コンテナのためのサーバーレスFaaSっぽくて良いですね。
積極的に使っていきたいです。