🌊

Azure ML の Managed Online Endpoint に custom domain を割り当てる

2023/07/23に公開

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 ファイルでダウンロードして展開しておきます。

https://github.com/Azure/azureml-examples/

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 を作成する

Environment を作成する

ここらへんはさっぱりよくわからず、試したらできた、という感じです。。

  • Custom environment を作成します
    • model を deploy する際、閉域化していると MCR (Microsoft Container Registry) へとアクセスできずこけたのでこちらで対応します
    • カスタマイズ元の environment は「Scikit-learn 0.24.1」を選びます
    • 実際にはカスタマイズはしないのでそのまま進み作成します
  • Customize したものは ACR に docker image として保存されているはずです

Model を登録する

相変わらずよくわかりませんが登録します。

Managed Online Endpoint を作成する

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 にあるものをそのまま使っています。

https://github.com/Azure/azureml-examples/blob/main/cli/endpoints/online/managed/vnet/sample/sample-request.json

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 側を設定

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 をバックエンドとすることができました
Microsoft (有志)

Discussion