在 Azure Stack Hub 中将 API 版本配置文件与 Node.js 软件开发工具包 (SDK) 配合使用

Node.js 与 API 版本配置文件

可以使用 Node.js SDK 来帮助构建和管理应用的基础结构。 Node.js SDK 中的 API 配置文件可让你在 Azure 资源与 Azure Stack Hub 资源之间切换,为开发混合云解决方案提供帮助。 只需编写代码一次,即可将目标限定于 Azure 和 Azure Stack Hub。

在本文中,可以使用 Visual Studio Code 作为开发工具。 Visual Studio Code 可以调试 Node.js SDK,并可让你运行应用并将其推送到 Azure Stack Hub 实例。 可以通过 Visual Studio Code 或者在终端窗口中运行 node <nodefile.js> 命令进行调试。

Node.js SDK

Node.js SDK 提供 Azure Stack Hub 资源管理器工具。 该 SDK 中的资源提供程序包括了计算、网络、存储、应用服务和 KeyVault。 可在 Node.js 应用程序中安装的资源提供程序客户端库有 10 个。 还可以下载指定要用于 2018-03-01-hybrid2019-03-01-profile 的资源提供程序,以优化应用程序的内存。 每个模块包括资源提供程序、相应的 API 版本和 API 配置文件。

API 配置文件是资源提供程序和 API 版本的组合。 可以使用 API 配置文件获取资源提供程序包中每个资源类型的最新且最稳定的版本。

  • 若要使用所有服务的最新版本,请使用包的 latest 配置文件。

  • 若要使用与 Azure Stack Hub 兼容的服务,请使用 @azure/arm-resources-profile-hybrid-2019-03-01@azure/arm-storage-profile-2019-03-01-hybrid

npm 中的包

每个资源提供程序都有自身的包。 可以从 npm 注册表获取包。

可以找到以下包:

资源提供程序 程序包
应用服务 @azure/arm-appservice-profile-2019-03-01-hybrid
Azure 资源管理器订阅 @azure/arm-subscriptions-profile-hybrid-2019-03-01
Azure 资源管理器策略 @azure/arm-policy-profile-hybrid-2019-03-01
Azure 资源管理器 DNS @azure/arm-dns-profile-2019-03-01-hybrid
授权 @azure/arm-authorization-profile-2019-03-01-hybrid
计算 @azure/arm-compute-profile-2019-03-01-hybrid
存储 @azure/arm-storage-profile-2019-03-01-hybrid
网络 @azure/arm-network-profile-2019-03-01-hybrid
资源 @azure/arm-resources-profile-hybrid-2019-03-01
Keyvault @azure/arm-keyvault-profile-2019-03-01-hybrid

若要使用某个服务的最新 API 版本,请使用特定客户端库的最新配置文件。 例如,若要单独使用资源服务的最新 API 版本,请使用资源管理客户端库包的 azure-arm-resource 配置 文件。

对于资源提供程序的特定 API 版本,请使用包中定义的特定 API 版本。

备注

可以在同一应用程序中组合所有选项。

安装 Node.js SDK

  1. 安装 Git。 有关说明,请参阅入门 - 安装 Git

  2. 安装或升级到 Node.js 的最新版本。 Node.js 还包含 npm JavaScript 包管理器。

  3. 安装或升级 Visual Studio Code,并安装适用于 Visual Studio Code 的 Node.js 扩展

  4. 安装 Azure Stack Hub 资源管理器的客户端包。 有关详细信息,请参阅如何安装客户端库

  5. 需安装的包取决于要使用的配置文件版本。 可以在 npm 中的包部分找到资源提供程序列表。

  6. 使用 npm 安装资源提供程序客户端库。 从命令行中运行:npm install <package-name>。 例如,可以运行 npm install @azure/arm-authorization-profile-2019-03-01-hybrid 来安装授权资源提供程序库。

  7. 使用 SDK 时,请创建订阅并记下订阅 ID。 有关说明,请参阅在 Azure Stack Hub 中创建套餐的订阅

  8. 创建服务主体并保存客户端 ID 和客户端机密。 创建服务主体时的客户端 ID 也称为应用程序 ID。 有关说明,请参阅为应用程序提供对 Azure Stack Hub 的访问权限

  9. 确保服务主体在订阅上具有“参与者/所有者”角色。 有关如何将角色分配到服务主体的说明,请参阅提供对 Azure Stack Hub 的应用程序访问权限

