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 を使用することで、情報流出が抑えられるケースがあるのかなと。