見出し画像

Django×GitHub_APIキー等の機密性が高い情報だけGitHubに公開しない方法 135日目

作成中のTweepyアプリをGitHubに公開しました。まだまだブラッシュアップの途中ではありますが。


公開にあたり、APIキーなどの情報を漏洩するわけにはいかないので、特定のファイルを除いてGitHubに保存する方法を探して実装しました。


大きく以下の流れです。

  1. 予約された環境変数である「DATABASES」や「SECLET_KEY」を「.env」ファイルに格納して、settings.py側で読み込み

  2. APIキーなどの情報を「local_secret_settings.py」というファイルを新たに作って格納して、settings.py側で読み込んで環境変数にする

  3. 環境変数にしたAPIキーを、実際にAPIを使用する「tweepy.py」側でインポートして使用

  4. GitHubにプッシュする際は「.env」と「local_secret_settings.py」は無視するように「gitignore」で設定


予約された環境変数を別ファイルで管理

この2つは「.env」ファイルに格納し、それを読み込む形にしています。
DATABASESは、MySQLを使用しているのでユーザーIDやパスワードを隠すために「.env」を使っています。

[.env]

DATABASE_URL=mysql://ユーザー名:パスワード@localhost/tweepy_test
SECRET_KEY=django-insecure-ybqy+ch=k$jbpk&uvbs9bz77@bb(n^3^1nu-^q*60w)!emk1=e

ちなみにデータベース設定の部分は「dj-database-url」の記法に基づいています。

https://vector-ium.com/django-environ/

この「.env」ファイルを読み込んで使うには以下のようにenvironというライブラリを使用できます。

[settings.py] 
 
# pip install django-environで事前にインストールしておく必要がある
import environ

# まずインスタンスを作る
env = environ.Env()
env.read_env('.env')
 
# .envファイルから該当の環境変数を呼び出す
SECRET_KEY = env('SECRET_KEY')
 
# データベースのOPTIONSや
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
        'CONN_MAX_AGE': 600,
        'OPTIONS': {
            'sql_mode': 'STRICT_TRANS_TABLES',
            'charset': 'utf8mb4',
        }
    }
}

# .envにあるUSERやPASSWORDなどの環境変数を分解してインポートしてくれる
db_from_env = env.db()
# インポートした内容でdefaultをアップデートする
DATABASES['default'].update
(db_from_env)

これで機密性の高い情報を環境変数から読み込むことができました。


機密性の高い情報を環境変数にして管理

DATABASESなどは元々環境変数として存在していますが、それ以外にもAPIキーなど機密性の高い情報はクローズにしておきたいと思います。今回は別ファイルにそれらをまとめ、そのファイルはGitHubにアップしないようにすることで実現しました。

まずAPIキーなどをまとめるファイルを作ります。ファイル名は何でもよいです。

[local_secret_settings.py]
 
API_KEY       = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
API_SECRET    = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
ACCESS_KEY    = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
ACCESS_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXX"

次にこれをsettings.pyでインポートして環境変数として設定します。
ちなみにDEBUGがFalseなら動くようにしています。Djangoの設定でDEBUGをFalseにしておくと、エラー時に詳細が表示されなくなります。逆にTrueだと詳細が表示されてしまい、APIキーの情報などが諸々出てしまうので、本番環境では必ずFalseにしておく項目です。

[settings.py]
 
# local_secret_settingsファイルは公開しない(gitignore)ファイルであるため、ファイルがなくてロードされなければパスする
try:
    from .local_secret_settings import API_KEY, API_SECRET, ACCESS_KEY, ACCESS_SECRET
except ImportError:
    pass

import os

# DEBUG = Trueだとエラー内容が詳細に出てしまいトークン情報などが漏れる可能性があるため、Falseの場合のみ読み込む
# os.environを使えばこのプログラム上でのみ働く環境変数として設定できる(OSの環境には影響しない)
if not DEBUG:
    os.environ['API_KEY']       = API_KEY
    os.environ['API_SECRET']    = API_SECRET
    os.environ['ACCESS_KEY']    = ACCESS_KEY
    os.environ['ACCESS_SECRET'] = ACCESS_SECRET

環境変数として設定できたので、tweepyを使うファイルでインポートして活用できます。コードの上の方です。

[tweepy.py]
 
import tweepy
from django.conf import settings

def get_tweets(searchkey, location, item_num):
    api_key       = settings.API_KEY
    api_secret    = settings.API_SECRET
    access_key    = settings.ACCESS_KEY
    access_secret = settings.ACCESS_SECRET

    auth = tweepy.OAuth1UserHandler(api_key, api_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)
   
    search_criteria = "{0} {1}".format(searchkey, location)

    # API連携してツイート情報を収集(位置情報はqueryオペレーターに入れる)
    # fromDate入れないと過去30日遡ってしまう。。
    tweets = tweepy.Cursor(api.search_30_day, label='test1', query=search_criteria, fromDate='202203080000').pages(item_num)

   ~ 以下はツイートデータを取り込むためのプログラム色々 ~
  ~ 省略 ~

ここまでで機密性の高い情報を別ファイルに分けて管理できるようになりました。


gitignoreで特定ファイルを除いてgithubにプッシュ

githubはバージョン管理などにとても便利ですが、公開設定する場合はAPIキー等の情報が漏洩しないように気を配る必要があります。そのため「.gitignore」というファイルに公開したくないファイルを指定できるようになっています。

「.git」ファイルと同じディレクトリに「.gitignore」という名前でファイルを作成し、その中にgithubに上げたくないファイル名を指定します。今回は機密性の高い情報が入っている「.env」と「local_secret_settings.py」を指定します。

[.gitignore]
 
.env
local_secret_settings.py

これだけでOKです。プッシュする前に確認したいと思うので、そんな時は以下のコードで無視されているファイルを確認することができます。

git ls-files --other --ignored --exclude-standard


ここまでお読みいただきありがとうございました!!


参考


この記事が気に入ったらサポートをしてみませんか?