Azure SDK を使用して仮想マシンを作成する
Azure SDK を使用して、Azure 仮想マシンを作成および削除します。
開発環境を設定する
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料で作成できます。
- Node.js LTS と NPM (ローカル コンピューターにインストールされている Node.js パッケージ マネージャー)。
- ローカル コンピューターにインストールされている Visual Studio Code。
- サービス プリンシパルを作成し、
Tenant Id
、Client ID
、Client secret
をコピーします。 - Azure portal の [サブスクリプション] ページを使用して、サブスクリプション ID を検索し、その値をコピーしてこれらのスクリプトで使用します。
Azure 仮想マシン
Azure 仮想マシンでは、仮想マシンをサポートするために複数のリソースが必要です。 これらのリソースを管理する最適な方法は、すべてのリソースを 1 つのリソースグループ内に作成することです。 このスクリプトは、リソース グループを作成し、スクリプトを使用した回数に関係なく、リソース グループが一意になるようにランダムな数字を後ろに付加します。
これらのスクリプトで作成されるリソースは次のとおりです。
仮想マシンの作成
create-vm.js
という名前のファイルを作成するか、GitHub からファイルをコピーします。const util = require("util"); const { ClientSecretCredential, DefaultAzureCredential, } = require("@azure/identity"); const { ComputeManagementClient } = require("@azure/arm-compute"); const { ResourceManagementClient } = require("@azure/arm-resources"); const { StorageManagementClient } = require("@azure/arm-storage"); const { NetworkManagementClient } = require("@azure/arm-network"); // Store function output to be used elsewhere let randomIds = {}; let subnetInfo = null; let publicIPInfo = null; let vmImageInfo = null; let nicInfo = null; // CHANGE THIS - used as prefix for naming resources const yourAlias = "diberry"; // CHANGE THIS - used to add tags to resources const projectName = "azure-samples-create-vm"; // Resource configs const location = "eastus"; const accType = "Standard_LRS"; // Ubuntu config for VM const publisher = "Canonical"; const offer = "UbuntuServer"; const sku = "14.04.3-LTS"; const adminUsername = "notadmin"; const adminPassword = "Pa$$w0rd92"; // Azure authentication in environment variables for DefaultAzureCredential const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET"; const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID"; let credentials = null; if (process.env.production) { // production credentials = new DefaultAzureCredential(); } else { // development credentials = new ClientSecretCredential(tenantId, clientId, secret); console.log("development"); } // Azure services const resourceClient = new ResourceManagementClient( credentials, subscriptionId ); const computeClient = new ComputeManagementClient(credentials, subscriptionId); const storageClient = new StorageManagementClient(credentials, subscriptionId); const networkClient = new NetworkManagementClient(credentials, subscriptionId); // Create resources then manage them (on/off) async function createResources() { try { result = await createResourceGroup(); accountInfo = await createStorageAccount(); vnetInfo = await createVnet(); subnetInfo = await getSubnetInfo(); publicIPInfo = await createPublicIP(); nicInfo = await createNIC(subnetInfo, publicIPInfo); vmImageInfo = await findVMImage(); nicResult = await getNICInfo(); vmInfo = await createVirtualMachine(nicInfo.id, vmImageInfo[0].name); return; } catch (err) { console.log(err); } } async function createResourceGroup() { console.log("\n1.Creating resource group: " + resourceGroupName); const groupParameters = { location: location, tags: { project: projectName }, }; const resCreate = await resourceClient.resourceGroups.createOrUpdate( resourceGroupName, groupParameters ); return resCreate; } async function createStorageAccount() { console.log("\n2.Creating storage account: " + storageAccountName); const createParameters = { location: location, sku: { name: accType, }, kind: "Storage", tags: { project: projectName, }, }; return await storageClient.storageAccounts.beginCreateAndWait( resourceGroupName, storageAccountName, createParameters ); } async function createVnet() { console.log("\n3.Creating vnet: " + vnetName); const vnetParameters = { location: location, addressSpace: { addressPrefixes: ["10.0.0.0/16"], }, dhcpOptions: { dnsServers: ["10.1.1.1", "10.1.2.4"], }, subnets: [{ name: subnetName, addressPrefix: "10.0.0.0/24" }], }; return await networkClient.virtualNetworks.beginCreateOrUpdateAndWait( resourceGroupName, vnetName, vnetParameters ); } async function getSubnetInfo() { console.log("\nGetting subnet info for: " + subnetName); const getResult = await networkClient.subnets.get( resourceGroupName, vnetName, subnetName ); return getResult; } async function createPublicIP() { console.log("\n4.Creating public IP: " + publicIPName); const publicIPParameters = { location: location, publicIPAllocationMethod: "Dynamic", dnsSettings: { domainNameLabel: domainNameLabel, }, }; return await networkClient.publicIPAddresses.beginCreateOrUpdateAndWait( resourceGroupName, publicIPName, publicIPParameters ); } async function createNIC(subnetInfo, publicIPInfo) { console.log("\n5.Creating Network Interface: " + networkInterfaceName); const nicParameters = { location: location, ipConfigurations: [ { name: ipConfigName, privateIPAllocationMethod: "Dynamic", subnet: subnetInfo, publicIPAddress: publicIPInfo, }, ], }; return await networkClient.networkInterfaces.beginCreateOrUpdateAndWait( resourceGroupName, networkInterfaceName, nicParameters ); } async function findVMImage() { console.log( util.format( "\nFinding a VM Image for location %s from " + "publisher %s with offer %s and sku %s", location, publisher, offer, sku ) ); const listResult = new Array(); for await (const item of computeClient.virtualMachineImages.list( location, publisher, offer, sku )) { listResult.push(item); } return listResult; } async function getNICInfo() { return await networkClient.networkInterfaces.get( resourceGroupName, networkInterfaceName ); } async function createVirtualMachine() { const vmParameters = { location: location, osProfile: { computerName: vmName, adminUsername: adminUsername, adminPassword: adminPassword, }, hardwareProfile: { vmSize: "Standard_B1ls", }, storageProfile: { imageReference: { publisher: publisher, offer: offer, sku: sku, version: vmImageVersionNumber, }, osDisk: { name: osDiskName, caching: "None", createOption: "fromImage", vhd: { uri: "https://" + storageAccountName + ".blob.core.windows.net/nodejscontainer/osnodejslinux.vhd", }, }, }, networkProfile: { networkInterfaces: [ { id: nicId, primary: true, }, ], }, }; console.log("6.Creating Virtual Machine: " + vmName); console.log( " VM create parameters: " + util.inspect(vmParameters, { depth: null }) ); const resCreate = await computeClient.virtualMachines.beginCreateOrUpdateAndWait( resourceGroupName, vmName, vmParameters ); return await computeClient.virtualMachines.get( resourceGroupName, vmName ); } const _generateRandomId = (prefix, existIds) => { var newNumber; while (true) { newNumber = prefix + Math.floor(Math.random() * 10000); if (!existIds || !(newNumber in existIds)) { break; } } return newNumber; }; //Random number generator for service names and settings const resourceGroupName = _generateRandomId(`${yourAlias}-testrg`, randomIds); const vmName = _generateRandomId(`${yourAlias}vm`, randomIds); const storageAccountName = _generateRandomId(`${yourAlias}ac`, randomIds); const vnetName = _generateRandomId(`${yourAlias}vnet`, randomIds); const subnetName = _generateRandomId(`${yourAlias}subnet`, randomIds); const publicIPName = _generateRandomId(`${yourAlias}pip`, randomIds); const networkInterfaceName = _generateRandomId(`${yourAlias}nic`, randomIds); const ipConfigName = _generateRandomId(`${yourAlias}crpip`, randomIds); const domainNameLabel = _generateRandomId(`${yourAlias}domainname`, randomIds); const osDiskName = _generateRandomId(`${yourAlias}osdisk`, randomIds); async function main() { await createResources(); } main() .then(() => { console.log( `success - resource group name: ${resourceGroupName}, vm resource name: ${vmName}` ); }) .catch((err) => { console.log(err); });
このスクリプトで使用される SDK メソッドは次のとおりです。
- リソース グループ
- ストレージ
- ネットワーク
- VM
Azure の作業で使用される npm パッケージをインストールします。
npm init -y && install @azure/identity @azure/arm-compute @azure/arm-network @azure/arm-resources @azure/arm-storage
ローカル開発の場合は、認証用にファイル内の変数を変更します。
// Azure authentication in environment variables for DefaultAzureCredential const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET"; const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
リソースの名前付けの変数を変更します。
// CHANGE THIS - used as prefix for naming resources const yourAlias = "johnsmith"; // CHANGE THIS - used to add tags to resources const projectName = "azure-samples-create-vm"
コードを実行して VM を作成します。
node create-vm.js
出力にはリソース グループ名が含まれます。
success - resource group name: johnsmith-testrg1689
リソースをクリーンアップする
仮想マシンの使用が完了したら、リソース グループを削除します。
delete-resources.js
という名前のファイルを作成するか、GitHub からファイルをコピーします。const { ClientSecretCredential, DefaultAzureCredential, } = require("@azure/identity"); const { ResourceManagementClient } = require("@azure/arm-resources"); // Azure authentication in environment variables for DefaultAzureCredential let credentials = null; const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET"; const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID"; const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME"; if (process.env.production) { // production credentials = new DefaultAzureCredential(); } else { // development credentials = new ClientSecretCredential(tenantId, clientId, secret); console.log("development"); } async function deleteResourceGroup() { // Create Azure SDK client for Resource Management such as resource groups const resourceClient = new ResourceManagementClient( credentials, subscriptionId ); const result = await resourceClient.resourceGroups.deleteMethod( resourceGroupName ); console.log(JSON.stringify(result)); } deleteResourceGroup() .then((result) => { console.log(result); }) .catch((ex) => { console.log(ex); });
ローカル開発の場合は、認証用にファイル内の変数を変更します。
// Azure authentication in environment variables for DefaultAzureCredential const tenantId = process.env["AZURE_TENANT_ID"] || "REPLACE-WITH-YOUR-TENANT-ID"; const clientId = process.env["AZURE_CLIENT_ID"] || "REPLACE-WITH-YOUR-CLIENT-ID"; const secret = process.env["AZURE_CLIENT_SECRET"] || "REPLACE-WITH-YOUR-CLIENT-SECRET"; const subscriptionId = process.env["AZURE_SUBSCRIPTION_ID"] || "REPLACE-WITH-YOUR-SUBSCRIPTION_ID";
作成スクリプトから最後の行として返されたリソース グループ名を取得し、削除スクリプト内の変数を変更します。
const resourceGroupName = "REPLACE-WITH-YOUR-RESOURCE_GROUP-NAME";
コードを実行して VM を作成します。
node delete-resources.js
削除には数分かかる場合があります。
このスクリプトで使用される SDK メソッドは次のとおりです。
- リソース グループ - resourceClient.resourcegroups.delete
次のステップ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示