データ活用

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

2023年8月24日

この記事では、PythonでAPIを使うときに必要になる APIキーを安全に管理する方法 を解説します。

APIキーをコードに直接書くと、GitHubへの誤公開やファイル共有によって第三者に漏れるリスクがあります。この記事では、.envconfig.ini を使って、APIキーをコード本体から分離して管理する方法を紹介します。

この記事でできること

  • APIキーをコードに直書きしない理由を理解する
  • .env を使ってAPIキーを読み込む
  • config.ini を使って複数サービスのキーを管理する
  • .gitignore でAPIキー入りファイルを除外する
  • YouTube / Steam / OpenAI APIなどで使い回せる管理方法を整理する

想定読者

  • PythonでAPIキーを扱う記事を実行したい方
  • YouTube Data API、Steam Web API、OpenAI APIなどを使う予定がある方
  • APIキーをコードに直接書いてよいのか不安な方
  • GitHubなどに誤ってAPIキーを公開したくない方

APIキーをコードに直書きしない理由

APIキーは、外部サービスを利用するための認証情報です。サービスによっては、APIキーを使ってデータ取得、課金対象のリクエスト、利用量の管理などが行われます。

そのため、以下のようにコード内へ直接書く方法は避けた方が安全です。

API_KEY = "AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

このように書いてしまうと、ファイルを共有したり、GitHubへアップロードしたりしたときに、APIキーも一緒に公開される可能性があります。

APIキー直書きの主なリスク

  • 第三者に不正利用される
    APIキーが漏れると、自分のアカウントやプロジェクトの利用枠を使われる可能性があります。
  • Gitの履歴に残る
    一度コミットすると、後から削除しても履歴に残る場合があります。
  • キーの差し替えが面倒になる
    コード内に複数箇所書いていると、キー変更時の修正漏れが起きやすくなります。
  • 複数環境で管理しづらい
    ローカルPC、本番環境、検証環境で別のキーを使いたい場合に扱いづらくなります。

APIキー管理の基本方針

APIキーは、コード本体とは別ファイルに保存し、Python側から読み込む形にすると管理しやすくなります。

方法向いている用途特徴
.envAPIキーやトークンの管理シンプルで、多くのPythonプロジェクトで使いやすい
config.ini複数サービスや設定値の管理セクションごとに設定を分けやすい
環境変数本番環境やサーバー運用ファイルにキーを置かずに管理できる

個人の分析用スクリプトでは、まずは .env を使う方法がわかりやすいです。複数サービスのキーや設定値をまとめて管理したい場合は、config.ini も便利です。

方法1:.envでAPIキーを管理する

まずは、シンプルな .env を使う方法です。YouTube Data API、OpenAI API、Steam Web APIなど、1つずつキーを読み込む用途に向いています。

python-dotenvをインストールする

pip install -U python-dotenv

.envファイルを作成する

Pythonスクリプトと同じフォルダに、.env というファイルを作成します。

YOUTUBE_API_KEY=YOUR_YOUTUBE_API_KEY
STEAM_API_KEY=YOUR_STEAM_API_KEY
OPENAI_API_KEY=YOUR_OPENAI_API_KEY

YOUR_... の部分を、自分のAPIキーに置き換えてください。値を引用符で囲まなくても読み込めます。

Pythonから.envを読み込む

import os

from dotenv import load_dotenv

load_dotenv()

youtube_api_key = os.getenv("YOUTUBE_API_KEY")
steam_api_key = os.getenv("STEAM_API_KEY")
openai_api_key = os.getenv("OPENAI_API_KEY")

print("YouTube API key loaded:", youtube_api_key is not None)
print("Steam API key loaded:", steam_api_key is not None)
print("OpenAI API key loaded:", openai_api_key is not None)

実際のAPIキーをそのまま print() で表示するのは避け、読み込めたかどうかだけ確認するのがおすすめです。

方法2:config.iniでAPIキーを管理する

config.ini は、セクションごとに設定を分けたい場合に便利です。たとえば、YouTube、Steam、OpenAIのようにサービスごとに設定を整理できます。

configparser はPythonの標準ライブラリなので、追加インストールなしで利用できます。

config.iniファイルを作成する

Pythonスクリプトと同じフォルダに、config.ini というファイルを作成します。

[YOUTUBE]
API_KEY = YOUR_YOUTUBE_API_KEY

[STEAM]
API_KEY = YOUR_STEAM_API_KEY

[OPENAI]
API_KEY = YOUR_OPENAI_API_KEY

複数のサービスを扱う場合は、このようにセクションを分けると見通しがよくなります。

Pythonからconfig.iniを読み込む

from pathlib import Path
import configparser

config_path = Path("config.ini")

if not config_path.exists():
    raise FileNotFoundError("config.ini が見つかりません。")

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

youtube_api_key = config["YOUTUBE"]["API_KEY"]
steam_api_key = config["STEAM"]["API_KEY"]
openai_api_key = config["OPENAI"]["API_KEY"]

