くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

ソースからCloud Runにデプロイする(Buildpacks/Node.js)

以前、Cloud BuildとDockerfileをつかった自動デプロイを使ってたけど、
いつの間にか進化していて、かなり楽にデプロイできるようになってた(*´ω`*)

www.memory-lovers.blog

実際に試してみたら、すごい設定が少なくリリースできるようになってたので、
ハマったところを含めてまとめてみた備忘録(*´ω`*)

公式のドキュメントだとこの辺りを起点に読むとよいかも。

Buildpacksでソースからデプロイ

GCPにある公式のサンプルでのデプロイ。

こんな感じのシンプルなpackage.jsonindex.jsがあるとして、

// package.json
{
  "name": "helloworld",
  "description": "Simple hello world sample in Node",
  "version": "1.0.0",
  "private": true,
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "engines": {
    "node": ">=12.0.0"
  },
  "author": "Google LLC",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}
// index.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  const name = process.env.NAME || 'World';
  res.send(`Hello ${name}!`);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
  console.log(`helloworld: listening on port ${port}`);
});

あとは、gcloud run deployすればOK

// SERVICE_NAME: サービス名
// PROJECT_ID: プロジェクトID
$ gcloud run deploy $SERVICE_NAME --source . \ 
  --project $PROJECT_ID \ 
  --region asia-northeast1 \ 
  --allow-unauthenticated

2つのファイルだけでデプロイできるように(*´ω`*)

サンプルだと、package.jsonscripts.startしかないけど、
scripts.buildを追加しておけば、npm run buildを実行してくれるので、
TypeScriptでもOK(*´ω`*)

gcloud run deployのオプションは以下を参照。

必要なAPI

Cloud Run/Artifact Registry/Cloud Buildを使うので、
このあたりのAPIが有効にしておく必要がある。

  • 必要なAPI
    • Cloud Run Admin API ... Cloud Runのデプロイ
    • Artifact Registry API ... デプロイするイメージの保存
    • Cloud Build API ... デプロイするイメージのビルド

もし、有効になっていない場合、gcloud run deployを実行すると、
有効にするかどうか聞かれるので、yキーで応答すればOK

ちなみに、Container Registry は非推奨らしい。。

Container Registry is deprecated. After May 15, 2024, Artifact Registry will host images for the gcr.io domain in projects without previous Container Registry usage.

必要な権限

サービスアカウントなど、オーナー以外の権限で実行する場合は、
以下の権限を付与しておく必要があるので注意。

と、ドキュメントには書いてあったけど、以下の4つでもOKだったので、
もう少し調整でできるかもしれない。

ビルドなどNode.js固有の設定

よく使うのは、Nodeのバージョンやbuild/startコマンドあたり。

// package.json
{
  "engines": {
    "node": ">=18.0.0"
  },
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js"
  }
}

Buildpacksのカスタマイズ

用意されているイメージだと足りない場合は、 イメージ自体をカスタマイズすることもできるっぽい。

もしくは、従来どおりDockerfileを用意してビルドすればOK

Buildpacksが使える言語とバージョン

Buildpacksが使える言語とバージョンはここに一覧になっている。


以上!! シンプルなWebアプリならこれで十分だね(*´ω`*)

参考にしたサイト様