1

我正在尝试使用 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 设置的配置方式有些问题。我也不能从 导入ResourceManagementClient@azure/arm-resources而是必须这样做:

// 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。任何帮助是极大的赞赏!

4

1 回答 1

1

如果要在一个订阅中列出所有 Azure 资源,则需要在订阅级别分配读取角色。有关更多详细信息,请参阅此处此处 在此处输入图像描述

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

$id=(Get-AzADServicePrincipal -DisplayName <principalName>).id
New-AzRoleAssignment -ObjectId $id `
-RoleDefinitionName Reader `
-Scope /subscriptions/<subscriptionId>
于 2021-04-27T02:16:00.577 回答