Kon's DX Lab - Case Study

Day 81 │ Cloud Runで環境変数が反映されない? .envが効かない理由と正しい設定法

Published on 2025-06-21

🔬 Case Study Summary
Problem

(ここに課題を記述)

Result

(ここに具体的な成果を記述)


Tech & Process

(ここに採用技術とプロセスを記述) コードを詳しく見る »

こんにちは、こんです🦊

SlackボットをCloud Runで動かそうとしたとき、
「え、なんでSLACK_BOT_TOKENがNoneになってるの?」という事態に遭遇しました。

今回はその原因だった「環境変数」の扱いについて、実際にハマったポイントと対策をまとめておきます。


🤖 Cloud Runで.envが効かない理由

ローカルでFlaskアプリを動かすとき、

from dotenv import load_dotenv
load_dotenv()

と書いて .env に設定した環境変数を読み込めます。

でも、Cloud Runはそもそも .env ファイルを読み込みません。

僕も最初「アップロードしたし読み込まれるでしょ」と思ってたんですが…全く反応せず😇

なので、Cloud Runでは .env ではなく --set-env-vars で渡すのが正解です。

✅ Cloud Run の正しい環境変数設定方法

Cloud Shellなどからデプロイするとき、こんな感じで明示します:

gcloud run deploy workpulse-app \
  --source . \
  --region us-central1 \
  --allow-unauthenticated \
  --set-env-vars SLACK_BOT_TOKEN=xxx,SLACK_SIGNING_SECRET=xxx,SPREADSHEET_ID=xxx

これをやらずに .env を置いただけだと、

os.getenv("SLACK_BOT_TOKEN") → None

という悲劇になります。

💡 ローカル開発と本番を分けて管理する

ローカルでは .env を使って開発しつつ、
本番(Cloud Run)では --set-env-vars で明示的に渡す。

こうしておくと「環境依存のエラー」が減ります。

# ローカル用
from dotenv import load_dotenv
load_dotenv()

# 本番ではCloud Runの環境変数が優先される
SLACK_BOT_TOKEN = os.getenv("SLACK_BOT_TOKEN")

🛠 おすすめ運用ルール

  • .env は .gitignore に追加(セキュリティのため)

  • Cloud Run用の .sh スクリプトを用意して再デプロイしやすく

🔁 デプロイ後に値を変更したいときは?

環境変数の内容を変えたくなったら、再デプロイが必要です:

gcloud run deploy workpulse-app \
  --source . \
  --region us-central1 \
  --allow-unauthenticated \
  --set-env-vars SLACK_BOT_TOKEN=新しい値,...

Cloud Runは、再起動=再デプロイだと考えるとシンプルです。

🎯 まとめ

Cloud Runでは .env は読み込まれない!
この一文だけでも知っておくと、無駄に悩まずに済むと思います。

SlackボットでもWebhookでも、環境変数が必要なケースは多いので、
「ローカルと本番でどう分けるか?」を考えておくと後々ラクです。

それでは、また次の実験で🧪


#100日チャレンジ #Slackボット #CloudRun #Python #Flask #DX開発メモ #環境変数あるある #業務効率化