【Cloud Functions】デプロイ直前にランタイム環境変数を利用した関数のテストは出来ない、のかもしれない

1080 語
5 分
【Cloud Functions】デプロイ直前にランタイム環境変数を利用した関数のテストは出来ない、のかもしれない

はじまり#

リサちゃん avatar
リサちゃん
あれー? テストがうまく通らないぞー?
135ml avatar
135ml
デプロイ前のテストですね
リサちゃん avatar
リサちゃん
この環境変数を読み取らないと先に進まないんだが・・・
135ml avatar
135ml
Noneになってるね

※当ページはアフィリエイト広告を利用しています。

まず、何が起きてるんだ#

最近(2024/04/26 ぐらいですかね)、 Python で書いた関数を Google Cloud のコンソールから、 Cloud Functions としてデプロイしようとした時の話です。

今回の事象は、 Python 3.10、 Python 3.12 および Go 1.22 のランタイムで確認しました。

まあ、コンソールで Cloud Functions を開いて新しい関数を作成し始めると、こんな画面になりますよね。

そしたら、ランタイム環境変数を設定します。

そして、こんな風に関数を打ち込みます。 今回は、テストとして実行するためにこんな記述とします。

import functions_framework
import os
@functions_framework.http
def hello_http(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>.
"""
request_json = request.get_json(silent=True)
request_args = request.args
vari = os.getenv("TEST_ENV")
print(vari)
vari = os.environ.get("TEST_ENV")
print(vari)
vari = os.environ["TEST_ENV_2"]
print(vari)
if request_json and 'name' in request_json:
name = request_json['name']
elif request_args and 'name' in request_args:
name = request_args['name']
else:
name = 'World'
return 'Hello {}!'.format(name)

そして、「関数をテスト」をクリックして、ビルドのち直前のリクエストテストをしますよね・・・あれっ・・・。

すると、こんな感じのエラーメッセージが表示されます。os.environの返り値はdict型なので、環境変数にキーがないとKeyErrorを吐き出します。

Traceback (most recent call last):
File "/layers/google.python.pip/pip/lib/python3.10/site-packages/flask/app.py", line 1473, in wsgi_app
response = self.full_dispatch_request()
// ...略
File "/workspace/main.py", line 22, in hello_http
vari = os.environ["TEST_ENV_2"]
File "/layers/google.python.runtime/python/lib/python3.10/os.py", line 680, in __getitem__
raise KeyError(key) from None
KeyError: 'TEST_ENV_2'

えーと、確かにランタイム環境変数は設定したはずですが・・・

はて?

デプロイ後に再度テストをしてみる#

エラーになってしまいましたが、意に介さずにデプロイしてみます。

はい、デプロイが終わったら、もう一度リクエストのテストをしてみます。

実行すると、今回は特にエラーも起きず、ちゃんとレスポンスが返ってきます。

右下を見ると、環境変数を取得した事が分かるログも出力されていますね。

そういう仕様ということだろうか・・・#

以下の、コンソールを介して関数をデプロイするドキュメントや、環境変数を設定する部分のドキュメントなどを読んでは見ましたが、デプロイ前に環境変数を取得できないとは書いてないんですね。(ビルドは終わってるんですけどね。)

そして、その環境変数のドキュメントに、 Cloud Functions でデフォルトで予約されている環境変数のキーがあるそうなので、その環境変数は取得できないのかどうかも調べてみました。

デフォルトで予約されている環境変数は取得できるのか#

2024/04/29 時点で Cloud Functions で自動的に設定されるランタイム環境変数のキーは以下のとおりです。

キー説明
FUNCTION_TARGET予約済み: 実行される関数
FUNCTION_SIGNATURE_TYPE予約済み: 関数のタイプ。HTTP 関数の場合は http、イベント ドリブン関数の場合は event です。
K_SERVICE予約済み: 関数リソースの名前
K_REVISION予約済み: 関数のバージョン ID。
PORT予約済み: 関数が呼び出されるポート。

ビルド直後でデプロイ直前にテストをするとこんな感じになります。

FUNCTION_TARGETFUNCTION_SIGNATURE_TYPEおよびPORTと、 3 種類のキーは取得できましたが、K_SERVICEおよびK_REVISIONのキーは取得できませんでした。

デプロイ後にテストをするとこんな感じで、全てのキーが取得できています。

うーん、不思議だ。

まとめ#

この記事では、 Cloud Functions のデプロイ前にランタイム環境変数が取得できなかったことについて解説しました。

  • Google Cloud Functions でユーザーが設定したランタイム環境変数は、デプロイ後にのみ取得可能。
  • 一部の自動的に設定されるランタイム環境変数は取得可能だが、全てではない。

Secret Manager などを噛ませれば、デプロイ直前にシークレットを使ったテストが出来るんでしょうけど。

まあ、それが面倒だからランタイム環境変数に設定しているのであって、この仕様には疑問でした・・・。

プログラミングのお供に#

PFU キーボード HHKB Professional HYBRID 日本語配列/墨amzn.to
Amazon.co.jpで購入する
【Amazon.co.jp限定】 Logicool G ゲーミングキーボード G515 TKL 薄型 有線 テンキーレス キーボード G515-LNBK リニア 赤軸 静かなタイピング 日本語配列 LIGHTSYNC RGB ゲーミング メカニカルキーボード PC window mac chrome ブラック 国内正規品amzn.to
Amazon.co.jpで購入する
ZENAIM KEYBOARD ゼンエイムキーボード【MOTION HACK機能(ラピッドトリガー機能)搭載/0.05mm単位のアクチュエーション可変/温度補正機能による誤動作防止/磁気検知式ロープロファイルキーボード/TKLサイズ/日本語配列/脱着式Type-Cケーブル/安心の国内サポート】amzn.to
Amazon.co.jpで購入する

おしまい#

リサちゃん avatar
リサちゃん
じゃあ、デプロイ前はテストできないじゃん。
135ml avatar
135ml
環境変数ってよく使うんだけどな。

以上になります!

記事を共有

この記事が役に立ったなら、ぜひ他の人と共有してください!

【Cloud Functions】デプロイ直前にランタイム環境変数を利用した関数のテストは出来ない、のかもしれない
https://endorphinbath.com/posts/cloudfunctions-unable-to-test-with-env/
著者
kinkinbeer135ml
公開日
2024-04-29
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【GitHub】Goでリポジトリの情報を取得するCloud Functionsを作って、Pythonと比較する
Code Go言語でGitHubのリポジトリ情報を取得するCloud Functionsを開発し、Pythonで作成した同様の機能と比較した記事です。使ったツールや、並行処理の比較も行っています。
2
【Cloud SQL】GolangでDBインスタンスの開始停止をスケジュール実行して節約する
Code Golangで書いたCloud Run FunctionでCloud SQLインスタンスの起動と停止を行い、Cloud SchedularとPub/Subでスケジュール実行してコスト削減を図ります。
3
【Cloud SQL】GolangでDBインスタンスへのオペレーション完了まで待つ
Code Go言語でCloud SQLに作成したDBインスタンスに対する処理が完了するまで待つようにします。「Error 409: Operation failed because another operation was already in progress. Try your request after the current operation is complete., operationInProgress」というエラーを回避します。
4
【Python、Golang】NotionのページのプロパティをCloud SQLのPostgreSQLに記録する(第1回)
Code NotionのページのプロパティをPythonで取得して、Cloud SQL上に作成されたPostgreSQLのDBに記録する手順を紹介します。Cloud FunctionsではCloud SQLを使えない。
5
【Go、Docker】「api」という名前のパッケージを作るとビルド出来なくなる
Code Goでアプリケーションを開発する際、「api」というパッケージ名を含んだモジュールをDockerコンテナ内でビルドしようとするとバグります。そんな奇妙な事象に遭遇して沼りました。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次