0. はじめに
CP4DaaSのWatson Machine Learning(WML)でスコアリングするアプリケーションに、誰からでもアクセスさせないようにIPアドレスの制限をかける方法を解説します。
2024年10月時点では、WMLのサービス自体にはIPアドレスを制限する機能はありませんので、IAMのIPアドレスの制限機能をつかって実現します。
具体的には
- WMLのサービスをもつAccoutのオーナーであるユーザーAでデプロイメントを準備
- 別のユーザーBをアカウントに招待し、
- ユーザーBのAPIキーを作り、
- そのユーザーBにIAMでIPアドレス制限をかけることで実現します。
ユーザーBのAPIキーはユーザーBと同じ権限を持つ(つまりIPアドレスを制限される)ことを利用しています。
- テスト環境
- CP4DaaS
- jp-tok
1. 事前準備
以下の記事を参考にユーザーA(この例ではkawa's Account)のアカウントでWMLのオンライン・デプロイメントを作成しておきます。
参考: Watson Machine LearningにPython関数をデプロイする #watsonx.ai - Qiita
ユーザーA(この例ではkawa's Account)で「Deployment of function」を作成しました。
2. ユーザーBをユーザーAのアカウントに招待する
IBM CloudのIAMのユーザーで、ユーザーB(この例では2017 testuser)をユーザーAのアカウント(この例ではkawa's Account)に招待をして追加します。
参考:アカウントへのユーザーの招待
3. ユーザーBでAPIキーを作成
WMLのオンライン・デプロイメント(Function)の実行をibm_watsonx_aiのAPIで行うのでAPIキーが必要です。
IBM CloudのIAMのAPIキーで、ユーザーB(この例では2017 testuser)のAPIキーを作成します。
3-1. ユーザーBのAPIキーでユーザーAのAccountのWMLのオンライン・デプロイメントを実行する。
1で準備したユーザーA(この例ではkawa's Account)の「Deployment of function」をユーザーBのAPIキーで実行します。
以下のようなpythonスクリプトで実行します。ポイントはapi_key
に#3で作ったユーザーB(ここでは2017 testuser)のAPIキーdcxxxxxxxxxxxxxx
を用いていることです。
import pprint
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai import APIClient
# 環境設定
api_key = 'dcxxxxxxxxxxxxxx' # 2017 testuser
url = 'https://jp-tok.ml.cloud.ibm.com'
space_id = '1bee1486-8dc0-462a-a85d-456133d33ca7' # 240814dp_kawa
deployment_id = '3fc75bbf-3ebf-4a6f-a267-c55e1f4e8ef4' # Deployment of function
# WMLへの接続
credentials = Credentials(
api_key=api_key,
url=url
)
client_space = APIClient(credentials, space_id=space_id)
# テストスコアリング
scoring_payload = {
"input_data": [{
'values': 'test'
}]
}
response = client_space.deployments.score(deployment_id, scoring_payload)
pprint.pprint(response["predictions"])
ちゃんと実行できることがわかります。
C:\Functiontest\Functiontest>py -3.10 DeployableFunctionTest_onlyscore.py
[{'values': [['Just a test']]}]
4. ユーザーBでIPアドレスのアクセスの制限を行う
ユーザーBのアカウント(ここではtestuser2017's Account)でIBM CloudのIAMのユーザーで、ユーザーB(ここでは2017 testuser)を選びます。
「IPアドレスのアクセス」で「許可されたIPの追加」をします。
4-1. 許可されたIPからのアクセス
CMANのサイトなどで現在のGlobalIPを確認します。
許可されたIPからのアクセスなので、ちゃんと実行できることがわかります。
C:\Functiontest\Functiontest>py -3.10 DeployableFunctionTest_onlyscore.py
[{'values': [['Just a test']]}]
4-2. 許可されたIP外からのアクセス
IPアドレスの違う環境からアクセスしてみます。
IPアドレスが許可されたリストに入っていないため、「Error getting IAM Token」のエラーになり実行できません。ちゃんとIPアドレスの制限できたことが確認できました。
C:\Functiontest>py -3.10 DeployableFunctionTest_onlyscore.py
Error getting IAM Token.
Reason: <Response [401]>
Traceback (most recent call last):
File "C:\Functiontest\DeployableFunctionTest_onlyscore.py", line 23, in <module>
client_space = APIClient(credentials, space_id=space_id)
File "C:\Users\dsuser\AppData\Local\Programs\Python\Python310\lib\site-packages\ibm_watsonx_ai\client.py", line 365, in __init__
self.service_instance: ServiceInstance = ServiceInstance(self)
File "C:\Users\dsuser\AppData\Local\Programs\Python\Python310\lib\site-packages\ibm_watsonx_ai\service_instance.py", line 56, in __init__
self._client.token = self._get_token()
File "C:\Users\dsuser\AppData\Local\Programs\Python\Python310\lib\site-packages\ibm_watsonx_ai\service_instance.py", line 237, in _get_token
return self._create_token()
File "C:\Users\dsuser\AppData\Local\Programs\Python\Python310\lib\site-packages\ibm_watsonx_ai\service_instance.py", line 273, in _create_token
return self._get_IAM_token()
File "C:\Users\dsuser\AppData\Local\Programs\Python\Python310\lib\site-packages\ibm_watsonx_ai\service_instance.py", line 345, in _get_IAM_token
raise WMLClientError("Error getting IAM Token.", response)
ibm_watsonx_ai.wml_client_error.WMLClientError: Error getting IAM Token.
Reason: <Response [401]>
注意
注意1:IPアドレスの設定は慎重に
IPの許可リストには必ず接続できるIPアドレスを記載してください。間違ったアドレスをいれるとIBM Cloudのコンソールにもログインできなくなるため、IPの許可リストは修正もできませんし、Caseも起票できなくなります。
どうしても接続できなくなってしまった場合には以下から解除をリクエストしてください。
https://watson.service-now.com/x_ibmwc_open_case_app.do#!/create
注意2:制限できるのはIPアドレスを制限したユーザーのAPIキーのみ
制限できるのはIPアドレスを制限したユーザーのAPIキーのみです。例えば、このテストケースで、ユーザーAやまた別のユーザーCでAPIキーを作っていた場合はそのAPIキーでアクセスした場合にはIP制限はかかりません。できるかぎりIP制限をかけていないユーザーでは、APIキーはつくらないような運用を考えることを推奨します。
参考
Cloud Pak for Data as a Service へログイン可能なIPアドレスを制御する #ibmcloud - Qiita
Watson Studioにアクセス可能なIPアドレスを制限する方法です。
Watson Studio(CP4DaaS)へのログイン可能なIPアドレスを制限する場合の注意点 #IPv6 - Qiita
注意点があります。
IBM Cloud: IAMにおけるIBM Cloud ConsoleへのIPアドレスによるアクセス制限方法 #ibmcloud - Qiita
特定の IP アドレスの許可
Watson Machine LearningにPython関数をデプロイする #watsonx.ai - Qiita