Googleのクラウド環境上で仮想サーバーの設定をせずにサーバーレスでプログラムを実行できるCloudFuntions。
CloudFuntionsではいくつかのプログラム言語を利用できるが、その中のひとつ「Node.js」を使っていると、デプロイ時にあるエラーに遭遇することがある。
Function cannot be initialized
初期化エラーのようだがエラーメッセージを見ても対策がわからない。
そこで今回は、CloudFunctionsのNode.jsで「Function cannot be initialized」が発生する原因と対策について解説する。
この記事を書いている人
記事を読むメリット
CloudFunctionsのNode.jsで「Function cannot be initialized」が発生する原因
CloudFunctionsのNode.jsで「Function cannot be initialized」が発生する原因として考えられるのは2つある。
エラー原因の候補
「Function cannot be initialized」の対策
原因がわかれば対策もハッキリする。
エラーの対策
筆者のケース
私も同じエラーに遭遇したことがあるので、その時にどう対応したかを書こうと思う。
まず私の開発したものではないNode.jsのソースコードがあり、それをCloudFunctions上で実行する必要があった。
私はNode.jsの知識はそれほど無かったので、とりあえずGCP上でCloudFunctionsの作成を行い、件のソースコードをコピペ。
デプロイしたところ「Function cannot be initialized」が発生。
activityログには以下のメッセージが残された。
Function cannot be initialized
cloud-functionsのログには以下のメッセージが残された。
Function failed on loading user code. Error message: Error: please examine your function logs to see the error cause: https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs
正直全然わからなかったよ。
そこで元のコードがどんな設定のもとで実行されていたかヒアリングし、元々は Node.js 8
で実行されていたことを確認。
2020年10月現在、CloudFunctionsのデフォルト設定では Node.js 10
がランタイムとして設定されているので、 Node.js 8
を設定。して再度デプロイ。
するとエラー内容が以下のように変わった。
Function failed on loading user code. Error message: Node.js module defined by file index.js is expected to export function named (エントリポイント設定)
ここでエントリポイントの設定を間違えたことに気づき、エントリポイントとして元コードの exports.xxx
の xxx
部分を指定。
そして無事デプロイに成功。
しかしその後の実行時に Unexpected token
エラーが発生。
こちらも調べるとバージョン不整合が原因のようなので、Node.jsのランタイムを Node.js 10
に戻すと、今度は「Function cannot be initialized」が発生せずにデプロイ成功。
コードの実行も成功した。
CloudFunctionsのNode.jsで「Function cannot be initialized」が発生する原因と対策 まとめ
CloudFunctionsのNode.jsで「Function cannot be initialized」が発生する原因として考えられるのは以下の2点。
エラー原因の候補
対応方法も以下の通り。
エラーの対策
エントリポイントを設定する際は exports.xxx
の xxx
部分を指定すると良い。
他にもGCPのVMインスタンスやBigQueryに関する記事もあるので、もし気になったら見てみてほしい。