APIキーをコードに直書きしない|.envと環境変数で安全に管理する(Python・GAS)

AIやWebサービスのAPIを使い始めると、必ず出てくるのが「APIキー」です。とりあえず動かしたくて、コードの1行目に API_KEY = "…" と書いてしまう。最初はみんなやりがちですよね。

私も昔、テスト用のコードにAPIキーを直接書いたまま、人に見せる資料へコードを貼りかけたことがあります。送る直前に気づいて冷や汗をかきました。そこからは、キーはコードの外に置くと決めています。

💡
この記事で解決すること

APIキーをコードに直書きせず、Pythonでは .env ファイルと環境変数から、GASではスクリプトプロパティから読み込む方法を紹介します。
Gitで .env を共有しないための設定と、もしキーを公開してしまったときの対処もまとめます。


この記事の前提

  • Pythonのスクリプトを実行したことがある、またはGASのエディタを開いたことがある
  • 例に出てくるAPIキーやURLは、すべてダミー(demo-xxxx、api.example.com)です
  • Pythonのコードは、Debian 13 の検証環境(Python 3.13.5、仮想環境に入れた python-dotenv 1.2.4)で、ダミーのキーを使って動作を確認しています

用語メモ
用語 ざっくりした意味
APIキー サービスが「あなたからの利用です」と見分けるための合言葉。漏れると他人に使われてしまう
環境変数 パソコンやサーバーの側に置いておける「名前と値」の設定
.env ファイル 環境変数にしたい値を書いておくテキストファイル
スクリプトプロパティ GASのプロジェクトごとに保存できる「名前と値」の設定

結論:キーは「コードの外」に置き、コードは名前で読むだけにする

考え方はPythonでもGASでも同じです。

キーを置く場所 コードでの読み方
Python .env ファイル(または環境変数) os.getenv("DEMO_API_KEY")
GAS スクリプトプロパティ PropertiesService.getScriptProperties().getProperty('DEMO_API_KEY')

コードには「DEMO_API_KEY という名前の値を使う」としか書かないので、コードを人に見せても、GitHubに置いても、キーそのものは出ていきません。

直書きと、.env・スクリプトプロパティの違い

Python編:.env と環境変数から読む

手順1:python-dotenv をインストールする

.env ファイルを読み込むために、python-dotenv というライブラリを使います。ターミナルで次を実行します。

  • 1
pip install python-dotenv

Debian / Ubuntu で「error: externally-managed-environment」と出た場合は、スクリプトのフォルダで仮想環境(venv)を作ってから入れます。

  • 1
  • 2
  • 3
  • 4
sudo apt install python3-venv
python3 -m venv .venv
source .venv/bin/activate
pip install python-dotenv
手順2:.env ファイルを作る

スクリプトと同じフォルダに、.env という名前のファイルを作り、次のように書きます。= の前後には空白を入れずに書いておくと確実です。

  • 1
  • 2
DEMO_API_KEY=demo-xxxxxxxxxxxxxxxx
DEMO_API_URL=https://api.example.com/v1/items
手順3:.gitignore に .env を追加する

Gitを使っているなら、ここがいちばん大事です。.gitignore は、Gitに記録しないファイル(=共有しないファイル)を書いておく設定ファイルです。プロジェクトの .gitignore に、次の2行を足します。python-dotenv の公式の説明でも、.env を .gitignore に入れることがすすめられています。

  • 1
  • 2
.env
.venv/

2行目の .venv/ は、仮想環境のフォルダをGitに入れないための行です。

git status に .env が出ず、.gitignore で無視されていることを確認した画面

代わりに、キーの名前だけを書いた .env.example を用意しておくと、ほかの人や未来の自分が「何を設定すればいいか」がわかって便利です。

  • 1
  • 2
DEMO_API_KEY=
DEMO_API_URL=https://api.example.com/v1/items
手順4:コードでキーを読み込む
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
import os

from dotenv import load_dotenv

load_dotenv()  # 同じフォルダ(か上の階層)にある .env を読み込む

api_key = os.getenv("DEMO_API_KEY")
api_url = os.getenv("DEMO_API_URL", "https://api.example.com/v1/items")

if not api_key:
    raise RuntimeError("DEMO_API_KEY が設定されていません。.env を確認してください")

headers = {"Authorization": f"Bearer {api_key}"}
print("APIキーを読み込みました(先頭4文字):", api_key[:4] + "****")
print("接続先:", api_url)

実行すると、「APIキーを読み込みました(先頭4文字): demo****」のように、キーの先頭4文字だけが表示されます。.env がないときは「DEMO_API_KEY が設定されていません」で止まります(どちらもDebian 13の検証環境で、ダミーのキーを使って確認)。キーがないまま先に進んで、よくわからないエラーになるのを防げます。

ポイントは次の3つです。

  • load_dotenv() は、.env の中身を環境変数として読み込みます
  • 公式の説明によると、すでに同じ名前の環境変数があるときは、上書きしません。サーバーでは環境変数、手元では .env という使い分けがそのままできます
  • キーを確認したいときも、print(api_key) のように全部表示しないようにしています。ログや画面共有から漏れるのを防ぐためです