Node.js 先决条件

若要将 Node.js Azure SDK 与 Azure Stack Hub 配合使用,必须提供以下值,然后使用环境变量来设置值。 若要设置环境变量,请参阅表后针对操作系统的说明。

Value 环境变量 说明
租户 ID TENANT_ID Azure Stack Hub 租户 ID 的值。
客户端 ID CLIENT_ID 在本文档上一部分创建服务主体时保存的服务主体应用程序 ID。
订阅 ID AZURE_SUBSCRIPTION_ID:订阅 ID 用于访问 Azure Stack Hub 中的套餐。
客户端机密 APPLICATION_SECRET 创建服务主体时保存的服务主体应用程序机密。
资源管理器终结点 ARM_ENDPOINT 参阅 Azure Stack Hub 资源管理器终结点

设置 Node.js 的环境变量

若要定义环境变量:

  • Microsoft Windows

    若要在 Windows 命令提示符中设置环境变量,请使用以下格式:

    set Tenant_ID=<Your_Tenant_ID>

  • 基于 macOS、Linux 和 Unix 的系统

    若要设置环境变量,请在 bash 提示符下使用以下格式:

    export Azure_Tenant_ID=<Your_Tenant_ID>

Azure Stack Hub 资源管理器终结点

Azure 资源管理器是一种管理框架,可供管理员用来部署、管理和监视 Azure 资源。 Azure 资源管理器可以通过单个操作以组任务而不是单个任务的形式处理这些任务。

可以从资源管理器终结点获取元数据信息。 该终结点返回 JSON 文件,以及运行代码所需的信息。

备注

Azure Stack 开发工具包 (ASDK) 中的 ResourceManagerUrl 为:https://management.local.azurestack.external 集成系统中的 ResourceManagerUrlhttps://management.region.<fqdn>/,其中 <fqdn> 是完全限定的域名。 检索所需的元数据:<ResourceManagerUrl>/metadata/endpoints?api-version=1.0

示例 JSON 文件:

{
    "galleryEndpoint": "https://portal.local.azurestack.external/",

    "graphEndpoint": "https://graph.windowsNode.js/",

    "portal Endpoint": "https://portal.local.azurestack.external/",

    "authentication": {

        "loginEndpoint": "https://login.windowsNode.js/",

        "audiences": ["https://management.<yourtenant>.partner.onmschina.cn/"]

    }

}

现有 API 配置文件

  • @azure/arm-resourceprovider-profile-2019-03-01-hybrid

    为 Azure Stack Hub 生成的最新配置文件。 使用此配置文件可以使服务与阵列版本 1808 或更高版本的 Azure Stack Hub 最兼容。

  • @azure-arm-resource

    配置文件包含所有服务的最新版本。 使用 Azure 中所有服务的最新版本。

有关 Azure Stack Hub 和 API 配置文件的详细信息,请参阅 API 配置文件的摘要

Azure Node.js SDK API 配置文件的用法

应该使用以下代码行来实例化配置文件客户端。 此参数只是 Azure Stack Hub 或其他私有云所需要的。 默认情况下,全球 Azure 已有这些包含 @azure-arm-resource 或 @azure-arm-storage 的设置。

var ResourceManagementClient = require('@azure/arm-resources-profile-hybrid-2019-03-01').ResourceManagementClient;

var StorageManagementClient = require('@azure/arm-storage-profile-2019-03-01-hybrid').StorageManagementClient;

在 Azure Stack Hub 上对服务主体进行身份验证需要以下代码。 它根据租户 ID 和特定于 Azure Stack Hub 的身份验证基准创建令牌:

var clientId = process.env['AZURE_CLIENT_ID'];
var tenantId = process.env['AZURE_TENANT_ID']; //"adfs"
var secret = process.env['AZURE_CLIENT_SECRET'];
var subscriptionId = process.env['AZURE_SUBSCRIPTION_ID'];
var base_url = process.env['ARM_ENDPOINT'];
var resourceClient, storageClient;

