TCLHattori
@TCLHattori

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

CloudFunctionsのローカルデバッグ

解決したいこと

PythonでGoogleCloudFunctionsを開発しています。
ローカルでvscodeとGoogle Cloud Code拡張機能を使ってデバッグしています。
ワークスペース直下(ソースコードと同じディレクトリ)にvenvで仮想環境を作成したあと、そのままデプロイすると

Failed to compress folder for upload: EISDIR: illegal operation on a directory, read

エラーが発生します。
venvディレクトリを削除すると正常に完了できます。

デバッグやGUI操作の都合上venvを違うディレクトリに作成することは避けたいと思います。

venvディレクトリをデプロイから除外するなど、なにか良い方法はないでしょうか。

そもそもローカルデバッグをvenv環境でやることが間違っているのであれば正しい方法も教えていただけますと幸いです。

0

2Answer

@eno49conanさん

確かめていただいてありがとうございます。
リージョンを変えたりしてみてもだめでした...
自分の環境がArm+Ubuntu環境なので、そのあたりが原因かもしれません。

とりあえずコマンド使用でデバッグ・デプロイができることがわかったので、
これで開発進めようと思います。

ありがとうございました。

1Like

環境情報やコードが、@TCLHattoriさんと全く同じではない気がするんのでなんとも言えませんが、
私は以下内容で、venvを使っても問題なく実行できました。
コードは本当に最小限です。(OS:Windows11)
参考にしてみてください!

参考記事

実施作業

1. ローカル環境でサーバを起動することの確認

フォルダ構成

image.png

コード関連
  • アプリケーションコード
main.py
def hello_world(request):
    return "Hello, World!", 200
  • ライブラリ管理(※)
requirements.txt
blinker==1.8.2
click==8.1.7
cloudevents==1.11.0
colorama==0.4.6
deprecation==2.1.0
Flask==3.0.3
functions-framework==3.8.1
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.5
packaging==24.1
watchdog==5.0.2
Werkzeug==3.0.4

pip freeze > requirements.txtで作成

実行と結果
functions-framework --target=hello_world --port=8080

image.png

2. クラウド環境へのデプロイと挙動確認

コマンド
gcloud functions deploy hello_world \
--gen2 \
--region asia-northeast1 \
--runtime python312 \
--trigger-http \
--allow-unauthenticated \
--entry-point hello_world
コンソール

image.png

実行結果

image.png

0Like

Comments

  1. @TCLHattori

    Questioner

    @eno49conanさん

    コメント頂いてからサンプルプログラムを使用してデプロイしてみたところ問題なくできました。
    またエラーが出ていた元のプロジェクトも無事デプロイが成功しました。
    ありがとうございます。

    こちらを参考にGUIで操作していたのですが、裏で実行されているコードがコマンドと違うのかもしれません

  2. @TCLHattoriさん
    いただいたリンクに沿ってやってみましたが、こちらも特にエラーなくできましたよ!

    フォルダ構造(cloud codeの機能を使ってアプリケーション作成後、仮想環境作成)

    image.png

    自動作成されたlaunch.jsonの内容
    launch.json
    {
        "configurations": [
          {
            "name": "Deploy Cloud Function",
            "type": "cloudcode.cloudfunctions",
            "request": "launch",
            "functionName": "function-hello-world",
            "gen": "GEN_2",
            "entryPoint": "hello_get",
            "revision": "1",
            "testInput": "",
            "region": "asia-northeast1",
            "runtime": "python312"
          }
        ]
    }
    
    自動作成されたmain.pyの内容
    main.py
    import functions_framework
    
    @functions_framework.http
    def hello_get(request):
        """HTTP Cloud Function.
        Args:
            request (flask.Request): The request object.
            <https://flask.palletsprojects.com/en/1.1.x/api/#incoming-request-data>
        Returns:
            The response text, or any set of values that can be turned into a
            Response object using `make_response`
            <https://flask.palletsprojects.com/en/1.1.x/api/#flask.make_response>.
        Note:
            For more information on how Flask integrates with Cloud
            Functions, see the `Writing HTTP functions` page.
            <https://cloud.google.com/functions/docs/writing/http#http_frameworks>
        """
        return 'Hello World!'
    

    デプロイ時のVsCodeの操作とブラウザの表示

    image.png

    image.png

    未認証を許可
    image.png

    ブラウザで表示
    image.png

Your answer might help someone💌