Статьи

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

Во время работы в Azure вам может потребоваться получить информацию о вашей среде ролей. Текущее имя экземпляра роли, DeploymentID или даже знать, запущен экземпляр роли или нет. Это может быть сложно, если вы используете 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);

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