この記事は ここのえ Advent Calendar 2023 Day 14 の記事です。
Cloud Functionsのここに気を付けよう 2023
Advent Calendar の11日目の記事でも書いたのですが、ちょっと前にGCPのCloud Functionsを使い始めました。
前回は無料枠周りで引っかかった話だったのですが、それ以外にも細々としたところで悩んだ箇所があったので、その辺の情報の共有です。
Cloud Functionsで.gcloudignoreを作るときの注意
GCPには .gcloudignore
というignoreファイルを書くと、デプロイ時に無視してくれるという特徴があります。
Cloud Functionsのデプロイで、バンドルをデプロイしようとすると対象ファイルはごく一部だけなので、こんな感じの .gcloudignore
を書きます。
*
!dist
!package.json
package.jsonでは"main": "dist/index.js"
を書いているので、本来であればこれは動くはずなのですが、実際には 正常にデータをデプロイできず、ビルドが失敗 します。
これについてはStackOverFlowに投稿があります。
実はCloud FunctionsとApp Engineなどで .gcloudignore
の実装が違う(?)のか、Cloud Functionsの時だけ「カレントディレクトリそのものを無視する」という謎の挙動になり、*
を入れると想定外の挙動が起き、正常にデプロイされないのでCloud Buildが走らなくなるようです。
一番無難なのは、素直にignoreしていくことです…
.idea
.parcel-cache
node_modules
src
.env
.eslintrc.cjs
.gitignore
tsconfig.json
gcp-buildに空の値は入れられない
今回の環境ではローカルでビルドしたものをデプロイするようにしたので、クラウド上でTypescriptのビルドや、ESLintを走らせたくありませんでした。
またdepDependencies
に入れてあるので、GCP上でビルドが走ったらパッケージ不足でビルドがコケてしまいます。これを回避しようとします。
ドキュメントを見ると、以下のように記載されています。
デフォルトでは、package.json で build スクリプトが検出されると、Node.js ランタイムによって npm run build が実行されます。アプリケーションを開始する前にビルドステップをさらに制御する必要がある場合は、gcp-build スクリプトを package.json ファイルに追加することで、カスタム ビルドステップを提供できます。
次のいずれかの方法で、ビルドで npm run build スクリプトが実行されないようにすることができます。
- package.json ファイルに "gcp-build":"" という値を持つ gcp-build スクリプトを追加します。
そこで package.json
をこうします。
"scripts": {
...
"build": "parcel build --no-source-maps",
"gcp-build": ""
},
そうするとこうなります。
error An unexpected error occurred: "Script must exist".
実は 空の gcp-build
を作るというのは罠 で、これを消しても特に問題ありませんでした。
ビルド時のログに特にエラーが出ていないので、build
が走ったような感じもしません(ParcelもdevDependenciesなのでインストールされないはずです。またsrcもデプロイしてないですし、万が一parcelが動いてもコケるはずです)。
邪推ですが、Cloud Functionsでのビルド処理はbuild
を見ずに gcp-build
を呼び出すように変わったのでしょうか?
いずれにせよ真相は闇の中です……
まとめ
自分がGCP慣れしていないのもそうですが、さすがにドキュメントの通りやったら足をすくわれるのは勘弁してくれ~って感じです。
GCPといいAWSといい、実際に触ってないとわからない知見が多すぎるので、使いこなすのはまさに職人技ですね……
クラウドの道は一日にしてならず、ってコト!?
参考
- .gcloudignoreのやつ
めちゃくちゃ困っている時にこの記事のコメントに助けられました。本当にありがとうございました🙇
-
gcp-build
の罠