APIキーを安全に扱う!Google Colabでアクセスキーをセキュアに使用する方法

Google Colaboratory(以下Colab)でAPIにアクセスするコードを書こうかなと思ってみたのですが、一般的なコード例では環境変数APIキーを設定して、環境変数の読み出しによって取得するような書き方をしますが、Colabの場合だとソース(ノートブック)にあらわれてくるのでどうすればいいのかなと悩んだので、ちょっと調べてみました。

Colabでも環境変数は使用できる…けど…。

Colabの環境でも環境変数を使用することは可能です。

import os

# 環境変数の設定
os.environ['MY_VARIABLE'] = 'my_value'

# 環境変数の取得
my_var = os.environ.get('MY_VARIABLE')
print(my_var)  # 出力: my_value

os.environを使用すれば確かに使うことができます。ただ、これでは値が丸見えになってしまい、そのままノートブックに埋め込むのと全く変わらないですよね。これはできれば避けたいなあと。

ノートブックに値を直接埋め込まない手ってあるの?

(方法その1)getpassモジュールを使って手動で入力

原始的方法ですが、実行中にgetpassモジュールを使ってユーザーから手動で機密情報を入力してもらう方法があります。

import getpass
import os

# ユーザーに手動で入力してもらう
api_key = getpass.getpass('Enter your API key: ')

# 環境変数として設定
os.environ['API_KEY'] = api_key

# 環境変数の取得
my_var = os.environ.get('API_KEY')
print(my_var)  # 出力: 手動入力した値

この方法を使うことで、Colabノートブック内で機密情報を隠蔽し、安全に使用することができますが、実行のたびに手動入力する手間がかかります。APIキーなどのようにほぼ固定する値であれば、手間もあまりかからないとは思いますが、できれば避けたいですね。

(方法その2)Googleドライブに保存されたファイルから読み込む

続いてはGoogleドライブに情報を保存し、ノートブック内でそのファイルを読み込む方法です。

APIキーをGoogleドライブのapi_key.txtのようなファイルに格納し、Googleドライブにアップロードしておきます。以下では/content/drive/MyDrive/api_key.txtAPIキーを格納しておき、そのファイルの内容を読み込む作業を行っています。

from google.colab import drive
import os

# Googleドライブをマウント
drive.mount('/content/drive')

# ファイルからAPIキーを読み込む
with open('/content/drive/MyDrive/api_key.txt', 'r') as file:
    api_key = file.read().strip()

# 環境変数として設定
my_var = os.environ['API_KEY'] = api_key
print(my_var)  # 出力: Googleドライブ内のファイル('api_key.txt')に格納した値

確かにファイル内に格納することで情報の保護はできるかなと思います。

まあ、そういう手もありますよねって感じで。

(方法その3)Colabのシークレット機能

Colab環境変数、ファイルパス、APIキーといった情報をセキュアに使用できるシークレット機能が追加されたようです。このシークレット機能によってに保存された値は非公開で、自分と自分が選択したノートブックでのみ利用できます。ノートブックと紐づけをすることで使用できる機能なのでうっかりミスを防ぐことができます。これが正解なのでしょう

シークレット機能を使用するにはColabの左サイドにある【鍵アイコン】をクリックします。

クリックすると設定ペインが開くので

そこでキーを入力し有効化(左側の【ノートブックからのアクセス】スイッチをONへ変更)します。

この設定後、以下のようなコードでにアクセスすることができます。

from google.colab import userdata

my_var = userdata.get('API_KEY')
print(my_var)  # 出力: シークレット機能で設定をした値

おわりに

生成系AIやAPIの使用ではアクセスキーをコードに埋め込まないのが得策ですが、そもそもOSが直接動作しているというわけでもないので、Colabではどのように環境変数を使用するのかなと思い実験をしてみましたが、セキュア機能というものがあり、コード公開時のうっかりも防げる良い機能ですね。

/* -----codeの行番号----- */