Cloud Function×TypeScriptをCloud Buildでデプロイする
きっかけ
Cloud FunctionとTypeScriptをCloud Buildでデプロイするシステムを作っていたのですが、意外と参考にできるサイトがなかったり、途中で引っかかったりするところがあったので記事書くことにしました。
githubはこちら!
記事では説明してませんが、基本的なESLintやNodeのバージョン指定などの初期設定はしてあるのでよかったら使ってみてください!!
Cloud Functionの開発
npm i
まずGoogleお手製のfunctionフレームワーク、環境変数を読み込んでくれるやつなどなどをインストールします。
npm install --save-dev @google-cloud/functions-framework env-cmd tsc-watch typescript
package.json
main
ローカルで開発する際に、@google-cloud/functions-framework
を使うのですがビルドされているものを読み込む必要があるので、package.json
にmain
の設定をします。
script
と同じ第一階層に設定します。
"main": "dist/index.js",
script
ビルドコマンドとローカル開発用のstart
コマンド、デプロイコマンドを定義します。
"scripts": {
"build": "tsc",
"start": "npx tsc-watch --onSuccess 'env-cmd -r ./.env.json npx @google-cloud/functions-framework --target=helloWorld'",
"deploy": "npx tsc && gcloud functions deploy helloWorld --runtime nodejs16 --trigger-http --region asia-northeast1 --project [your_project_id]"
},
src/index.ts
helloWorldメソッドを定義します。
export const helloWorld = async (req: any, res: any) => {
res.send('Hello World');
};
開発環境起動!!
npm run start
を叩いて、http://localhost:8080/
にアクセスして、HelloWorld
が出てくれば完了です!
tsc-watch
しているので、コードを変更すれば自動で更新してくれます!
Cloud Buildの開発
cloudbuild.yaml
cloudbuild.yaml
を作成します。
内容は、npmインストールを行い、ビルドして、デプロイしてるだけです。
steps:
- name: node:$_NODE_VERSION
entrypoint: npm
args: ['install']
- name: node:$_NODE_VERSION
entrypoint: npm
args: ['run', 'build']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
args:
- gcloud
- functions
- deploy
- helloWorld
- --region=asia-northeast1
- --source=.
- --trigger-topic=signed_contract
- --runtime=nodejs16
substitutions:
_NODE_VERSION: 16.14.2
Cloud Buildに権限付与
Cloud BuildにCloud Functionの権限を付与しましょう。
トリガーの作成
リージョンはグローバル
[1]を設定しましょう。
そして、デプロイしたいリポジトリとブランチを設定すれば完了です!
最後に
デプロイされたfunctionは、呼び出し元が未承認だとデフォルトで403エラーを返すようになっているので、適切に権限を割り振ってあげてください。
参考サイト
-
請求まわりでグローバルに設定しないといけない?っぽいのですが、正確な理由はわかりませんでした。どなたかわかる方いたらコメントしてもらえるとありがたいですorz
https://superuser.com/questions/1716674/error-by-trying-to-build-instance-via-ova-gc-sdk-genericfailed-precondition ↩︎
Discussion