[GCP Cloud Functions Tutorial] First Python(関数の作成、デプロイ、テスト、関数の削除)

GCP の サーバーレスコンピューティング サービス の一つである、 Cloud Functions について、 Python で作成した プログラム を動作させるための チュートリアル 、最初の関数: Python (First Python) について解説していきます。 別途解説した、Python クイックスタートが GCP 上ですべて完結していたのに対し、最初の関数: Python は ローカル で開発、テストしたものを GCP に デプロイ するという、より実践的な内容となっています。

事前準備1事前準備2が完了していることが前提となりますので、そちらがまだの場合は是非先にご参照ください。

Cloud SDK を使用した GCP プロジェクトの作成

ここでは、以下を実施します。 GCP プロジェクト の作成は事前準備1を参照してください。

  • GCP プロジェクト の作成
  • Cloud SDK の インストール

Cloud SDK の インストール

チュートリアル の通りに、 gcloud コマンドを用いてインストール します。 既に インストール 済みの場合でも、以下のように更新を見つけることができますので、更新したほうがよさそうです。

% gcloud components update

Beginning update. This process may take several minutes.


Your current Cloud SDK version is: 350.0.0
You will be upgraded to version: 352.0.0

なお、更新前の バージョン に戻したい場合は、以下の コマンド で戻すことができるようです。

$ gcloud components update --version 350.0.0

関数の作成

それでは、ローカル 環境に関数を作成していきます。今回は first-python ディレクトリ を作成し、その中で作業していきます。

first-python % mkdir helloworld
first-python % ls
helloworld

first-python % cd helloworld
helloworld %

作成した helloworld ディレクトリ 内に main.py という名称で、 チュートリアル に掲載されている ソースコード を作成します。

helloworld % ls
main.py

依存関係の指定

python の実行に必要な ライブラリ 依存関係 を pip で管理するために、 requirements.txt を作成します。こちらも、 チュートリアル に掲載されている内容 のままで作成していきます。

helloworld % ls
main.py            requirements.txt

以上で最小構成となる Cloud Funtions 用の python 関数 の作成が完了となります。

関数のデプロイ

作成した 関数 を GCP Cloud Functions に デプロイ していきます。 デプロイ する前に、Cloud SDK が現在どのプロジェクトに対してコマンドを実行しているのか確認しておくことをオススメします。 複数のプロジェクトが存在する場合、意図しない プロジェクト に対して誤って作業してしまうことを防ぐことができます。

GCP デフォルト プロジェクト の確認

以下のように gcloud config list core/project コマンドを用いることで、現在 Cloud SDK の対象プロジェクトを確認することができます。

% gcloud config list core/project
[core]
project = sample-for-blog

参考:gcloud config list

デプロイ先 GCP プロジェクトの指定

デプロイ先のプロジェクトを変更したい場合は、 gcloud config set project コマンドを実行します。以下は、デプロイ先のプロジェクトを ”sample-for-blog” というプロジェクトに指定するサンプルになります。

helloworld % gcloud config set project sample-for-blog

Updated property [core/project].

デプロイ実施

helloworld ディレクトリ でチュートリアルにも掲載されている、以下のコマンドを実行します。 コマンドの内容は以下のとおりです。

パラメータ意味
deploy hello_httpPython プログラム内で記載した def hello_http 関数 をデプロイする
–runtime python39python 3.9 の ランタイムで動作させる
–trigger-http –allow-unauthenticated認証していないユーザからの接続を許可する
–region asia-northeast1(チュートリアル未使用) 東京 リージョン に デプロイ する
gcloud functions deploy コマンド パラメータ
helloworld % gcloud functions deploy hello_http --runtime python39 --trigger-http --allow-unauthenticated
Deploying function (may take a while - up to 2 minutes)...working.

デプロイ中は以下のようにアイコンが回転しています。

デプロイが完了すると、以下のようにアイコンがチェックマークに変化します。 名前には デプロイ 時に指定した Python 関数名が表示されます。

