web-dev-qa-db-ja.com

Google Cloud Function-関数の読み込みエラー:関数を定義する必要があるファイルmain.pyが存在しません

Gitスタイルのリポジトリのコードに基づくGoogle Cloud関数を実装しようとしています。コードをGoogle Cloud Platformの「ソースリポジトリ」にリンクしていて、コードをコピーしてGCP関数「インラインエディター」に貼り付けると、関数が正常に実行されます。 「Cloud Sourceレポジトリ」オプションに切り替えると、そのレポジトリから読み取っていることがわかります。私はこれより前に他のエラーに取り組みました。ただし、以前/その他の問題を解決した後、次のエラーが発生します。

Function load error: File main.py that is expected to define function doesn't exist

私のファイルは、ルートディレクトリにmain.pyを含む次のような構造になっています。

.
├── package
|   ├──script1.py
|   └──script2.py
├── package2
├── ...
├── main.py
└── requirements.txt

requirements.txtから正常に読み取っています(以前のエラーの一部はその読み取りプロセスに起因しています)が、main.pyから読み取らないのはなぜですか? GCP関数の設定は次のようになります。

Google Cloud function edit window screenshot

Main.pyをプロジェクト内の別のディレクトリに移動し、「ソースコードのあるディレクトリ」をそのディレクトリに設定しようとしましたが、そのディレクトリが見つからないというエラーが表示されました。建設的なアイデアはありますか?

編集/追加情報

master以外のリポジトリからのブランチを使用しており、この関数にGoogle Cloud Pubsubトピックトリガーを使用しています。

8
Jed

新しいコミットをプッシュした後、関数を再デプロイしていますか?あなたは次のようなことをする必要があります:

gcloud functions deploy NAME \
  --source https://source.developers.google.com/projects/PROJECT_ID/repos/REPOSITORY_ID/moveable-aliases/master/paths/SOURCE \
  TRIGGER

詳細は https://cloud.google.com/functions/docs/deploying/repo を参照してください。

4
Dustin Ingram

GCSバケットまたはファイルアップロード機能を使用してコードZipをアップロードする場合は、コードを含むフォルダーではなく、コードファイルのみをZipしないでください。

CodeFolder
├── package
|   ├──script1.py
|   └──script2.py
├── package2
├── ...
├── main.py
└── requirements.txt

行う ない CodeFolderからZipファイルを作成します。

代わりに、main.pyおよびrequirement.txtおよびpackageからZipファイルを作成します。

ソース

4
MetalloyD

同様の問題(おそらく同じですか?)がありました。私に起こったことは、すべてのファイルが次の形式であったことです。

  1. [ZIPファイル名] /main.py
  2. [ZIPファイル名/ [その他]

そして、エラーはそれがメインを見つけることができなかったと言い続けました。これは親フォルダがあったからだと思っていました。親のジップを少し調べたところ、それは問題ではないと判断しました。

私はZipをダウンロードして、自動生成されたダイアログフロークラウド関数コードを見て、「package.json」ファイルがあることに気付きました。代わりに、「requirements.txt」ファイルを用意しました。 package.jsonファイルをソースコードにコピーし、正しい内容に編集し、圧縮して、クラウド関数を正しくコンパイルしました。

package.jsonは次のようになります。

{
  "name": "test",
  "description": "testingThings",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "ABCDEFG",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:test",
    "deploy": "firebase deploy --only functions:test"
  },
  "dependencies": {
    "google-cloud-storage": "",
    "google-cloud-firestore": "",
  }
}

私は彼らがグーグルクラウド機能をデプロイするためにこれを使用するので、それなしでは壊れてしまうと思います。

1
Clancy

他の回答にもかかわらず、それを機能させることがまだできない場合、私は次のようにして最終的にこのエラーを取り除きました:

  • ファイルへのpathsが正しいことを確認してください(特に、認証情報をファイルからロードしている場合はjsonファイル、相対パスに注意してください)
  • requirements.txtファイルを確認してください:pipreqsを使用して自動生成していましたが、いくつかの間違いがありました(たとえば、google-cloud-tasksなどのモジュールの場合、「-」ではなく「_」)。インポートに基づいて自分でrequirements.txtを書くことをお勧めします。

これがお役に立てば幸いです。

0
garys