print("YouTube API key loaded:", bool(youtube_api_key))
print("Steam API key loaded:", bool(steam_api_key))
print("OpenAI API key loaded:", bool(openai_api_key))

この例では、config.ini が存在しない場合にエラーを出すようにしています。設定ファイルが見つからないまま処理が進むのを防げます。

.envとconfig.iniの使い分け

どちらもAPIキーをコードから分離する方法ですが、用途によって向き不向きがあります。

項目.envconfig.ini
シンプルさ高いやや設定向け
複数サービスの整理変数名で管理セクションで管理しやすい
Pythonでの読み込みpython-dotenv を使う標準ライブラリで読める
おすすめ用途APIキーやトークン管理APIキー以外の設定もまとめる場合

このサイト内の記事では、YouTube Data APIやOpenAI APIのようなAPIキー管理では .env を使う例を多めにしています。一方で、複数の設定値をセクションごとに整理したい場合は config.ini も有効です。

.gitignoreでAPIキー入りファイルを除外する

.envconfig.ini にAPIキーを書く場合は、GitHubなどへ誤ってアップロードしないように .gitignore に追加しておきます。

.env
config.ini

すでにGitで管理してしまった後に .gitignore へ追加しても、過去の履歴から完全に消えるわけではありません。APIキーを誤って公開した可能性がある場合は、キーを無効化して再発行するのが安全です。

サンプルファイルを共有する場合

他の人に設定例を共有したい場合は、本物のAPIキーを書いたファイルではなく、サンプル用のファイルを作ります。

たとえば、.env.example を作成します。

YOUTUBE_API_KEY=your_youtube_api_key_here
STEAM_API_KEY=your_steam_api_key_here
OPENAI_API_KEY=your_openai_api_key_here

config.ini を使う場合は、config.example.ini のような名前にします。

[YOUTUBE]
API_KEY = your_youtube_api_key_here

[STEAM]
API_KEY = your_steam_api_key_here

[OPENAI]
API_KEY = your_openai_api_key_here

本物のキーを入れたファイルではなく、サンプルファイルだけを共有することで、手順を説明しながらキー漏洩を防ぎやすくなります。

APIキーを漏らしてしまった場合

APIキーをGitHub、ブログ記事、スクリーンショット、共有ファイルなどに載せてしまった場合は、以下の対応を検討します。

  • 該当APIキーを無効化または削除する
  • 新しいAPIキーを再発行する
  • 利用状況や課金状況を確認する
  • 必要に応じてAPIキーに制限を設定する
  • 公開リポジトリや記事本文からキーを削除する

漏洩した可能性があるAPIキーは、そのまま使い続けない方が安全です。

YouTube Data APIで使う例

以下は、.env からYouTube APIキーを読み込み、YouTube Data APIを呼び出す最小例です。

import os

from dotenv import load_dotenv
from googleapiclient.discovery import build

load_dotenv()

api_key = os.getenv("YOUTUBE_API_KEY")

youtube = build("youtube", "v3", developerKey=api_key)

response = youtube.videos().list(
    part="snippet,statistics",
    id="dQw4w9WgXcQ",
).execute()

print(response.get("items", [])[0]["snippet"]["title"])

YouTube Data APIの使い方は、以下の記事で詳しく紹介しています。

YouTube Data API v3入門|APIキー発行からPythonで動画情報を取得するまで

Steam Web APIで使う例

Steam Web APIキーも、同じように外部ファイルで管理できます。

Steam Web APIキーの取得方法は、以下の記事で紹介しています。

Steam Web APIキーの取得方法

つまずきやすいポイント

.envやconfig.iniの保存場所が違う

Pythonスクリプトを実行している場所と、設定ファイルを置いている場所が違うと、読み込めない場合があります。まずはスクリプトと同じフォルダに置いて動作確認するのがおすすめです。

キー名がコードと一致していない

.env 側で YOUTUBE_API_KEY と書いているのに、Python側で YT_API_KEY を読みに行くと取得できません。ファイル側のキー名とコード側の名前を一致させてください。

APIキーをprintしてしまう

動作確認のためにAPIキーをそのまま表示すると、スクリーンショットやログに残る可能性があります。読み込めたかどうかは、api_key is not Nonebool(api_key) で確認するのがおすすめです。

.gitignoreに追加する前にコミットしてしまった

一度公開リポジトリにAPIキーを含むファイルをコミットした場合、後から削除しても履歴に残る可能性があります。APIキーを再発行し、古いキーを無効化することを検討してください。

次に読む記事

まとめ

この記事では、PythonでAPIキーを安全に管理する方法として、.envconfig.ini を使う方法を紹介しました。

APIキーはコードに直書きせず、外部ファイルから読み込む形にすると、漏洩リスクを下げつつ、複数サービスのキーを管理しやすくなります。個人の分析スクリプトではまず .env を使い、複数サービスの設定を整理したい場合は config.ini を使うとよいです。

-データ活用