【发布时间】:2020-01-01 14:42:27
【问题描述】:
尝试通过控制台中的 Hadoop 客户端使用 MSI(Azure 托管标识)连接到 Azure Data Lake Storage Gen2 并收到错误
ls: AADToken: HTTP connection failed for getting token from AzureAD. Http response: 400 Bad Request*
通过共享密钥连接工作正常。
做了什么:
- 在 Azure 中创建了一个 Windows 10 VM,并从 Apache 站点和 JRE 1.8.0 安装了 Haddop 客户端 3.2
- 使用https://docs.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-quickstart-create-account 创建了存储帐户
- 使用https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal 创建了 Azure AD 应用程序
- 为 VM 启用系统分配的托管标识,如此处所述 https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm
- 如https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/howto-assign-access-portal 所述,为存储帐户分配了托管标识访问权限
使用以下命令进行连接:
hadoop fs -Dfs.azure.ssl.channel.mode=Default_JSSE -Dfs.azure.account.oauth.provider.type=org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider -Dfs.azure.account.auth.type=OAuth -Dfs.azure.account.oauth2.msi.tenant=<tenant_ID> -Dfs.azure.account.oauth2.client.id=<Client_ID> -ls abfss://<filesystem_name>2@<storage_account_name>.dfs.core.windows.net/
有什么问题或遗漏了吗?请指教。
谢谢!
【问题讨论】:
-
如果使用MSI(System-assigned managed identity)访问adls gen2,那么步骤3中的AD App是做什么用的?
-
据我所知创建一个客户 ID。
-
不需要这样做,如果你启用VM的MSI,它会自动在你的租户中创建一个服务主体,它与你的VM同名,它有自己的客户端ID。您可以在门户中的 Azure Active Directory 中找到它 -> 企业应用程序 -> 使用您的 VM 名称搜索(使用
All Applications过滤),请参阅i.stack.imgur.com/Wotcb.png。应用程序 ID(客户端 ID)是您想要的。如果您使用该客户端 ID,它会起作用吗? -
在第 5 步中,您是否为 MSI 赋予了
Storage Blob Data Owner角色? -
有效!万分感谢。角色是贡献者,我将其更改为存储 Blob 数据所有者,它现在可以工作了。谢谢!
标签: azure-active-directory azure-data-lake