SIMPLE

【Cloud Run Function】Node.js/TypeScriptで開発環境を構築する

Cloud Run Functionはいろんなプログラミング言語に対応しており、Node.jsでも開発をすることができます。現在はTypeScriptと組み合わせて開発することが多いです。この記事ではTypeScriptでCloud Run Functionを開発する手順をまとめています。

通りすがりのラマ🦙
23 February, 2025

サムネイルはUnsplashAmador Loureiroが撮影した写真

はじめに

この記事ではTypeScriptでCloud Run Functionを開発する方法をまとめています。TypeScriptの開発環境を構築する際に、Cloud Run Functionの由来する注意点があり、少し詰まりました。同じくTypeScriptでCloud Run Functionの開発を考えている方の参考になれば幸いです。

ゴール

  • ローカル環境でTypeScriptで開発することができる(自動テストやLinterの設定などは含まない)
  • Google CLIでCloud Run Functionへのデプロイができる

この記事で構築した開発環境は、こちらのリポジトリにおいています。詳しい構築手順は、次のセクションから説明します。

https://github.com/g-ishi/cloud-run-function-typescript-template

前提

Node.jsを使用したCloud Run Functionをデプロイする、こちらの公式ドキュメントの「関数をデプロイする」まで完了していることを前提としています。

https://cloud.google.com/static/run/docs/quickstarts/functions/deploy-functions-gcloud?hl=ja#node.js

開発環境の構築手順

1. 必要なパッケージをインストールする

npm install --save-dev typescript @types/node

2. tsconfig.jsonを作成する

{
 "compilerOptions": {
   "target": "es2020",
   "module": "ESNext",
   "outDir": "./dist",
   "rootDir": "./src",
   "strict": true,
   "esModuleInterop": true,
   "skipLibCheck": true,
   "forceConsistentCasingInFileNames": true,
   "moduleResolution": "node",
   "types": ["node"]
 },
 "include": ["src/**/*"],
 "exclude": ["node_modules", "dist"]
}

重要な点:

rootDirを「./src」、outDirを「./dist」にしています。他の設定項目は自由に変えて問題ありません。

3. スクリプトの定義を追加

 "scripts": {
   "tsc-build": "rm -rf dist/ && tsc && cp package*.json dist/",
   "dev": "npm run tsc-build && functions-framework --target=helloGET --source=dist/",
   "deploy": "npm run tsc-build && gcloud functions deploy helloGET --source ./dist --runtime nodejs20 --trigger-http --entry-point=helloGET --allow-unauthenticated --region asia-northeast3"
 }

3つのスクリプト定義を追加しています。

tsc-buildコマンド

TypeScriptのビルドを行うコマンドです。

解説:

  • コマンド名に「build」を使用しない。
    • コマンド名を「build」にすると、Cloud Run Functionにデプロイした時に、Cloud Run Function側で「build」コマンドが自動で実行されます。Cloud Run Function側のビルドフェーズでは、typescriptがインストールされていないので、ビルドに失敗してしまうため、コマンドの名前を変えています。
    • 余談:Cloud Run Function側のビルドフェーズの直前には、「npm ci --production」が実行されています。
  • package.jsonとpackage-lock.jsonをdistにコピーする
    • デプロイ時のソースコードにpackage.jsonが含まれている必要があるので、コピーしています。

補足:

デプロイ時に環境変数を渡してビルドをスキップすることもできるようなので、こちらの方法でも良いと思います。(ビルドログから引用)

NOTE: Running the default build script can be skipped by passing the empty environment variable "GOOGLE_NODE_RUN_SCRIPTS=" to the build

devコマンド

開発サーバを起動するコマンドです。起動時のソースコードは、ビルド後のパス(./dist)を指定しています。

deployコマンド

Cloud Run Functionにデプロイします。あらかじめビルドして、デプロイするソースコードをビルド後のパス(./dist)にします。リージョン等のパラメータは自由に変更してください。

ビルド後のパスをデプロイするようになっていれば問題ありません。

任意:ESMモジュールへ変更

デフォルトでは、commonjs方式のインポートになっているので、好みに合わせてESMモジュールへ変更します。

  "type": "module",
- const functions = require('@google-cloud/functions-framework');
+ import functions from '@google-cloud/functions-framework';

環境構築は以上です。ローカル開発環境では、「dev」スクリプトを使用します。デプロイは「deploy」コマンドで行います。

おわりに

この記事では、TypeScriptでのCloud Run Functionを開発環境を構築しました。筆者が構築した際に、思ったよりハマってしまったので、同じ人の助けになれば幸いです。

フィードバック、コメントなど大歓迎です。X(Twitter)で反応いただけると嬉しいです。

通りすがりのラマ🦙

このブログでは、個人開発で得た知見や、興味のあるテクノロジー、時々デザインに関する記事を執筆します。 日々公開されている情報に助けられているので、自分が得た知見も世の中に還元していければと思います。 解決できないバグに出会うと、つばを飛ばします。🦙 経歴:情報工学部→日系SIer→外資系IT企業 興味:Webアプリケーション開発、Webデザイン 趣味:個人開発、テニス