環境変数がすでにあれば .env より優先される(override=True なら .env が優先)

今あるコードを書き換えるときは、AIにこう頼むと早いです。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
次のPythonコードには、APIキーが直接書かれています。
キーを .env ファイルから読み込む形に書き換えてください。

【条件】
- python-dotenv の load_dotenv() と os.getenv() を使う
- キーの名前は DEMO_API_KEY にする
- キーが読み込めなかったときは、わかりやすいメッセージで止める
- .env に書く内容の例と、.gitignore に追加する行も教えてください

【今のコード】
(ここに貼る。キーの部分は必ず「xxxx」に置き換えてから貼る)

GAS編:スクリプトプロパティから読む

GASには .env ファイルはありませんが、代わりにスクリプトプロパティを使います。

手順1:スクリプトプロパティにキーを登録する
  1. エディタ左側の「プロジェクト設定」(歯車のアイコン)を開く
  2. 「スクリプト プロパティを追加」をクリックする
  3. 「プロパティ」に DEMO_API_KEY、「値」にAPIキーを入れる
  4. 「スクリプト プロパティを保存」をクリックする
手順2:コードでキーを読み込む
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
function callDemoApi() {
  const apiKey = PropertiesService.getScriptProperties().getProperty('DEMO_API_KEY');
  if (!apiKey) throw new Error('スクリプトプロパティ DEMO_API_KEY が設定されていません');

  const response = UrlFetchApp.fetch('https://api.example.com/v1/items', {
    method: 'get',
    headers: { Authorization: `Bearer ${apiKey}` },
    muteHttpExceptions: true, // エラーのときも中身を確認できるようにする
  });

  console.log(`ステータス:${response.getResponseCode()}`);
  // キーそのものはログに出さない
}

api.example.com はダミーなので、このままでは実際のデータは返ってきません。使うサービスのURLと、そのサービスが求める認証の書き方(ヘッダー名など)に合わせて書き換えてください。

注意したいのは、スクリプトプロパティはそのプロジェクトを編集できる人なら見られることです。コードと分けて置けるのは大きな利点ですが、スクリプトを共同編集する相手には値が見えると考えておきましょう。プロパティに保存できる値の大きさにも上限があり、公式の割り当て表では1つの値あたり9KBです。


もしキーを公開してしまったら

ここが一番のつまずきポイントかもしれません。GitHubなどにキーを一度でも公開してしまったら、コードからキーを消すだけでは不十分です。Gitには過去の履歴が残るので、あとからでも見つけられてしまいます。

  1. まず、そのサービスの管理画面でキーを無効化(削除)して、新しいキーを発行する
  2. 新しいキーは .env やスクリプトプロパティに入れる
  3. 利用履歴や請求の画面で、身に覚えのない利用がないか確認する

いちばん先にやるのは「キーを無効化すること」です。履歴を消す作業より、こちらを優先しましょう。


つまずきやすい点

症状 原因 対処
os.getenv が None になる .env の場所が違う、または名前の打ち間違い スクリプトと同じフォルダ(または上の階層)にあるか、名前が完全に同じか確認する。Jupyterなどの対話環境では、実行中のフォルダから探す点にも注意
Windowsで .env を作ったのに読まれない ファイル名が .env.txt になっている 拡張子を表示する設定にして、ファイル名を確認する
.env の値を変えたのに反映されない 同じ名前の環境変数がすでにある(上書きしない仕様) 環境変数を確認する。必要なら load_dotenv(override=True)
.env がGitに入ってしまった .gitignore に追加する前にコミットした キーを無効化して再発行し、git rm --cached .env でGitの管理から外してコミットする
GASで「設定されていません」と出る プロパティ名の打ち間違い、または保存していない 「プロジェクト設定」で名前と値を確認する

困ったときは、状況を整理してAIに聞いてみてください。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
Pythonで python-dotenv を使って .env からAPIキーを読み込もうとしていますが、
os.getenv("DEMO_API_KEY") が None になります。

【フォルダの構成】
(例:myproject/main.py と myproject/.env)

【.env の中身】
(キーの値は「xxxx」に置き換えて貼る)

【実行している場所と方法】
(例:VS Codeのターミナルで、myproject フォルダから python main.py を実行)

考えられる原因を、確認しやすい順に教えてください。

まとめ

  • APIキーはコードに書かず、Pythonは .env と環境変数、GASはスクリプトプロパティに置く
  • .env は .gitignore に入れ、名前だけの .env.example を共有する
  • キーを公開してしまったら、まず無効化して再発行する

次の一歩は、今あるスクリプトの中から直書きのキーを1つ探して、.env かスクリプトプロパティに移してみることです。1回やってしまえば、次からは最初からこの形で書けるようになりますよ。


関連する本・記事

APIを使った自動化をGASで進めたい方は、『Google Apps Script × 生成AI 全自動仕事術』も参考になります。基本の自動化からAPI連携まで、生成AIに頼みながら進めたい方向けの1冊です。