Flaskアプリの環境変数設定方法!安全で柔軟な構成を実現しよう
生徒
「FlaskアプリでパスワードやAPIキーをコードに直書きするとどうなるんですか?」
先生
「コードに直接書くと、万が一コードを見られたときに秘密情報が漏れるリスクがあります。」
生徒
「じゃあ安全に使うにはどうすればいいの?」
先生
「環境変数という仕組みを使えば、秘密情報を別に管理できて安全です。初心者でもできる方法をこれから説明しますね。」
1. 環境変数とは?何のために使うの?
環境変数とは、パソコンやサーバーの中にあらかじめ登録しておける「設定情報を入れるための特別な引き出し」のようなものです。FlaskのようなWebアプリでは、パスワード・APIキー・データベース接続情報などを直接コードに書くと危険なので、この“引き出し”に入れておき、必要なときだけ取り出して使います。
たとえるなら、家の鍵を玄関に置きっぱなしにせず、決まった収納場所に入れておくようなものです。置き場所がはっきりしていれば安全性も高まり、家族で共有する場合にも便利ですよね。環境変数も同じで、プログラムの安全性や管理のしやすさを高めるために利用します。
実際に環境変数を読み取る簡単なサンプルを見てみましょう。
import os
# パソコンに設定されているMY_NAMEという環境変数を読み取る
name = os.getenv("MY_NAME")
print(f"こんにちは、{name}さん!")
このように、コード側は「環境変数の名前」を指定するだけで情報を取り出せます。大切な値をコードに書かずに済むため、初心者でも安全にアプリを扱えるようになる重要な仕組みです。
2. 環境変数を使うメリットは?
環境変数は「Flaskアプリを安全に、そして柔軟に動かすための仕組み」です。特に、秘密の情報を扱う場面では欠かせない存在になります。コードを整理しやすくなるだけでなく、後から設定を変更しやすくなるため、初心者でも扱いやすい方法です。
- パスワードやAPIキーを安全に管理できる
コードに直接書かずに済むため、GitHubなどに誤って公開してしまう事故を防げます。環境変数はアプリとは別の場所で保管されるため、情報漏えいのリスクが大きく下がります。 - 開発環境と本番環境で設定を切り替えられる
ローカルではテスト用のデータベース、本番では本物のデータベース、といった切り替えも環境変数1つで簡単に変更できます。同じコードを使っていても設定だけ替えられるのが大きな利点です。 - チーム開発でも秘密情報を共有しなくて済む
同じコードを配っても環境変数は含まれないため、「秘密情報だけは各自が設定する」という安全なやり方ができます。初心者でも安心してプロジェクトに参加できます。
実際に環境変数が役立つイメージを掴むため、簡単なサンプルを見てみましょう。
import os
# 開発環境か本番環境かを切り替える例
mode = os.getenv("APP_MODE", "development")
if mode == "production":
print("本番モードで実行します")
else:
print("開発モードで実行します")
このように、環境変数を使うだけでアプリの動かし方を柔軟に変えることができます。慣れてくると、環境変数はFlaskアプリの“影の立役者”のように感じられるはずです。
3. .envファイルで環境変数を管理しよう
.env(ドットエンブイ)ファイルは、環境変数をまとめて書いておくための「メモ帳」のようなテキストファイルです。Flaskアプリのフォルダ直下(app.py と同じ場所)に置き、パスワードやAPIキーなどの秘密情報をここに書いておくことで、コード本体から分離して管理できます。
中身はとてもシンプルで、名前=値という形で1行ずつ設定を書いていきます。例えば、次のようなイメージです。
SECRET_KEY=abcd1234
DATABASE_URL=postgres://user:pass@localhost/dbname
SECRET_KEY はFlaskのセッション情報を守るための「暗号の鍵」、DATABASE_URL はデータベースに接続するための「住所」のようなものです。もちろん、実際に使うときはこの値を自分の環境に合わせて変更します。ここでは「こういう書き方をする」というサンプルとして眺めてみてください。
また、この .env ファイルは他人に見せてはいけない情報が入ることが多いため、Gitで共有しないのが基本ルールです。プロジェクトのルートにある .gitignore に次のように書いておくと、誤ってリポジトリに含めてしまうことを防げます。
# 秘密情報を含む .env はGitに乗せない
.env
このように、.env ファイルは「Flaskアプリで使う大事な設定をひとまとめにしておく場所」として活躍します。次のステップでは、このファイルに書いた値をPythonコード側から読み込んで利用する方法を見ていきましょう。
4. python-dotenvで簡単に.envを読み込む
python-dotenvというライブラリを使うと、先ほど作成した.envファイルの中身を、Python側からとても簡単に読み取れるようになります。毎回自分でファイルを開いて解析する必要はなく、「.envを読み込んで環境変数に反映してね」と一言お願いする感覚で使えます。
まずはライブラリをインストールしましょう。ターミナルやコマンドプロンプトで、次のコマンドを実行します。
pip install python-dotenv
インストールができたら、Pythonファイルの先頭でload_dotenvを呼び出します。これだけで、同じフォルダにある.envの内容を環境変数として読み込んでくれます。
from dotenv import load_dotenv
import os
# .envの内容を読み込んで、環境変数として登録する
load_dotenv()
# .env に書いた SECRET_KEY を取り出してみる
secret = os.getenv("SECRET_KEY")
print(f"読み込んだSECRET_KEYは: {secret[:4]}****")
ここで行っていることはとてもシンプルです。まずload_dotenv()で.envを読み込み、そのあとにos.getenv("SECRET_KEY")で値を取り出しています。printで一部だけ表示してみると、「ちゃんと.envから値を取得できているか」を目で確認できます。
実際のFlaskアプリでは、このload_dotenv()をアプリの起動前に呼び出しておくことで、SECRET_KEYやDATABASE_URLなどを設定値として安全に利用できるようになります。次のステップでは、読み込んだ環境変数をFlaskの設定にどのように組み込むかを見ていきましょう。
5. Flaskアプリ内で環境変数を使う方法
ここからは、実際にFlaskアプリの中で環境変数を「設定値」として使う方法を見ていきます。ポイントは、os.getenv() で読み取った値をそのまま使うのではなく、app.config に入れておくことです。こうしておくと、Flaskアプリ全体から同じ設定を参照できるようになり、後からの変更や管理もしやすくなります。
最低限の構成で、SECRET_KEY を環境変数から読み込んで使うサンプルを書いてみましょう。
from flask import Flask
from dotenv import load_dotenv
import os
# .env の内容を読み込んで環境変数に反映する
load_dotenv()
# Flaskアプリ本体を作成
app = Flask(__name__)
# 環境変数 SECRET_KEY を設定値として登録
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")
@app.route("/")
def index():
# SECRET_KEY の先頭4文字だけを表示してみる
return f"Secret is {app.config['SECRET_KEY'][:4]}..."
流れとしては、まず最初に load_dotenv() を呼び出して .env の中身を読み込み、そのあと os.getenv("SECRET_KEY") で値を取り出しています。取り出した値は app.config["SECRET_KEY"] に入れておくことで、Flaskの設定としていつでも参照できるようになります。
ルート関数 index() では、その SECRET_KEY の先頭だけを切り出して文字列として返しています。実際のアプリでは画面に鍵の値を出すことはありませんが、「本当に環境変数から値が取れているか」を確認するための練習用サンプルとしては分かりやすい形です。このあとブラウザでアクセスしたときにどのように表示されるかを、次のセクションで確認していきます。
6. 実行結果の確認
ここでは、先ほどのFlaskアプリが実際に環境変数を正しく読み込めているかを、画面表示を通して確認してみます。ブラウザで http://localhost:5000/ にアクセスすると、次のような結果が返ってきます。
Secret is abcd...
このように、SECRET_KEY の先頭4文字だけが表示されています。これは、環境変数が正しく読み込まれ、app.config に設定されていることを示しています。あえて一部だけ表示しているのは、鍵そのものを見せないための安全対策です。
もし .env ファイルが読み込めていなかったり、キー名が間違っている場合には、この画面に何も表示されなかったり、エラーが起きたりします。そのため、この結果を確認することで、「環境変数の設定 → 読み込み → Flaskへの反映」が正しく行われているかを分かりやすくチェックできます。
7. 本番環境での環境変数設定
HerokuやAWS、Dockerなど本番環境でも環境変数は設定できます。
Herokuならコマンド一つで:
heroku config:set SECRET_KEY=abcd1234
本番環境でも秘密情報を安全に持てます。
8. よくあるつまずきポイント
- .envが読み込まれない → ファイル名が正しいか、
load_dotenv()を書いたか確認しましょう。 - 環境変数がNoneになる → os.getenvのキー名が間違っていないかチェックを。
- .envを誤って公開 → .gitignoreに追加して、Gitに含めないようにしてください。
9. 環境変数で柔軟なFlask構成を実現
環境変数を使うことで、デバッグモードや本番モード、APIのエンドポイントなども切り替えられます。
例えば:
app.config["DEBUG"] = os.getenv("FLASK_DEBUG", "0") == "1"
10. 環境変数管理のベストプラクティス
- 秘密情報は全て環境変数で管理する
- .envはGit管理に含めない
- 本番環境ではサービスの環境変数機能を使う(Heroku、AWSなど)
この方法で、安全で柔軟なFlask構成が実現できます。
まとめ
Flaskアプリで環境変数を使う考え方は、一度理解してしまえばさまざまな場面で応用できる大事な基礎知識です。この記事では、パスワードやAPIキーをコードに直書きする危険性から始まり、.envファイルやpython-dotenvを使った具体的な管理方法、さらに本番環境と開発環境の切り替え方まで幅広く見てきました。特に、Flaskアプリの中でos.getenvを使って秘密情報を取得し、app.configに設定する流れは、今後さまざまなプロジェクトで何度も使う基本パターンになります。環境変数を丁寧に扱うことで、Flaskアプリの安全性を高めながら、柔軟な構成変更もできるようになり、長く運用できる実用的なWebアプリケーションに近づいていきます。
まず押さえておきたいのは、環境変数を使う一番の理由が「秘密情報をコードから切り離すこと」にあるという点です。データベースの接続文字列、メールサーバーのパスワード、外部サービスのAPIキーなどをそのままソースコードに書いてしまうと、Gitで共有したときや、誤ってリポジトリを公開してしまったときに重大な情報漏えいにつながってしまいます。そこで、.envファイルやサーバー側の環境変数機能を使って値を隠し、Flaskアプリ側はあくまで「名前だけを知っている」状態にしておくことで、安全に運用できるようになります。この考え方を身につけておくと、他のフレームワークや言語に触れたときもスムーズに応用できます。
また、環境変数はセキュリティのためだけでなく、「開発環境と本番環境で設定を切り替える」という役割も担っています。ローカルではSQLite、本番ではPostgreSQLやMySQLを使う場合でも、DATABASE_URLという同じ名前の環境変数を用意しておけば、コード側は一切変更せずに環境だけを変えることができます。デバッグモードのON・OFFやログレベルの切り替え、外部APIのエンドポイントURLなども同じように環境変数で管理しておけば、設定値を差し替えるだけで柔軟に挙動を変えられます。こうした構成の工夫は、Flaskアプリをチーム開発や実運用で使うときにとても役に立ちます。
.envファイルとpython-dotenvを組み合わせる方法は、ローカル開発を快適に進めるうえで非常に便利です。プロジェクトのルートディレクトリに.envを置いて、そこにSECRET_KEYやDATABASE_URLを書いておき、load_dotenv()を呼び出すことで自動的に読み込ませることができます。ただし、この.envファイルはGitに含めないように.gitignoreに追加しておくことがとても重要です。うっかり.envをコミットしてしまうと、それだけで秘密の情報が外部に漏れる危険があります。安全に環境変数を扱うには、こうした小さなルールの積み重ねが欠かせません。
本番環境では、HerokuやAWS、VPS、Dockerなど、それぞれのサービスが用意している「環境変数の設定画面」や「設定ファイル」を活用するのが一般的です。特にHerokuでは、heroku config:setコマンドで簡単に環境変数を登録でき、Flask側はローカル開発と同じようにos.getenvで値を取得できます。つまり、Flaskのコード自体はほとんど変えずに、環境ごとに異なる値だけを変えられるので、デプロイのたびにソースコードを書き換える必要がなくなります。この仕組みに慣れると、「設定は環境変数に寄せる」「コードは挙動だけを書く」という役割分担が自然にできるようになります。
ここまでを整理する意味も込めて、環境変数を使ったシンプルなFlaskアプリの例をもう一度まとめておきます。小さなサンプルですが、SECRET_KEYやデバッグフラグを環境変数から読み込む流れが一通り含まれているので、手元の環境で実際に試してみると理解が一段と深まります。
環境変数を使ったシンプルなFlask設定例
from flask import Flask
from dotenv import load_dotenv
import os
# .envを読み込む(ローカル開発時)
load_dotenv()
app = Flask(__name__)
# 環境変数から設定を読み込む
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY", "default-secret")
app.config["DEBUG"] = os.getenv("FLASK_DEBUG", "0") == "1"
app.config["DATABASE_URL"] = os.getenv("DATABASE_URL", "sqlite:///local.db")
@app.route("/")
def index():
debug_mode = "オン" if app.config["DEBUG"] else "オフ"
return f"デバッグモードは{debug_mode}です"
if __name__ == "__main__":
app.run(debug=app.config["DEBUG"])
このように、os.getenvで環境変数を取得し、Flaskのapp.configにまとめておくと、アプリの中でどの設定がどの値を使っているかが分かりやすくなります。デフォルト値を用意しておけば、環境変数が未設定のときにも最低限動くようにしておくこともできます。最初は小さなアプリで構いませんが、こうした形を最初から意識して作っておくと、後から機能を追加したときにも無理なく拡張できるようになります。
環境変数の管理は、一見すると地味な作業に感じるかもしれませんが、Flaskアプリを安全に長く運用していくうえで欠かせない大切な土台です。コードに直接書いてしまえば一瞬で済むような設定も、あえて環境変数に切り出しておくことで、セキュリティ面でも運用面でも安心できる構成に近づいていきます。この記事で学んだ考え方を、自分の小さな練習用アプリから少しずつ取り入れていくと、いつの間にか本番運用を意識した設計が自然と身についているはずです。
生徒
「環境変数って最初は難しそうだと思っていましたけど、鍵を別の場所にしまう感覚だと考えると分かりやすかったです。」
先生
「そのイメージはとても良いですね。大事な鍵を机の上に置きっぱなしにしないのと同じように、大事な値はコードから分けておくことが大切です。」
生徒
「.envファイルに書いて、python-dotenvで読み込む流れも理解できました。あとは.gitignoreに入れ忘れないように気をつけます。」
先生
「そうですね。.envをそのまま公開してしまうと、せっかく分けた意味がなくなってしまいますからね。そこだけはしっかり習慣にしておきましょう。」
生徒
「本番環境ではHerokuやAWSの設定画面から環境変数を入れるっていうのも、実際の運用をイメージしやすくて勉強になりました。」
先生
「実際のサービスでも同じ考え方で動いているので、今回の内容は今後いろいろな場面で役に立つはずですよ。小さなアプリからでいいので、ぜひ実際に手を動かして試してみてください。」
生徒
「はい、自分のFlaskアプリでも早速SECRET_KEYとDATABASE_URLを環境変数に分けてみます。ちゃんと動かせたら、もう少し複雑な設定にも挑戦してみたいです。」
先生
「とても良い流れですね。一歩ずつ慣れていけば、より安全で柔軟なFlaskアプリを作れるようになりますよ。」