watsonx.ai StudioのJupyter Notebookで環境変数をファイルから読み込む


CP4DaaSでwatsonx.ai StudioのJupyter Notebookで環境変数を読み込む方法を考えます。
APIKEYなどをプログラムにハードコーティングするのは再利用やセキュリティの観点から望ましくありません。そのため環境変数を別途定義して、Notebookから読み込んで使うことが多いと思います。

watsonx.ai Studioでは環境テンプレートの中に環境変数を記述する方法は[この記事](https://qiita.com/spssfun2017/items/09818816ee97c2872a36)で紹介したのですが、複数の環境テンプレートがある場合には、一つのファイルに記述した環境変数を読みたいということもあると思います。

この記事では環境変数を書いたファイルをプロジェクトの資産として配置してそのファイルから環境変数を読み込んでみます。

# 環境変数を書いたファイルのアップロード
以下のように環境変数を書いたファイル（ここではconfig.env）をローカルに用意します。
```config.env
APIKEY=xxxxx
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bb447447-ef42-4d6b-9513-9e3dcf214989.png)

プロジェクトの資産タブの「アップロード」アイコンをクリックし、ファイルをドラッグアンドドロップしてアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9e451822-34f4-4716-b163-aca3cfcf0ff6.png)

以下のようにアップロードされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c52dc941-2739-40a4-8053-4b6860c1815c.png)

# プロジェクト・アクセス・トークンの発行
次に、プロジェクト内のファイルにアクセスするために必要な[プロジェクト・アクセス・トークン](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/token.html?context=cpdaas&locale=ja&audience=wdp)を準備します。


プロジェクトの管理タブの「アクセス制御」の「アクセス・トークン」から「新規アクセス・トークン」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2dbbec08-edfd-4727-909f-4686b390f53a.png)


適当な名前を付けます。（ここでは250326wstoken）。使いたいロールを`Editor`か`Viewer`かを選択します。環境変数の書かれたファイルを読み取るだけなら`Viewer`で構いません。「作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d02b4ada-ef3c-4207-b509-dd96ec017af7.png)

以下のように`^`ボタンを開くとトークンが作られています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ee7ed725-e096-49a1-abb0-ac7e5b5ac56e.png)

これをコピーしておいてもよいのですが、watsonx.ai StudioのJuypter Notebookにはこのトークンを自動挿入する機能がありますのでそれを使ってみます。

# Notebookでの環境変数取得
新規のNotebookを作成します。
適当な名前をつけ、「作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5d072124-e445-4b86-9156-da9eeaf79ae9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0ecab3c6-a170-475a-afd8-760383a03a0d.png)

アクション・バーの「...」のメニューから「プロジェクト・トークンの挿入」をクリックします。

以下のように`access_project_or_space`にアクセス・トークンが記載され、wslibというオブジェクトができます（ちなみにここではprojectというオブジェクトもできていますが、現在は非推奨であるため、wslibを使います）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/aab8f6f9-0647-438f-8abe-1139820631b1.png)

これで`wslib.download_file`でプロジェクトからNotebookの動く仮想環境にファイルがダウンロードできます。
```python
wslib.download_file("config.env")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/11796faf-31b8-4ec1-b4d5-dac9bdbc43a5.png)

後は`dotenv`で環境変数を書いたファイルを読み込み、`os.environ.get`で環境変数を読むことができます。
```python
from dotenv import load_dotenv
load_dotenv('config.env')
import os
os.environ.get("APIKEY")
```

![{B3492185-19AE-45B3-A4FF-E546BB3DD6B5}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b445f810-d7a3-4937-97d0-2b6913f491dc.png)

# 環境テンプレートとのあわせ技

ちなみにこの方法だとアクセス・トークンがハード・コーディングされてしまうのが、嫌かもしれません。
その場合、アクセス・トークンだけでも環境テンプレートの環境変数に書いておくという方法もあると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6c50add6-00ed-4531-ad30-8e68d948215d.png)


```python
import os
TOKEN = os.environ.get("TOKEN")

from ibm_watson_studio_lib import access_project_or_space
wslib = access_project_or_space({'token':TOKEN})

wslib.download_file("config.env")
from dotenv import load_dotenv
load_dotenv('config.env')
os.environ.get("APIKEY")
```
TOKENを環境テンプレートから取り出して、APIKEYはconfig.envから取り出しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c7fc96dd-f7bd-47fb-a603-fd169f9cc7d2.png)


# 参考

#### watsonx.ai StudioのJupyter Notebookで環境変数を読み込む #Watson-Studio - Qiita 

https://qiita.com/spssfun2017/items/09818816ee97c2872a36

#### ibm-watson-studio-lib ( Python 用) - Docs | IBM Cloud Pak for Data as a Service 

https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/ws-lib-python.html?context=cpdaas&locale=ja