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.txt
にAPIキーを格納しておき、そのファイルの内容を読み込む作業を行っています。
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
ではどのように環境変数を使用するのかなと思い実験をしてみましたが、セキュア機能というものがあり、コード公開時のうっかりも防げる良い機能ですね。