はじめに
Cloud Run Fouctions を作成するのに自分がハマった注意ポイントについて紹介します。
かなり初歩的なところもありますが、もしうまく作成できないという方はこちらを参考にしてみてください。
私はよく Python を使用するので Python の例を示しますが、他のコードを使用する際には適宜読み替えてください。
ソースコードはファイルを ZIP 化すべし
Cloud Run Functions を Google Cloud コンソールで作成する場合はインラインでコードを記述すれば良いので考慮しなくて良いですが、Google Cloud Storage にソースコードを用意するなど、自前で ZIP ファイルを用意する際にはこの注意が必要です。
以下が Cloud Run Functions のソースディレクトリの構造です。
普段 ZIP ファイルに圧縮するとき、必要なファイルが入ってるフォルダごと圧縮しがちですが、それではソースディレクトリが 'folder/main.py' と 1 階層深いところに作成されてしまいます。
このまま Cloud Run Functions を作成しようとすると、ソースコードビルド時に下記のような main.py がないというエラーが出てきます。
missing main.py and GOOGLE_FUNCTIONS_SOURCE not specified.
Either create the functions in main.py or specify GOOGLE_FUNCTIONS_SOURCE to point to the file that contains the function
そのため、Cloud Run Functions で用いるコードを ZIP 化する際には、以下のような方法で行うようにしてください。
コマンド
一つのファイルを ZIP ファイル化したいときは単に下記のコマンドを実行するだけで十分です。
zip <zip 先ファイル名> <圧縮したいファイル名>
複数ファイルを ZIP ファイル化したいときは下記のようにファイル名を連ねて記載します。
zip <zip 先ファイル名> <圧縮したいファイル名1> <圧縮したいファイル名2> ・・・
とあるディレクトリ配下全部を ZIP ファイル化したいときは下記のように -r
のオプションを活用すると良いです。
こうすると、指定したディレクトリ配下にある全てのファイルが ZIP ファイル化されます。
zip -r <zip ファイル名> <圧縮したいディレクトリ名>
Terraform
Terraform で Cloud Run Functions を作成している人は Terraform で ZIP ファイルを作成することも可能なのでぜひやってみて下さい。
以下の例ではカレントディレクトリにある sample.txt
をカレントディレクトリに sample.zip
を作成します。
data "archive_file" "sample" {
type = "zip"
source_file = "./sample.txt"
output_path = "./sample.zip"
}
エントリーポイントは main.py で実行したい関数とすべし
エントリーポイントは何を設定すれば良いのだろう?と思ったあなた、main.py で自分が作成した関数の名前を設定してください。
そうしないと、永遠にヘルスチェックが通らず、トラフィクがルーティングされません。(存在しない関数を実行しようとしているので、当たり前と言えば当たり前ですが...)
恥ずかしながら、私はこのあたりの知識に乏しかったのでこのポイントにかなりはまり悪戦苦闘しました。
functions_framework.exceptions.MissingTargetException: File /workspace/main.py is expected to contain a function named 'hello_world'. Found: 'hogehoge_function' instead
(任意)return で何かしら返すべし
Cloud Run Functions で実行する関数の中身の処理がうまく行っても、return で返さないと Cloud Logging 上では下記のようなエラーとなっています。
Typeerror: The view function for 'run' did not return a valid response. The function either returned None or ended without a return statement.
これはその名の通り、「何も返却してないよ」ということを意味しているので、"OK" でも "Success" でも何でも良いので返すようにしましょう。
エラー自体を無視すれば、本エラーは Cloud Run Functions の処理自体には影響しません。
さいごに
以上、Cloud Run Functions でハマったポイントです。(2025/04/28現在、他にもあれば追加します)
Cloud Functions が Cloud Run Functions とリブランディングされています。
こちらによる影響については、他の方がまとめているのでそちらをご確認ください。
個人的にはコンソールが Cloud Run と統合されたことで、少し扱いにくいなと感じています。(ただ慣れていないだけですね)
他にも注意すべきことがあれば追加していきます。