ベクトルデータベースであるMilvus Standalone版はデフォルトでユーザー認証が有効化されていません。
当記事ではDocker composeで導入したMilvus(=Standalone版)にユーザー認証を有効化する方法を説明します。
尚、Milvusは既にDocker composeで導入し、動作確認済みの想定です。
参考: M1 Mac上でcolimaを使ってベクトルDB Milvusをインストール(M1 Macである必要はありません)
Milvusのドキュメント「Authenticate User Access」に書いてある内容です。
1. configuration fileを設定
参考: Configure Milvus with Docker Compose
1.1 以下のコマンドでmilvus.yaml
をダウンロードします。
ここではダウンロードする場所は導入に使用するdocker-compose.yml
がある場所と同じにしておきます。
こちらの手順で導入したと想定して、ここでは~/milvus
にダウンロードします。
ダウンロードするコマンドは以下です(尚以下のv2.3.11
は自分の導入するバージョンに合わせて変更してください):
wget https://raw.githubusercontent.com/milvus-io/milvus/v2.3.11/configs/milvus.yaml
1.2 milvus.yaml
の編集
ダウンロードしたmilvus.yaml
の以下を2点を変更します(ただし2番目任意)。
-
common:
セクションのsecurity:
のauthorizationEnabled:
の値をfalse
からtrue
にします。 -
common:
セクションのsecurity:
の# superUsers: root
の先頭のコメントアウト#
を外して有効にします。- これは任意ですが、
superUsers
に設定したユーザーIDのみ、パスワード変更時に現在のパスワードが不要になります。通常、管理者がユーザーのパスワード変更する際は現在のパスワードは不明なことが多いですので、最低root
は定義しておいた方がよいかと思います。
- これは任意ですが、
変更前のmilvus.yaml
:
(最初の方は省略)
・ ・ ・
common:
chanNamePrefix:
cluster: by-dev
rootCoordTimeTick: rootcoord-timetick
rootCoordStatistics: rootcoord-statistics
rootCoordDml: rootcoord-dml
replicateMsg: replicate-msg
rootCoordDelta: rootcoord-delta
search: search
searchResult: searchResult
queryTimeTick: queryTimeTick
dataCoordStatistic: datacoord-statistics-channel
dataCoordTimeTick: datacoord-timetick-channel
dataCoordSegmentInfo: segment-info-channel
・ ・ ・
(そして間も省略)
・ ・ ・
# Default value: auto
# Valid values: [auto, avx512, avx2, avx, sse4_2]
# This configuration is only used by querynode and indexnode, it selects CPU instruction set for Searching and Index-building.
simdType: auto
security:
authorizationEnabled: false
# The superusers will ignore some system check processes,
# like the old password verification when updating the credential
# superUsers: root
tlsMode: 0
session:
ttl: 30 # ttl value when session granting a lease to register service
retryTimes: 30 # retry times when session sending etcd requests
(以下省略)
・ ・ ・
変更後のmilvus.yaml
:
(最初の方は省略)
・ ・ ・
common:
chanNamePrefix:
cluster: by-dev
rootCoordTimeTick: rootcoord-timetick
rootCoordStatistics: rootcoord-statistics
rootCoordDml: rootcoord-dml
replicateMsg: replicate-msg
rootCoordDelta: rootcoord-delta
search: search
searchResult: searchResult
queryTimeTick: queryTimeTick
dataCoordStatistic: datacoord-statistics-channel
dataCoordTimeTick: datacoord-timetick-channel
dataCoordSegmentInfo: segment-info-channel
・ ・ ・
(そして間も省略)
・ ・ ・
# Default value: auto
# Valid values: [auto, avx512, avx2, avx, sse4_2]
# This configuration is only used by querynode and indexnode, it selects CPU instruction set for Searching and Index-building.
simdType: auto
security:
authorizationEnabled: true
# The superusers will ignore some system check processes,
# like the old password verification when updating the credential
superUsers: root
tlsMode: 0
session:
ttl: 30 # ttl value when session granting a lease to register service
retryTimes: 30 # retry times when session sending etcd requests
(以下省略)
・ ・ ・
編集が完了したら保存します。
2. docker-composeを設定
Milvusのドキュメント「Configure Milvus with Docker Compose: Modify the installation file」に書いてある内容です。
docker-compose.yml
を以下のように編集します。
全てのvolumes:
セクションに以下を追加します。<>は自分のPATHに置き換えます
- <1で編集したローカルPC上のmilvus.yamlのフルパス>/milvus.yaml:/milvus/configs/milvus.yaml
volumes:
セクションはversion: '3.5'で3箇所ありました。
1 . services:
セクションのetcd:
セクション
編集例: ~/milvus/milvus.yaml
は自分のPATHに要変更です
volumes:
- ~/milvus/milvus.yaml:/milvus/configs/milvus.yaml
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
2 . services:
セクションのminio:
セクション
編集例: ~/milvus/milvus.yaml
は自分のPATHに要変更です
volumes:
- ~/milvus/milvus.yaml:/milvus/configs/milvus.yaml
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
3 . services:
セクションのstandalone:
セクション
編集例: ~/milvus/milvus.yaml
は自分のPATHに要変更です
volumes:
- ~/milvus/milvus.yaml:/milvus/configs/milvus.yaml
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
編集が完了したら保存します。
3. Milvusを起動
既にMilvusが起動している場合は、一旦停止します。
停止はdocker-compose.ymlを保存したフォルダーで、以下のコマンドを実行します:
docker-compose down
起動はdocker-compose.ymlを保存したフォルダーで、以下のコマンドを実行します:
docker-compose up -d
docker ps
で表示されるStatusがmilvus-standalone
,milvus-minio
, milvus-etcd
の3つ全て (healthy) になるのを待ちます。
全て (healthy) になれば起動完了です(milvus-standalone
がちょっと時間がかかります)
4. Attusで確認
Attuで確認してみます。
参考: Milvusのグラフィカルな管理ツール AttuをMacに導入してみた
Attuを起動し、Milvus Addressを入れ、Milvus UsernameとMilvus Passwordはブランクのままで接続してみます。
以下のようなエラーが出で、接続できないようになりました。
Error: Failed to connect to Milvus: Error: 16 UNAUTHENTICATED: missing authorization in header
では、Milvus UsernameとMilvus Password入れてみます。
初期設定は
- Milvus Username:
root
- Milvus Password:
Milvus
となっていますので、この値を入れます。
さすがにAdmin権限のrootのパスワードはデフォルトから変更した方がよいので、変更します。
-
Current Password
- milvus.yamlに
superUsers: root
を設定していれば、Current Password
(現在のパスワード) はブランクのままでよいはずなのですが、このGUI,それを許さないので、適当な1文字を入れておきます。またはわかるのであれば現在のパスワードを入れます。
- milvus.yamlに
-
New Password
- 新パスワード
-
Confirm Password
- 確認のためNew Passwordに入力したパワードと同じ文字列を入力)を入力します。
入力が完了したら「Create」をクリックします。
(ここは普通「Update」であるべきですよね。そのうち修正されるのだろうか??)
エラーが出ます。しかし、これでなぜか成功しているのです。 バグですかね??
4 . 右上のログアウトのアイコンをクリックしてログアウトします。
なんかスッキリしないので次にpythonで確認してみます。
5. pymilvus(python)で確認
5-1. milvusへの接続、pwなし
詳細: Connect to a Milvus server
from pymilvus import connections
conn= connections.connect(
alias="default",
host='localhost',
port='19530'
)
エラーがでます:
grpc RpcError: [__internal_register], <_InactiveRpcError: StatusCode.UNAUTHENTICATED, missing authorization in header>,
5-2. user,passwordも入れて、milvusへの接続
詳細: Connect Milvus with an authenticated user
初期設定は
- Milvus Username:
root
- Milvus Password:
Milvus
となっていますので、この値を入れます。
from pymilvus import connections
conn= connections.connect(
alias="default",
host='localhost',
port='19530',
user='root',
password='Milvus',
)
接続成功しました。 ユーザー認証が有効になっているのが分かります。
5-3. rootのpassword変更
詳細: Reset password
milvus.yamlにsuperUsers: root
を設定している場合は、現在のパスワードは不要です。
from pymilvus import utility
utility.reset_password('root', '', 'P@ssword', using='default')
milvus.yamlにsuperUsers: root
を設定がない場合は、現在のパスワードを入れます。
from pymilvus import utility
utility.reset_password('root', 'Milvus', 'P@ssword', using='default')
5-4 rootのパスワード変更の確認
from pymilvus import connections
conn= connections.connect(
alias="default",
host='localhost',
port='19530',
user='root',
password='P@ssword',
)
エラーが出なければ無事変更できています。
参考までにユーザー作成は以下を参照ください:
Create an authenticated user
参考までにロール設定は以下を参照ください:
Enable RBAC
以上です。