node.js - 在 NodeJS 中列出 Azure 中的所有资源
问题描述
我正在尝试使用 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。任何帮助是极大的赞赏!
解决方案
如果要在一个订阅中列出所有 Azure 资源,则需要在订阅级别分配读取角色。有关更多详细信息,请参阅此处和此处
关于如何给sp分配角色,我们可以使用PowerShell来实现
$id=(Get-AzADServicePrincipal -DisplayName <principalName>).id
New-AzRoleAssignment -ObjectId $id `
-RoleDefinitionName Reader `
-Scope /subscriptions/<subscriptionId>
推荐阅读
- python - 如何打印数据框中所有列的值计数
- javascript - 动态 $in 查询 mongo - nodejs
- oracle-apex - 表格形式的 SELECT LIST LOV 问题
- azure - 如何将数据集输入作为参数提交给 AZ ML CLI 运行 submit-pipeline 命令?
- python - 如何通过检查列值及其先前值来选择行
- apache-kafka - 将 kafka 连接器重命名为强制重启连接器
- java - 当Android中LocationCallback不起作用并且没有给出结果时,我该怎么办?
- amazon-web-services - 如何访问在 EC2 MAC 实例上运行的 Jenkins?
- hdfs - HBase logcleaner 不会删除 oldWALs 文件
- asp.net-core - Asp.net Razor Pages 中 .cshtml 和 .cs 文件的顺序发生了变化,怎么办?