デプロイできたところで、早速動作確認をしていきます。

補足: エラー ”There was a problem refreshing your current auth tokens:” が出力された場合

デプロイコマンドで以下のようなエラーメッセージが出力されてしまった場合は、GCP への認証が未実施の可能性があります。 Cloud SDK ツールの承認 を参考に、 認証を実施するようにしてください。

helloworld % gcloud functions deploy hello_http --runtime python38 --trigger-http --allow-unauthenticated 

ERROR: (gcloud.functions.deploy) There was a problem refreshing your current auth tokens: ('invalid_grant: Token has been expired or revoked.', {'error': 'invalid_grant', 'error_description': 'Token has been expired or revoked.'})

GCP への認証を実施するにはエラーメッセージにも出力されているように gcloud auth login コマンドを実行し、ブラウザの指示に従って認証を完了する必要があります。

helloworld % gcloud auth login

Your browser has been opened to visit: 

You are now logged in as [[email protected]].
Your current project is [xxxxxxxxx]. You can change this setting by running: $ gcloud config set project PROJECT_ID

関数のテスト

エンドポイント URL の確認

関数のテストには、まずはデプロイした関数のエンドポイント (URL) を確認する必要があります。ここでは、 gcloud functions describe コマンドを使って確認していきます。

helloworld % gcloud functions describe hello_http
availableMemoryMb: 256
buildId: 8c8f1366-4782-4194-b6d4-bfdb152c2ce2
entryPoint: hello_http
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://GCP_REGION-PROJECT_ID.cloudfunctions.net/hello_http

コマンドを実行すると、多くの情報が表示されますが、httpsTrigger: 配下の url にエンドポイントの URL が記載されています。grep コマンドを使って url だけを表示させることも可能です。

helloworld % gcloud functions describe hello_http | grep url
  url: https://GCP_REGION-PROJECT_ID.cloudfunctions.net/hello_http

関数のテスト実行

実際にブラウザでこの URL にアクセスしてみます。

今回デプロイした関数には、パラメータとして name を渡すとその内容を表示するような処理が入っていますので、同様に試してみます。

ログの表示

Cloud Functions の利点の一つにログの収集、表示機能が標準で備わっていることがあります。先程実行した関数のログをみていきましょう。

コマンドラインツールの使用

gcloud functions logs read コマンドを利用して、ログを確認します。

helloworld % gcloud functions logs read hello_http
LEVEL: D
NAME: hello_http
EXECUTION_ID: 2kncygic3u2p
TIME_UTC: 2021-08-14 07:30:23.627
LOG: Function execution took 5 ms, finished with status code: 200

...

Cloud コンソールの使用

Cloud Console からログを確認します。以下の URL から、 Cloud Functions のログ画面にアクセスします。

https://console.cloud.google.com/project/_/logs?service=cloudfunctions.googleapis.com

プロジェクト選択画面から、対象のプロジェクトを選択し、 ログエクスプローラ を表示します。

関数の削除

最後にチュートリアルでは言及されていませんが、関数の削除を実施します。

Cloud Console から Cloud Functions のページを開き、関数一覧から対象の関数を削除していきます。

まとめ

Python クイックスタート に比べ、コマンドでの実行が多い実践的なチュートリアルでした。実際の利用局面としても、いきなりデプロイするのではなく、まずはローカルで Python プログラムを作成してみて、タイミングをみてデプロイすることが一般的な気もしますので、 gcloud コマンドにも慣れておきたいところですね。

  • Cloud SDK のインストールは gcloud components update コマンド
  • サンプルの Python プログラムは Flask で作成
  • デプロイは gcloud functions deploy [関数名] コマンド
  • エンドポイント URL の確認は gcloud functions describe [関数名]
  • ログの確認は gcloud functions logs read [関数名]

関連記事

参照情報

最初の関数: Python

Python クイックスタート