Azure ML の Managed Online Endpoint に custom domain を割り当てる
TL;DR
- Azure Machine Learning の Managed Online Endpoint に custom domain を割り当てる
- Application Gateway を利用して、Managed Online Endpoint の Private Endpoint をバックエンドとする
- バックエンドの設定を工夫して、いい感じにする
でぃすくれいまー
この記事を書いている時点で筆者は Azure Machine Learning についてほとんど知りません。
docs をいくつか読み漁った結果、できた!という感じでご紹介するものです。
はじめに
Azure Machine Learning の Managed Online Endpoint を Application Gateway 経由にできないか、というのがあって。
で、せっかくなので Managed Online Endpoint で Private Endpoint を有効化し、Application Gateway 経由でしかアクセスできないようにしよう、というものです。
加えて、これにより custom domain が割り当てられることになるので、記事の名前もそれにしてみた、という感じです。
やってみる
思い出しながら書いているので順序がおかしいかもしれません。
また、docs のページ構成が一部壊れており、Studio で操作する手順が見れないのですが、その場合は en-us で開いたうえでブラウザの機能で翻訳するとよいです。
こちらの GitHub にあるものを使うので、clone しておくか、Zip ファイルでダウンロードして展開しておきます。
ACR (Azure Container Registry) を作成し、Private Endpoint を作成する
後で利用するのですが、ACR を作成して Private Endpoint を作成しておきます。
必然的に、VNet とか Private DNS Zone なども必要になります。
ちょっと腑に落ちないのですが、Public Access を On にしておかないと動かない気がします。
Azure Machine Learning 環境アクセス用の Azure VM を作成する
Private Endpoint に閉じた設定になっているので、ML Studio などが VNet 内部からしかアクセスできません。
事前作業として、Windows 10 とか Windows 11 の Azure VM を作成しておきます。
Azure Machine Learning を作成する
- まずは workspace を作成します
- まだ preview ではありますが managed network 機能を使っていきます
Environment を作成する
ここらへんはさっぱりよくわからず、試したらできた、という感じです。。
- Custom environment を作成します
- model を deploy する際、閉域化していると MCR (Microsoft Container Registry) へとアクセスできずこけたのでこちらで対応します
- カスタマイズ元の environment は「Scikit-learn 0.24.1」を選びます
- 実際にはカスタマイズはしないのでそのまま進み作成します
- Customize したものは ACR に docker image として保存されているはずです
Model を登録する
相変わらずよくわかりませんが登録します。
- ここら辺の手順を参考にします
- Studio から Models > Register から進んでいきます
Managed Online Endpoint を作成する
- ここら辺を参考に Studio から操作できます
- マネージド オンライン エンドポイントのネットワークの分離 - Azure Machine Learning
- Managed network とかを使って Azure ML workspace を閉域化?しておかないと public endpoint を無効化できないっぽいです
- 作成時に scoring file を指定するのですが、GitHub のこちらのファイルを使います: https://github.com/Azure/azureml-examples/blob/main/cli/endpoints/online/model-1/onlinescoring/score.py
Endpoint としては AKS もあるようですが、こちらを使った方がマシンを扱う必要がないので楽、という感じです。
sample request を送ってみる
以下のような JSON を送りつけてみます。
{"data": [
[1,2,3,4,5,6,7,8,9,10],
[10,9,8,7,6,5,4,3,2,1]
]}
あまり詳しくないのでこちらの GitHub にあるものをそのまま使っています。
Bearer については Studio で、Endpoint の詳細から、Consume のところを開くと、Primary key と Secondary key というのがあるのでどちらかを利用します。
上記 JSON を sample-request.json という名前で保存しておきます。
@sample-file.json
でファイルの中身を読み込んでくれるのですが、PowerShell では @
の前に `
を入れないとエラーになるので注意です。
> curl.exe --request POST "http://xxxxxxxx-xxxx.japaneast.inference.ml.azure.com/score" --header "Authorization: Bearer xxxxxxxx" --header 'Content-Type: application/json' --data `@sample-request.json
[11055.977245525679, 4503.079536107787]
詳しいことは全くわからないですが、なんか結果が返ってきたので良しとしましょう。
Application Gateway を作成する
- Application Gateway 専用の subnet を作成します。
- Application Gateway を作成します
- 一旦は frontend を private IP アドレス、HTTP (80/tcp) で動作させます
- backend pool には
xxxxxxxx-xxxx.japaneast.inference.ml.azure.com
を指定しておきます - backend settings としては HTTPS (443/tcp) を指定します
- health probe は Bearer 付与しないと認証エラーが出るのが想定されるので、HTTP 応答コードの範囲を 200-499 にしておきます
- 設定が完了したのち Backend health で Healthy になっていることを確認します (Success. Received 403 status code と出ているはずです)
Application Gateway 経由で通信させる (Private IP)
> curl --request POST "http://10.0.10.10/score" --header "Authorization: Bearer xxxxxxxx" --header 'Content-Type: application/json' --data `@sample-request.json
[11055.977245525679, 4503.079536107787]
よくわからないですが、結果が返ってきたので良しとします。
Application Gateway の Public Frontend 側を設定
- TLS 証明書を発行します
- Let's Encrypt を利用したワイルドカード証明書を発行してあるのでこれを利用します
- 参考: Azure Application GatewayのSSL証明書にLet's Encryptを使う
- Application Gateway に Azure Key Vault を使って証明書を関連付けます
- 適当に Frontend IP の設定をしておきます
- Azure DNS Zones で Application Gateway の public endpoint への A record を書いておきます
Application Gateway 経由で通信させる (Public IP、FQDN 付与)
というわけで、Application Gateway 経由で通信させてみます。
aml.example.jp の箇所はサンプルなので Azure DNS Zones などで設定したものに置き換えてください。
> curl --request POST "https://aml.example.jp/score" --header "Authorization: Bearer xxxxxxxx" --header 'Content-Type: application/json' --data `@sample-request.json
[11055.977245525679, 4503.079536107787]
以下略。。
まとめ
- Azure Machine Learning の Managed Online Endpoint に custom domain を割り当てることができました
- Application Gateway を利用して、Managed Online Endpoint の Private Endpoint をバックエンドとすることができました
Discussion