開発

CloudFunctionsのNode.jsで「Function cannot be initialized」が発生する原因と対策

2020-10-28

CloudFunctionsのNode.jsで「Function cannot be initialized」が発生する原因と対策

Googleのクラウド環境上で仮想サーバーの設定をせずにサーバーレスでプログラムを実行できるCloudFuntions

CloudFuntionsではいくつかのプログラム言語を利用できるが、その中のひとつ「Node.js」を使っていると、デプロイ時にあるエラーに遭遇することがある。

Function cannot be initialized

初期化エラーのようだがエラーメッセージを見ても対策がわからない

そこで今回は、CloudFunctionsのNode.jsで「Function cannot be initialized」が発生する原因と対策について解説する。

この記事を書いている人


システムエンジニア、AIエンジニアと、IT業界で10年以上働いている中堅。PythonとSQLが得意。最近GCP環境を習得中。

記事を読むメリット

  • 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.xxxxxx 部分を指定。

    そして無事デプロイに成功。


    じゃあNode.jsのバージョンとエントリポイントの両方が間違ってたってこと?
    そう思ったけど実はそうじゃなくて


    しかしその後の実行時に 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.xxxxxx 部分を指定すると良い。





    他にもGCPのVMインスタンスやBigQueryに関する記事もあるので、もし気になったら見てみてほしい。

    ITipsと同じようなブログを作る方法

    ブログに興味がありますか?

    もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

    サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
    同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

    ランキング参加中

    にほんブログ村 IT技術ブログへ

    他にもブログやSNSで紹介してくれると励みになります。

    はてブのコメントで酷評されると泣きます(´;ω;`)

    -開発
    -, ,

    © 2024 ITips