Azure Machine Learning トレーニング ジョブで認証資格情報シークレットを使用する

適用対象:Python SDK azureml v1

この記事では、トレーニング ジョブでシークレットを安全に使用する方法について説明します。 ユーザー名やパスワードなどの認証情報はシークレットです。 たとえば、トレーニング データを問い合わせる目的で外部データベースに接続する場合、リモート ジョブ コンテキストにユーザー名とパスワードを渡す必要があります。 このような値をクリアテキストでトレーニング スクリプトにコーディングすると、シークレットが公開されるので安全ではありません。

代わりに、Azure Machine Learning ワークスペースには、Azure Key Vault という名前のリソースが関連付けられています。 この Key Vault を使用して、Azure Machine Learning Python SDK の一連の API を介してシークレットをリモート ジョブに安全に渡します。

シークレットを使用するための標準的なフローは次のとおりです。

  1. ローカル コンピューターで Azure にログインし、お使いのワークスペースに接続します。
  2. ローカル コンピューターで、ワークスペース キー コンテナーにシークレットを設定します。
  3. リモート ジョブを送信します。
  4. リモート ジョブの中で、Key Vault からシークレットを取得して使用します。

シークレットを設定する

Azure Machine Learning では、Keyvault クラスにシークレットを設定するためのメソッドが含まれています。 ローカル Python セッションで、最初にワークスペース Key Vault への参照を取得します。その後、set_secret() メソッドを使用して、名前と値でシークレットを設定します。 set_secret メソッドでは、名前が既に存在する場合は、シークレット値が更新されます。

from azureml.core import Workspace
from azureml.core import Keyvault
import os


ws = Workspace.from_config()
my_secret = os.environ.get("MY_SECRET")
keyvault = ws.get_default_keyvault()
keyvault.set_secret(name="mysecret", value = my_secret)

シークレット値をクリアテキストとしてファイルに格納するのは安全ではないため、その値を Python コードには含めないでください。 代わりに、Azure DevOps のビルド シークレットなどの環境変数から、または対話型ユーザー入力からシークレット値を取得してください。

list_secrets() メソッドを利用してシークレット名を一覧表示できます。バッチ バージョンの set_secrets() もありますが、これを利用すると、一度に複数のシークレットを設定できます。

重要

list_secrets() を使用すると、Azure ML SDK を使用して set_secret() または set_secrets() を介して作成されたシークレットのみが表示されます。 SDK 以外によって作成されたシークレットは一覧に表示されません。 たとえば、Azure portal または Azure PowerShell を使用して作成されたシークレットは一覧に表示されません。

get_secret() を使用すると、作成方法に関係なく、キー コンテナーからシークレット値を取得できます。 そのため、list_secrets() によって一覧表示されないシークレットを取得できます。

シークレットの取得

ローカル コードでは、get_secret() メソッドを使用して、名前でシークレット値を取得できます。

Experiment.submit が送信されるジョブの場合、Run クラスを指定して get_secret() メソッドを使用します。 送信される実行ではワークスペースが認識されるため、このメソッドでは、ワークスペースのインスタンス化がショートカットされ、シークレット値が直接返されます。

# Code in submitted job
from azureml.core import Experiment, Run

run = Run.get_context()
secret_value = run.get_secret(name="mysecret")

書き込みや出力によってシークレット値が公開されることがないように注意してください。

複数のシークレットに一度にアクセスするための get_secrets() というバッチ バージョンもあります。

次のステップ