データ取得

APIキーを外部ファイルで管理する方法|.envとconfig.iniの使い分け

2023年8月24日

この記事では、PythonでAPIを使うときに、APIキーやアクセストークンをコードへ直接書かず、外部ファイルで管理する方法をまとめます。

YouTube Data API、Steam Web API、各種クラウドAPIなどを使う場合、APIキーは接続に必要な認証情報です。サンプルコードに直接書くと動作確認は簡単ですが、そのままGitHubやブログ記事、共有フォルダに置くと漏えいにつながります。

この記事でできること

  • APIキーをコードから分離する理由を整理する
  • .env ファイルでAPIキーを管理する
  • config.ini で通常設定と秘密情報を分けて扱う
  • .gitignore で誤コミットを防ぐ
  • APIキーを使う記事やノートブックで再利用しやすい形にする

APIキーをコードに直接書かない理由

APIキーは、サービスによっては利用量や課金、クォータ、アカウント制限と結びつきます。公開リポジトリや記事内に残すと、第三者に使われる可能性があります。

# 避けたい例
API_KEY = "AIzaSyxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

個人の学習用コードでも、後からGitHubに上げる、ノートブックを共有する、記事用にコードを貼る、といった場面があります。最初から外部ファイルに分けておくほうが安全です。

.envとconfig.iniの使い分け

ファイル向いている内容公開可否
.envAPIキー、トークン、パスワードなどの秘密情報公開しない
config.ini出力先、取得件数、対象チャンネルIDなどの通常設定秘密情報がなければ公開しやすい
.env.example必要な環境変数名の見本公開してよい

判断基準は単純です。漏れたら困るものは .env、漏れても問題ない実行設定は config.ini に置きます。

.envでAPIキーを管理する

まず、プロジェクト直下に .env を作成します。

YOUTUBE_API_KEY=ここにAPIキーを書く
STEAM_API_KEY=ここにAPIキーを書く

値をダブルクォートで囲む必要はありません。スペースや特殊文字を含む場合は、読み込み側のライブラリ仕様に合わせて調整します。

Pythonでは python-dotenv を使うと扱いやすいです。

pip install python-dotenv
import os
from dotenv import load_dotenv

load_dotenv()

youtube_api_key = os.getenv("YOUTUBE_API_KEY")

if not youtube_api_key:
    raise RuntimeError("YOUTUBE_API_KEY が設定されていません")

print("APIキーを読み込みました")

実際のキーは出力しないようにします。確認用に表示する場合でも、先頭数文字だけに留めます。

.env.exampleを用意する

.env は公開しませんが、どの環境変数が必要かは共有したいことがあります。その場合は .env.example を用意します。

YOUTUBE_API_KEY=
STEAM_API_KEY=

実際の値は空欄にします。これなら、記事やリポジトリに載せても秘密情報は含まれません。

.gitignoreで誤コミットを防ぐ

Gitを使う場合は、.env を必ず .gitignore に追加します。

.env
.env.*
!.env.example

この設定では、実際の .env は無視し、見本用の .env.example だけ管理対象にできます。

すでにGitに追加してしまった場合は、.gitignore に書くだけでは履歴から消えません。キーを無効化・再発行し、必要に応じて履歴から削除する対応が必要です。

config.iniで通常設定を管理する

取得対象や出力先など、秘密ではない設定は config.ini に分けると見通しがよくなります。

[youtube_api]
channel_id = UCxxxxxxxxxxxxxxxxxxxxxx
max_results = 50

[output]
csv_path = outputs/videos.csv

Pythonでは標準ライブラリの configparser で読み込めます。

import configparser

config = configparser.ConfigParser()
config.read("config.ini", encoding="utf-8")

channel_id = config["youtube_api"]["channel_id"]
max_results = config["youtube_api"].getint("max_results")
csv_path = config["output"]["csv_path"]

print(channel_id, max_results, csv_path)

config.ini にAPIキーを入れることも技術的には可能ですが、公開しやすい通常設定と秘密情報が混ざります。基本は、秘密情報は .env、通常設定は config.ini に分けるほうが管理しやすいです。

YouTube Data APIで使う例

YouTube Data APIの記事では、APIキーを次のように読み込みます。

import os

import requests
from dotenv import load_dotenv

load_dotenv()

API_KEY = os.getenv("YOUTUBE_API_KEY")

if not API_KEY:
    raise RuntimeError("YOUTUBE_API_KEY が設定されていません")

url = "https://www.googleapis.com/youtube/v3/videos"
params = {
    "part": "snippet,statistics",
    "id": "dQw4w9WgXcQ",
    "key": API_KEY,
}

response = requests.get(url, params=params, timeout=30)
response.raise_for_status()

data = response.json()
print(data["items"][0]["snippet"]["title"])

記事やサンプルコードでは、実際のAPIキーを載せず、YOUTUBE_API_KEY のような環境変数名だけを示します。

公開用コードで注意すること

  • APIキーをコードに直接書かない
  • APIキーをスクリーンショットに写さない
  • Notebookの出力セルにAPIキーを残さない
  • ブラウザで実行されるJavaScriptに秘密キーを埋め込まない
  • 漏えいした可能性がある場合は、キーを再発行する

特にブラウザで動くコードは、利用者から中身が見えます。秘密にしたいキーは、サーバー側やローカル環境で扱う前提にします。

管理方法の目安

状況おすすめ
個人PCでPythonを実行.env + python-dotenv
取得対象や出力先も変えたい.env + config.ini
GitHubにサンプルを置く.env.example を公開し、.env は除外
複数人で共有する各自でAPIキーを発行し、共有フォルダに秘密情報を置かない

関連記事

まとめ

APIキーは、コードに直接書かず、.env などの外部ファイルで管理します。秘密情報は .env、通常設定は config.ini、共有用の見本は .env.example に分けると、記事用コードや分析用ノートブックでも扱いやすくなります。

最初は少し手間に見えますが、YouTube Data APIやSteam APIなど複数の記事で同じ形式を使えるため、後からの管理が楽になります。

-データ取得