開発

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

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に関する記事もあるので、もし気になったら見てみてほしい。

    コチラもオススメ

    KRSW

    駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

    役に立ったらシェアしてくれると励みになります。

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

    -開発
    -, ,

    Translate »

    Copyright© ITips , 2020 All Rights Reserved.