はじめに

DX開発事業部の小山です。
今回はCloud Run Functionsの環境変数に複数の値を定義しようとした際に起きたトラブル、解決法、なぜ成功するのかを記載していきます。

 

起きたトラブル

案件の一環で、特定のゾーンのみを指定してインスタンスに特定の操作を実行するCloud Run Functionsを作成する必要があったため、ゾーン指定を環境変数で実行しようとしました。

以下のデプロイコマンドでデプロイを実施しようとしたところ……

gcloud functions deploy [FUNCTION_NAME] \
  --gen2 \
  --runtime [RUNTIME] \
  --region [REGION] \
  --source [SOURCE_DIRECTORY] \
  --entry-point [ENTRY_POINT_FUNCTION] \
  --trigger-http \
  --allow-unauthenticated \
  --set-env-vars xxx=hoge,huga

上記のようなエラーが出てしまいました……

困った時はすぐ公式ドキュメント。
エラー文でも示されていたgcloud CLIのコマンドリファレンスあたりを探索していたところ、以下の記述が。

gcloud compute addresses create --addresses ^:^123.456.789.198:22.333.146.189:789.312.645 --region us-central1

上記の例はIPアドレスですが、確かに複数の値を定義している……
ということは、この記法を真似すればエラーなく複数の値を定義できるのでは??

そう考え、以下のコマンドで再度デプロイを実施してみたところ……

gcloud functions deploy [FUNCTION_NAME] \
  --gen2 \
  --runtime [RUNTIME] \
  --region [REGION] \
  --source [SOURCE_DIRECTORY] \
  --entry-point [ENTRY_POINT_FUNCTION] \
  --trigger-http \
  --allow-unauthenticated \
  --set-env-vars ^:^xxx=hoge,huga

成功しました!!

 

コンソールからも複数の値が定義されていることが確認できました。

 

何故^:^を加えるだけでうまくいく?

結論から述べると、^:^と記述することによって、^^で囲まれた文字を区切り文字(デリミタ)として定義しているからです。

 

--set-env-vars xxx=hoge,huga

通常は「,」が区切り文字なので、上記の書き方だと以下のように解釈されます。

xxx=hoge
huga

こうなると、hugaが独立してしまいエラーになってしまいます。

ですが、新たに別の文字を区切り文字として認識させてあげれば、この問題は解決します。

--set-env-vars ^:^xxx=hoge,huga

今回は「:」が区切り文字になっているので、上記の書き方だと以下のように解釈されます。

xxx=hoge,huga

「,」で区切られることなく一つの要素として解釈されるので、エラーなく複数の値を定義できるようになるのです。

 

さいごに

今回は、Cloud Run Functionsの環境変数に複数の値を定義する方法をご紹介しました。
本記事が皆様のお役に立てれば幸いです。
最後までお読みいただきありがとうございます。

参考: https://cloud.google.com/sdk/gcloud/reference/topic/escaping
参考: https://e-words.jp/w/%E3%83%87%E3%83%AA%E3%83%9F%E3%82%BF.html