はじめに
Google Cloud Functionsのローカル開発環境を作成し、Hello Worldを出力するサービスを構築します。
また、ローカル開発環境はCloud Native Buildpacksをします。
基本的にGoogle様のドキュメントに従ってやっていきます。補足程度にとらえてください。
前提
私のPCは以下のような環境です。
- Windows 10にwsl2を使用してUbuntuを構築
- Ubuntuにdockerをインストール
- windowsにpython3.8をインストール
今回はUbuntu上にGoogle Cloud Functionsのローカル開発環境を作成していきます。
いざ構築
ローカルでの開発を参照し構築していきます。
資料を参照すると、Google Cloud Funcitonsをローカルで開発するための選択肢は下記の2種類とのこと。
今回はCloud Native Buildpacksを使用してローカル環境を構築したいと思います。
なお、Cloud Native Buildpacksを使用するためには下記が必要とのこと。
- packツール
- docker → 今回は割愛
そのため、下記の流れで進めていきます。
- packツールのインストール
- テスト用のPython Cloud関数の作成
- Cloud Native Buildpacksの実行
packツールのインストール
packツールのインストールは公式ドキュメントを参照して実施します。
packツールはCommand Line Interface (CLI)とGo libraryとして提供されており、今回はCLIをインストールします。
環境がUbuntuになるため、下記コマンドを実行してインストール。
$sudo add-apt-repository ppa:cncf-buildpacks/pack-cli
$sudo apt-get update
$sudo apt-get install pack-cli
そして、.bash_profileに以下を追記
$echo '. $(pack completion)' >> ~/.bash_profile
テスト用のPython Cloud関数の作成
テスト用にHello Worldを出力するPython Cloud関数を作成します。
Python Cloud関数はPythonクイックスタートを丸コピ参照して作成します。
以下をhello_world.pyとして保存。
def hello_world(request):
"""Responds to any HTTP request.
Args:
request (flask.Request): HTTP request object.
Returns:
The response text or any set of values that can be turned into a
Response object using
`make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`.
"""
request_json = request.get_json()
if request.args and 'message' in request.args:
return request.args.get('message')
elif request_json and 'message' in request_json:
return request_json['message']
else:
return f'Hello World!'
```
Cloud Native Buildpacksの実行
Cloud Native Buildpacksに従い、以下を実行。
pack build --builder gcr.io/buildpacks/builder:v1 \
--env GOOGLE_RUNTIME=python \
--env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \
--env GOOGLE_FUNCTION_TARGET=hello_world hello
すると、下記のようなエラーが発生。
=== Python - Functions Framework (google.python.functions-framework@0.9.2) ===
Failure: (ID: 5c04ec9c) missing main.py and GOOGLE_FUNCTION_SOURCE not specified. Either create the function in main.py or specify GOOGLE_FUNCTION_SOURCE to point to the file that contains the function
どうやらPython Cloud関数の名前をmain.py以外にしているため、ソース(hello_world.py)との紐づけに失敗し発生している模様。
そのため、packコマンド実行時の引数にGOOGLE_FUNCTION_SOURCEを追加して再度実行
pack build --builder gcr.io/buildpacks/builder:v1 \
--env GOOGLE_RUNTIME=python \
--env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \
--env GOOGLE_FUNCTION_TARGET=hello_world \
--env GOOGLE_FUNCTION_SOURCE=hello_world.py hello
すると無事にイメージのビルドに成功。
作成したhelloイメージ使用してコンテナを実行してみる。
$ docker run --rm -p 8080:8080 hello
実行後はcurlコマンドを使用してPython Cloud関数にアクセスし、hello worldが返ってくることを確認。
$ curl http://localhost:8080/hello_world
Hello World!
無事、ローカル開発環境でHello Worldを出力するサービスを構築することができた。
まとめ
- Cloud Native Buildpacksを利用しローカル開発環境を作成することができた。
- ローカル環境でHello Worldを出力するサービスを構築することができた。
- ローカルでの開発を参照すると簡単に構築できる。
簡単に構築できるのなら、こんな記事不要では・・・?