Cloud Run デプロイアクション:deploy-cloudrun の env_vars_file 廃止と移行方法
はじめに
こんにちは。Belong でバックエンド エンジニアをしている mani です。
最近、Google Cloud Run へのデプロイを行う GitHub Action である deploy-cloudrun
において、その機能の一つである env_vars_file
が非推奨になったということで、代替案を考える機会がありました。
env_vars_file
は、環境変数をファイルから読み込むための機能でした。これにより、Cloud Run へのデプロイ時に使用する環境変数を簡単に管理できていました。しかし、この機能が非推奨となったため、新しい方法を検討する必要が出てきました。
本記事では、deploy-cloudrun
アクションにおける環境変数管理の新しいアプローチについて解説します。
概要
Belong では GitHub Actions を使用して CI/CD を行っています。その中でも Cloud Run へのデプロイには deploy-cloudrun
アクションを使用しており、このアクションの env_vars_file
機能を利用して環境変数を管理していました。
この機能により、ENV ファイル 1 つで Cloud Run へのデプロイ時の環境変数とローカル実行時用の環境変数を管理することができる ため、非常に便利でした。
ディレクトリ構造としては以下のような形で管理していました。
/app
├── .github
│ ├── env
│ │ ├── dev.env
│ │ ├── prod.env
│ │ └── stg.env
│ └── workflows
│ ├── dev-deploy.yaml
│ ├── prod-deploy.yaml
│ └── stg-deploy.yaml
このように、環境変数を .github/env
ディレクトリに格納し、各環境ごとに dev.env
、prod.env
、stg.env
というファイルを作成していました。
そして、deploy-cloudrun
アクションの env_vars_file
オプションを使用して、各環境の環境変数を Cloud Run にデプロイ時に読み込んでいました。
しかし、この env_vars_file
オプションが非推奨になったため、代替案を考える必要が出てきました。
実際の警告文は以下の通りです。
Warning: The "env_vars_file" input is deprecated and will be removed in a future major release.
To source values from a file, read the file in a separate GitHub Actions step and set the contents as an output.
Alternatively, there are many community actions that automate reading files.
Cloud Run へのデプロイ時とローカル環境の両方で同じ環境変数を使用できるように、何かしらの代替案を用いてこれを解決する必要がありましたので、本記事ではその代替案を考えます。
代替案
- shell を使って環境変数を読み込む
- deploy 用の YAML ファイルから読み込む
1. shell を使って環境変数を読み込む(非推奨)
これは、AI に提案してもらった方法です。
「AI すごいぞ!」という流行りもあり、AI に相談してみました。
(結論から言うと、値が正しく更新されなかったため、非推奨となりました)
AI からは以下のような提案がありました。
## 解決策の概要
1. ファイルから環境変数を読み込むためのステップを追加します。
2. 読み込んだ環境変数を、env_varsに渡す形式に変換します。
3. 変換した環境変数を、env_varsパラメータに設定します。
以下のように、dev-deploy.yaml
の中で env
を読み込むようにします。
name: Deploy with Environment Variables
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Load environment variables from file
id: load_env
run: |
# 環境変数ファイルを読み込み、key=value形式に変換
echo "ENV_VARS=$(cat dev-env.txt | xargs -d '\n' | tr '\n' ',' | sed 's/,$/' )" >> $GITHUB_OUTPUT
- name: Deploy with environment variables
uses: your-deployment-action # デプロイ用のアクション
with:
env_vars: ${{ steps.load_env.outputs.ENV_VARS }}
# 他の必要なパラメータ...
この方法では、dev-env.txt
というファイルから環境変数を読み込み、key=value
形式に変換して env_vars
に渡すようにしています。
結論から言うと、この方法はうまくいきませんでした。理由としては、そもそもこのコマンドだと欲しい形式の文字列にうまくなりませんでした。
読み取り自体はできるが、形式が不適切だったため、Cloud Run のデプロイコマンドに反映されず、適切な設定ができませんでした。
Cloud Run のデプロイコマンドのログを見ても、環境変数の値が入っていなかったのが確認できたので、そう思われます。
よって、この方法は うまくいかず、よくない方法 です。AI を信じすぎてはいけない、いい例でした。
補足
最新の AI に聞いてみたところ、コマンドとして読み込み、デプロイコマンドに環境変数の値を渡すこと自体はできるとのことですが、元々 環境変数ファイルからの読み込みをやめたいという変更なのに、ファイルからの読み込みをしようとするのはあまり良くないと思われますので、Shell を用いた環境変数を読み込む方法はできてもやらない方が良い方法だと思います。
2. deploy 用の YAML ファイルから読み込む
これは、今回の解決策として採用されたやり方です。
dev-deploy.yaml
にて env
タグに値を入れるやり方です。
name: Dev Deploy
on:
push:
branches:
- development
workflow_dispatch:
env:
APP_NAME: app_name
GOOGLE_CLOUD_PROJECT: app_dev
jobs:
deploy-run-service:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Deploy on Run Service
uses: ./.github/actions/deploy-run-services
with:
app_name: ${{ env.APP_NAME }}
〜略〜
env_vars: |- # ここで必要な環境変数を指定する
ENV=${{ env.ENV }}
GOOGLE_CLOUD_PROJECT=${{ env.GOOGLE_CLOUD_PROJECT }}
YAML ファイルのトップレベルに env
タグを追加し、必要な環境変数を指定します。
そして、各ジョブ内で ${{ env.ENV }}
のように参照することで、環境変数を使用できます。
このままだと、CI/CD の時のみ環境変数が適用されるので、ローカル用にも何かしらのアクションが必要です。
そこで、Python スクリプトから YAML ファイルを読み込み、環境変数を設定するようにしました。
import yaml
import os
import logging
import pathlib
logger = logging.getLogger(__name__)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
def load_yaml(env: str):
base_dir = pathlib.Path(BASE_DIR)
yaml_file = os.path.join(base_dir, ".github", "workflows", f"{env}-deploy.yaml")
with open(yaml_file, "r") as f:
data = yaml.safe_load(f)
try:
for key, value in data["env"].items():
os.environ[key.strip()] = str(value).strip()
except Exception as e:
logger.error(f"Error loading environment variables: {e}")
上記のような関数を用いて、YAML ファイルの env
タグの値を読み込み、環境変数に設定します。
YAML のトップレベルにある env
タグを指定することで、他プロジェクトでも使い回しができるようにしました。
この方法であれば、CI/CD 環境とローカル環境の両方で同じ環境変数を使用することができるため、非常に便利です。
おわりに
今回は、Cloud Run デプロイアクション deploy-cloudrun
における env_vars_file
オプションの代替案について考えました。
結論として、GitHub Actions の workflow ファイルの env
タグを活用する方法が最適であり、これにより Cloud Run へのデプロイ時とローカル開発時の環境変数管理の問題を解決することができました。
本記事が何かのお役に立てば幸いです。
また、弊社 Belong は一緒に働くエンジニアを募集しています。
興味がある方は Belong Engineering Careers ページ をご覧いただけると幸いです。