Google Cloud Functions の環境変数について

Google Cloud Functions の環境変数について

Google Cloud Functions

Google Cloud Functions はサーバレスでアプリケーションを実行でき、サーバの構築・メンテナンスが不要であることから、人気のあるサービスとなっています。
慣れてしまえばコマンド一つでクラウド上でアプリケーションを実行できるので、超短期間でサービスを構築することができます。またOSや利用機器の管理が不要であることから、サービス開始後もサーバ運用の心配事も少ないです。
つまり Google Cloud Functions を使いこなせば、少人数でシステム開発・運用を行うことができます。

開発環境と本番環境

Google Cloud Functions はローカルの開発環境でも動作させることができます。
しかし、Google Cloud Functions でシステムを構築していて最も面倒なのが、開発環境と本番環境の違いです。訳あって MySQL など Cloud SQL でデータベースサーバを利用する必要がある場合など、開発環境と本番環境で接続方法が異なることから処理を分ける必要があります。またそのほか開発環境と本番環境で異なる点もあるでしょう。そこでよく利用されるのが環境変数ですね。
今回は、Google Cloud Functions の環境変数についてご紹介したいと思います。

環境変数

Google Cloud Functions をローカルの開発環境で動作させるとき、その時間はいつの時間を指し示すでしょうか?実際に動かしてみましょう。今回は Python を例にしたいと思います。トリガーは http です。
import datetime

def get_datetime(request):
    return datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
functions-framework で実行してみます。
functions-framework --target get_datetime --signature-type=http --port=8080 --debug
ブラウザで指定アドレスにアクセスすると、私の場合日本時間が表示されました。これは OS に設定されている時間ですね。
ではこれを Google Cloud Functions 上で動作させるとどうなるでしょう。下記コマンドでデプロイします。
gcloud functions deploy get_datetime --runtime python39 --trigger-http --allow-unauthenticated --region=asia-northeast1 --memory=128MB
公開 URL にアクセスすると、UTC の時間が表示されました。リージョンが日本であっても UTC の時間になります。そのため環境変数の設定が必要になります。
手っ取り早く環境変数を設定したいのであれば、オプションを追加すればいいでしょう(ファイルに環境変数をまとめて設定することもできます)。特にタイムゾーンを東京に設定するには、次のように指定しデプロイします。「 –set-env-vars TZ=Asia/Tokyo 」を追加しました。
gcloud functions deploy get_datetime --runtime python39 --trigger-http --allow-unauthenticated --region=asia-northeast1 --memory=128MB --set-env-vars TZ=Asia/Tokyo
これで再度アクセスすると、無事日本時間が表示されました。

本番環境で設定されている環境変数

本番環境で設定されている環境変数ってどのようなものがあるのでしょうか。Python で環境変数を見るため print(os.environ) を仕込んで、再度デプロイ・実行してみます。 すると次の内容が表示されました。
environ({'S2A_ACCESS_TOKEN': '*****', 'PORT': '8080', 'FUNCTION_SIGNATURE_TYPE': 'http', 'TZ': 'Asia/Tokyo', 'K_SERVICE': 'get_datetime', 'GAE_RUNTIME': 'python39', 'PYTHONDONTWRITEBYTECODE': '1', 'PATH': '/layers/google.python.pip/pip/bin:/opt/python3.9/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'FUNCTION_TARGET': 'get_datetime', 'GCF_BLOCK_RUNTIME_go112': '410', 'K_REVISION': '3', 'DEBIAN_FRONTEND': 'noninteractive', 'LD_LIBRARY_PATH': '/layers/google.python.pip/pip/lib', 'PYTHONUNBUFFERED': '1', 'PWD': '/workspace', 'GCF_BLOCK_RUNTIME_nodejs6': '410', 'HOME': '/root', 'PYTHONUSERBASE': '/layers/google.python.pip/pip', 'LC_CTYPE': 'C.UTF-8', 'SERVER_SOFTWARE': 'gunicorn/20.0.4'})
先ほど追加したタイムゾーンも見られますね。

環境切り分けのための変数

上記の環境変数を見たところ、K_REVISION の環境変数は本番環境にしかなさそうですね。これを利用して開発環境か本番環境か切り分けしてみましょう。
import os

def get_version(request):
    version = os.getenv('K_REVISION')
    if version is None:
        return '開発環境'
    else:
        return '本番環境 ver' + version
実際に試したところ、ローカルでは「開発環境」と表示され、 Cloud Functions では「本番環境 ver1」と表示されました。これで切り分けできますね。

まとめ

Google Cloud Functions はサーバレスで手軽にサービスを構築できるので非常に便利です。開発環境と本番環境の切り分けには「K_REVISION」の環境変数を利用することを提案しました。もしかすると実際にはもっと良い方法があるのかもしれないですが、今回紹介した方法もとても手軽ですよね。ぜひ利用してみてください。
» お仕事のご依頼はこちら