Статьи

Доступ к информации о среде ролей Azure из NodeJS

При работе в Azure может потребоваться получить информацию о вашей среде ролей: имя экземпляра текущей роли, идентификатор развертывания или даже то, запущен экземпляр роли или нет. Это может быть сложно, если вы используете NodeJS, потому что класс RoleEnvironment является управляемым кодом .net. В этой статье мы расскажем, как настроить доступ к информации о выполняющейся роли Azure с сервера NodeJS. Хитрость заключается в использовании переменных среды и задач запуска, выполняющих PowerShell, в качестве моста.

Я создал этот образец, который показывает все, чтобы вы могли проверить это самостоятельно. По сути, он содержит задачу запуска, которая выгружает информацию о среде роли Azure в переменные среды и файл server.js для вывода этих переменных. Во всяком случае, в следующих нескольких строках вы можете прочитать более глубокое объяснение того, как это сделать.

Что тебе необходимо сделать

Это в значительной степени то, что вы должны сделать:

  1. Создайте задачу запуска для запуска сценария cmd, который обращается к информации о среде Azure Role.
  2. Установите информацию в переменных окружения, чтобы к ней можно было получить доступ из NodeJS.
  3. Получите значения в файле server.js через объект process.env .

Итак, давайте углубимся в это. Сценарий cmd выглядит так:

переменные среды установки. cmd

@ECHO off
%~d0
CD "%~dp0"

IF EXIST %WINDIR%\SysWow64 (
set powerShellDir=%WINDIR%\SysWow64\windowspowershell\v1.0
) ELSE (
set powerShellDir=%WINDIR%\system32\windowspowershell\v1.0
)

ECHO Setting the Environment variables..
CALL %powerShellDir%\powershell.exe -Command Set-ExecutionPolicy unrestricted
CALL %powerShellDir%\powershell.exe -Command "& .\set_azure_role_information.ps1"
ECHO Done!

ECHO Restarting IIS..
CALL iisreset
ECHO Done!

ECHO Starting the W3SVC service..
CALL NET START W3SVC
ECHO Done!

Некоторые вещи, чтобы упомянуть об этом коде:

  • Чтобы выполнить неподписанный сценарий ps в Azure, необходимо установить для политики выполнения значение « Неограниченно» . Для этого я использую команду Set-ExecutionPolicy , но учтите, что это значение не изменится, если вы не сделаете это вручную. Лито указал мне, что в PowerShell 2.0 вы можете использовать команду -ExecutionPolicy, чтобы установить неограниченный доступ только для текущей области. Но поскольку в шаблоне WebRole по умолчанию используется osFamily = «1», то есть Windows Server 2008 с пакетом обновления 2 (SP2), который совместим с PowerShell 1.0, мы оставим это так ( smarx также написал кое-что об этом)
  • ВАЖНО: После установки переменных среды вам необходимо перезапустить IIS и перезапустить W3SVC, чтобы изменения вступили в силу в службе. W3SVC в Azure установлен в ручной режим, поэтому он не запускается автоматически после сброса.

Теперь давайте покопаемся в скрипте ps.

установить лазурь role_information.ps1

[Reflection.Assembly]::LoadWithPartialName("Microsoft.WindowsAzure.ServiceRuntime")
[Environment]::SetEnvironmentVariable("RoleName", [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Role.Name, "Machine") 
[Environment]::SetEnvironmentVariable("RoleInstanceID", [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id, "Machine")
[Environment]::SetEnvironmentVariable("RoleDeploymentID", [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::DeploymentId, "Machine")
[Environment]::SetEnvironmentVariable("IsAvailable", [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::IsAvailable, "Machine") 
[Environment]::SetEnvironmentVariable("CustomVariable", "Some value", "Machine")

Что мы делаем, это устанавливаем некоторые переменные окружения со значениями свойств RoleEnvironment. Обратите внимание, что вы также можете установить пользовательскую переменную, если хотите.

Это задача запуска, которая собирает все вместе.

ServiceDefinition.csdef

<Task commandLine="setup_environment_variables.cmd" executionContext="elevated" taskType="simple" />

И, наконец, ниже находится файл server.js, который записывает результаты в ответ.

server.js

var http = require('http');
var port = process.env.port || 1337;

http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });

res.write("Role Name: " + process.env.RoleName + "\n");
res.write("Role InstanceID: " + process.env.RoleInstanceID + "\n");
res.write("Role DeploymentID: " + process.env.RoleDeploymentID + "\n");
res.write("Is running?: " + process.env.IsAvailable + "\n");
res.write("Custom variable: " + process.env.CustomVariable + "\n");

res.end();
}).listen(port);

Вот результат, который вы получите, запустив пример в эмуляторе: