[小ネタ]Cloud Functionsをデプロイする際にentry-pointのエラーが出る場合の対処

Cloud Functionsに関数をデプロイする際にentry-pointのエラーが出た場合の原因確認と対処方法を記載します。デプロイ時に「File main.py is expected to contain a function named ~」のエラーが出る方は試しに読んでください。
2020.05.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

CX事業本部東京オフィスの佐藤智樹です。

今回は以前行ったGCPのCloud Functionsのチュートリアルで関数をデプロイする際にentry-pointのエラーが出た場合の原因確認と対処方法を記載します。前の記事と同じようにエラー文から原因推測が難しかったので、同じように悩んでいる人がすぐに解決できるようにと自分の備忘録のために記事にします。

発生するエラー

Cloud Functionsで以下のコマンドでファイル内のprocess_image関数をhandlerとして指定しデプロイする際にエラーが発生しました。

ファイル(一部抜粋)

main.py

import base64
import json
import os

from google.cloud import pubsub_v1
from google.cloud import storage
from google.cloud import translate
from google.cloud import vision
…
def process_image(file, context):
    bucket = validate_message(file, 'bucket')
    name = validate_message(file, 'name')
    detect_text(bucket, name)
    print('File {} processed.'.format(file['name']))
…

実行したコマンド

gcloud functions deploy ocr-extract --runtime python37 --trigger-bucket 2020xxxx-cloudfunctions-ocr-image --entry-point process_image

出力されたエラー

Deploying function (may take a while - up to 2 minutes)...failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code.
Error message: File main.py is expected to contain a function named process_image

原因

エラー文から見るとentry-pointの名称誤りかentry-point内部の関数が怪しいように見えますが問題ありませんでした。問題を切り分けるため地道にコードを削除してデプロイを繰り返すうちに以下のコード部分があるとデプロイできないことが分かりました。

main.py

from google.cloud import translate

調べたところCloud Translation APIは現在だとv2とv3が提供されています。明確には見つけられなかったですが、上記のソースでインポートしているv1は使用できなくなっているようです。

Python Client for Google Cloud Translation — google-cloud-translate documentation

対処方法

以下のようにv2のライブラリをインポートすることで問題なくデプロイできるようになります。互換性があったので翻訳も問題なく動作しました。

main.py

from google.cloud import translate_v2 as translate

感想

単純な内容ですがentry-point以外の部分に問題があると気付かず無駄に時間を取られました。(シリコンバレー見ながら試してたせいでもありますが)Serverless Frameworkなどを使えばもっと分かりやすくエラーが出るのか調べてみたいです。検索しても同じエラーに関する記事は出てこなかったので誰かのためになれば幸いです。