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
デプロイ先 GCP プロジェクトの指定
デプロイ先のプロジェクトを変更したい場合は、 gcloud config set project コマンドを実行します。以下は、デプロイ先のプロジェクトを ”sample-for-blog” というプロジェクトに指定するサンプルになります。
helloworld % gcloud config set project sample-for-blog Updated property [core/project].
デプロイ実施
helloworld ディレクトリ でチュートリアルにも掲載されている、以下のコマンドを実行します。 コマンドの内容は以下のとおりです。
パラメータ | 意味 |
---|---|
deploy hello_http | Python プログラム内で記載した def hello_http 関数 をデプロイする |
–runtime python39 | python 3.9 の ランタイムで動作させる |
–trigger-http –allow-unauthenticated | 認証していないユーザからの接続を許可する |
–region asia-northeast1 | (チュートリアル未使用) 東京 リージョン に デプロイ する |
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 [xxxxxx@xxxx]. 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 のログ画面にアクセスします。
プロジェクト選択画面から、対象のプロジェクトを選択し、 ログエクスプローラ を表示します。
関数の削除
最後にチュートリアルでは言及されていませんが、関数の削除を実施します。
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 [関数名]