Azure Key Vault への資格情報の格納 で解説されていますが、Azure Data Factory (ADF) では、Linked Service を設定する際にパスワードの情報を Key Vault のシークレットから取得することができます。
Key Vault のコンテナーに対して、ADF の Managed Identity (マネージド ID) 権限を付与しておくことで、Linked Service としてリンクした Key Vault からシークレットから情報を取得して、Linked Service 内の設定で使用することができます。
これにより、Linked Service でパスワードを入力する必要がなくなり、パスワード変更が発生した場合も Key Vault の情報を変更することで対応ができるようになる等、いくつかのメリットを享受することができます。
Linked Service の情報を設定する際だけでなく、パイプライン内で Key Vault から情報を取得することができるかを試してみたので、メモとして。
今回はサブスクリプション ID を Key Vault のシークレットから取得しているのですが、この程度の情報であれば、パイプライン実行時のパラメーターで指定してもよいと思いますが。
初めに、Key Vault のアクセスポリシーとして、ADF の Managed Identity に対してシークレットのアクセス権を設定しておきます。 (この設定自体は、Linked Service で Key Vault を使用する場合も共通ですが)
これで事前準備は完了ですので、Web アクティビティから、Get Secret – Get Secret の REST API を Managed Identity で呼び出せば、Key Vault の情報を取得できます。
パイプラインの定義としては次のような内容です。
{ "name": "pipeline8", "properties": { "activities": [ { "name": "Get Key Vault Info", "type": "WebActivity", "dependsOn": [], "policy": { "timeout": "7.00:00:00", "retry": 0, "retryIntervalInSeconds": 30, "secureOutput": false, "secureInput": false }, "userProperties": [], "typeProperties": { "url": { "value": "@concat('https://',pipeline().parameters.keyvaultName,'.vault.azure.net/secrets/subscriptionId?api-version=7.0')", "type": "Expression" }, "method": "GET", "authentication": { "type": "MSI", "resource": "https://vault.azure.net" } } } ], "parameters": { "keyvaultName": { "type": "string" } }, "annotations": [] } }
パイプラインの実行時パラメーターとして、Key Vault の名称を指定し、その Key Vault 内の subscriptionId というシークレットを Web アクティビティから取得するというシンプルなものです。
Key Vault のシークレットの値は、アクティビティの value として出力が行われていますので、この値を後続のアクティビティで利用すれば、Key Vault に格納した値を任意のアクティビティで利用することができます。
パラメーターで済むケースの方が多いと思いますが、アクティビティ内で使用する情報を隠蔽化しながら、Git で ADF の設定を管理するときなどに Key Vault を使用することで、情報流出が抑えられるケースがあるのかなと。