这样,便可以使用 API 配置文件客户端库将应用程序成功部署到 Azure Stack Hub。

以下代码片段使用为 Azure Stack Hub 实例指定的 Azure 资源管理器终结点,收集如上所示的数据,例如库终结点、图形终结点、受众和门户终结点。

var map = {};
const fetchUrl = base_url + 'metadata/endpoints?api-version=1.0'

环境设置

若要通过 Azure Stack Hub 环境对服务主体进行身份验证,请使用以下代码:使用此代码并在命令提示符中设置环境变量会自动为开发人员生成此映射。

function main() {
  var initializePromise = initialize();
  initializePromise.then(function (result) {
    var userDetails = result;
    console.log("Initialized user details");
    // Use user details from here
    console.log(userDetails)
    map["name"] = "AzureStack"
    map["portalUrl"] = userDetails.portalEndpoint 
    map["resourceManagerEndpointUrl"] = base_url 
    map["galleryEndpointUrl"] = userDetails.galleryEndpoint 
    map["activeDirectoryEndpointUrl"] = userDetails.authentication.loginEndpoint.slice(0, userDetails.authentication.loginEndpoint.lastIndexOf("/") + 1) 
    map["activeDirectoryResourceId"] = userDetails.authentication.audiences[0] 
    map["activeDirectoryGraphResourceId"] = userDetails.graphEndpoint 
    map["storageEndpointSuffix"] = "." + base_url.substring(base_url.indexOf('.'))  
    map["keyVaultDnsSuffix"] = ".vault" + base_url.substring(base_url.indexOf('.')) 
    map["managementEndpointUrl"] = userDetails.authentication.audiences[0] 
    map["validateAuthority"] = "false"
    Environment.Environment.add(map);

使用 API 配置文件的示例

可以参考以下示例使用 Node.js 和 Azure Stack Hub API 配置文件来创建解决方案。 可从 GitHub 上的以下存储库中获取示例:

示例 - 创建存储帐户

  1. 克隆存储库。

    git clone https://github.com/sijuman/storage-node-resource-provider-getting-started.git
    
  2. 使用 cd 命令转到存储库的克隆。

  3. 创建 Azure 服务主体并分配用于访问订阅的角色。 有关说明,请参阅使用 Azure PowerShell 创建具有证书的服务主体

  4. 检索以下必需值:

    • 租户 ID
    • 客户端 ID(应用程序 ID)
    • 客户端机密
    • Azure 订阅 ID
    • Azure Stack Hub 资源管理器终结点
  5. 使用命令提示符,根据从已创建的服务主体检索的信息设置以下环境变量:

    备注

    在 Windows 上,请使用 set 而不是 export

    export TENANT_ID=<your tenant id>
    export CLIENT_ID=<your client id>
    export APPLICATION_SECRET=<your client secret>K
    export AZURE_SUBSCRIPTION_ID=<your subscription id>
    export ARM_ENDPOINT=<your Azure Stack Hub Resource manager URL>
    
  6. 打开示例应用程序的 index.js 文件。

  7. 将位置变量设置为你的 Azure Stack Hub 位置。 例如 LOCAL = "local"

  8. 设置凭据,以便向 Azure Stack Hub 进行身份验证。 此代码部分包含在本示例的 index.js 文件中。

    var clientId = process.env['CLIENT_ID'];
    var tenantId = process.env['TENANT_ID']; //"adfs"
    var secret = process.env['APPLICATION_SECRET'];
    var subscriptionId = process.env['AZURE_SUBSCRIPTION_ID'];
    var base_url = process.env['ARM_ENDPOINT'];
    var resourceClient, storageClient;
    
  9. 使用上面规定的客户端库组合,检查是否设置了正确的客户端库。 本示例使用了以下代码:

    var ResourceManagementClient = require('@azure/arm-resources-profile-hybrid-2019-03-01').ResourceManagementClient;
    var StorageManagementClient = require('@azure/arm-storage-profile-2019-03-01-hybrid').StorageManagementClient;
    
  10. 使用 npm 模块搜索,找到 2019-03-01-hybrid,为计算、网络、存储、KeyVault 和应用服务资源提供程序安装与此配置文件相关联的包。

    为此,可打开命令提示符,将其重定向到存储库的根文件夹,然后针对使用的每个资源提供程序运行 npm install @azure/arm-keyvault-profile-2019-03-01-hybrid

  11. 在命令提示符下,运行 npm install 命令安装所有 Node.js 模块。

  12. 运行该示例。

    node index.js
    
  13. 若要在用完 index.js 之后进行清理,请运行清理脚本。

    Node cleanup.js <resourceGroupName> <storageAccountName>
    
  14. 本示例现已成功完成。 有关示例的详细信息,请参阅下文。

index.js 有何用途?

本示例可创建新的存储帐户、列出订阅或资源组中的存储帐户、列出存储帐户密钥、重新生成存储帐户密钥、获取存储帐户属性、更新存储帐户 SKU,以及检查存储帐户名是否可用。

本示例首先使用你的服务主体登录,然后使用你的凭据和订阅 ID 创建 ResourceManagementClientStorageManagementClient 对象。

然后,本示例设置要在其中创建新存储帐户的资源组。

function createResourceGroup(callback) {
  var groupParameters = { location: location, tags: { sampletag: 'sampleValue' } };
  console.log('\nCreating resource group: ' + resourceGroupName);
  return resourceClient.resourceGroups.createOrUpdate(resourceGroupName, groupParameters, callback);
}

新建存储帐户

接下来,本示例创建新的存储帐户,并将其与上一步骤中创建的资源组相关联。

在此情况下,系统会随机生成存储帐户名以确保唯一性。 但是,如果订阅中已有同名的帐户,则创建新存储帐户的调用仍会成功。

var createParameters = {
    location: location,
    sku: {
        name: accType,
    },
    kind: 'Storage',
    tags: {
        tag1: 'val1',
        tag2: 'val2'
    }
};


console.log('\\n--&gt;Creating storage account: ' + storageAccountName + ' with parameters:\\n' + util.inspect(createParameters));

return storageClient.storageAccounts.create(resourceGroupName, storageAccountName, createParameters, callback);

列出订阅或资源组中的存储帐户

本示例列出指定订阅中的所有存储帐户:

console.log('\\n--&gt;Listing storage accounts in the current subscription.');

return storageClient.storageAccounts.list(callback);

It also lists storage accounts in the resource group:

    console.log('\\n--&gt;Listing storage accounts in the resourceGroup : ' + resourceGroupName);

return storageClient.storageAccounts.listByResourceGroup(resourceGroupName, callback);

读取和重新生成存储帐户密钥

本示例列出新建的存储帐户和资源组的存储帐户密钥:

console.log('\\n--&gt;Listing storage account keys for account: ' + storageAccountName);

return storageClient.storageAccounts.listKeys(resourceGroupName, storageAccountName, callback);

它还会重新生成帐户访问密钥:

console.log('\\n--&gt;Regenerating storage account keys for account: ' + storageAccountName);

return storageClient.storageAccounts.regenerateKey(resourceGroupName, storageAccountName, 'key1', callback);

获取存储帐户属性

本示例读取存储帐户的属性:

console.log('\\n--&gt;Getting info of storage account: ' + storageAccountName);

return storageClient.storageAccounts.getProperties(resourceGroupName, storageAccountName, callback);

检查存储帐户名的可用性

本示例检查 Azure 中是否可使用给定的存储帐户名:

console.log('\\n--&gt;Checking if the storage account name : ' + storageAccountName + ' is available.');

return storageClient.storageAccounts.checkNameAvailability(storageAccountName, callback);

删除存储帐户和资源组

运行 cleanup.js 可删除本示例创建的存储帐户:

console.log('\\nDeleting storage account : ' + storageAccountName);
return storageClient.storageAccounts.deleteMethod(resourceGroupName, storageAccountName, callback);

它还会删除本示例创建的资源组:

console.log('\\nDeleting resource group: ' + resourceGroupName);

return resourceClient.resourceGroups.deleteMethod(resourceGroupName, callback);

后续步骤

有关 API 配置文件的详细信息,请参阅: