【问题标题】:Listing all resources in Azure in NodeJS在 NodeJS 中列出 Azure 中的所有资源
【发布时间】:2021-04-27 10:16:00
【问题描述】:

我正在尝试使用 Azure SDK for Javascript 列出 Azure 订阅中的所有资源。我的方法是使用@azure/ms-rest-nodeauth 包进行身份验证,然后从@azure/arm-resources 包中调用 ResourceManagementClient,但我遇到了几个问题。

1。应用注册

我选择使用msRestNodeAuth.loginWithServicePrincipalSecretWithAuthResponse()。我进入 AzureAD 并创建了一个新的应用程序注册,然后在其中创建了一个秘密。这给了我可以提供给函数的 clientId、secret 和tenantId。

但是,我觉得我将面临的问题(一旦我真正让我的代码工作)是许可。我不知道需要对这个应用注册应用什么权限才能允许它像这样查询资源。

我在我看过的任何文档中都看不到这一点。

2。 ESM / CJS 问题

我正在运行 NodeJS 的 v12.16.1。为了使用 ESM 导入语法,我提供了 --experimental-modules 标志和 es-module-specifier-resolution=node,以便在导入时不需要提供文件扩展名(package.json 文件也有 type: "module" 集)。这在许多包中都可以正常工作,但是在上面的两个包中,导入似乎有一个包装器,这意味着我需要调用 .default 才能访问实际功能:

例如:

import * as msRestNodeAuth from "@azure/ms-rest-nodeauth";
const res = await msRestNodeAuth.loginWithServicePrincipalSecretWithAuthResponse(_clientId, _secretValue, _tennantId);

...必须变成:

import * as msRestNodeAuth from "@azure/ms-rest-nodeauth";
const res = await msRestNodeAuth.default.loginWithServicePrincipalSecretWithAuthResponse(_clientId, _secretValue, _tennantId);

执行此操作时代码可以工作,但我的猜测是包的构建方式/我的 NodeJS 设置的配置方式有些问题。我也无法从@azure/arm-resources 导入ResourceManagementClient,而是必须这样做:

// This errors:
// import { ResourceManagementClient } from "@azure/arm-resources";
// ...but I can access it like:
import * as armResources from "@azure/arm-resources";

const client = new armResources.default.ResourceManagementClient();

3。把它们放在一起

当我尝试将它们放在一起并获取资源组列表时,出现错误:

const res = await msRestNodeAuth.default.loginWithServicePrincipalSecretWithAuthResponse(_clientId, _secretValue, _tennantId);

const client = new armResources.default.ResourceManagementClient(res.credentials, _subscriptionId);

const resourceGroups = await client.resourceGroups.list();

对象 ID 为“abc678”的客户端“XYZ123”无权对范围“/subscriptions/123213123”执行操作“Microsoft.Resources/subscriptions/resourcegroups/read”或范围无效。如果最近授予访问权限,请刷新您的凭据。

我希望这只是一个身份验证错误,将在问题 #1 得到修复后解决 - 即应用注册获得所需的权限。

为这个问题的广泛范围道歉;我习惯在 AWS 中这样做,所以我试图同时掌握 Azure 和这个 SDK。非常感谢任何帮助!

【问题讨论】:

标签: node.js azure azure-sdk-js


【解决方案1】:

如果您想在一个订阅中列出所有 Azure 资源,您需要在订阅级别分配读取角色。更多详情请参考herehere

关于如何给sp分配角色,我们可以使用PowerShell来实现

$id=(Get-AzADServicePrincipal -DisplayName <principalName>).id
New-AzRoleAssignment -ObjectId $id `
-RoleDefinitionName Reader `
-Scope /subscriptions/<subscriptionId>

【讨论】:

  • 太棒了,这成功了! Azure 门户中是否有任何地方可以看到这些权限?门户中的应用程序注册没有在我能看到的任何地方列出它。我需要看哪里?使用 Powershell 可以,但我希望能够在网页中查看。
猜你喜欢
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多