Руководство разработчика PowerShell для Функций Azure.
В этой статье рассказывается, как писать Функции Azure с помощью PowerShell.
Функция Azure PowerShell (далее "функция") представляется в виде скрипта PowerShell, который выполняется при срабатывании. Каждый скрипт функции имеет связанный function.json
файл, определяющий поведение функции, например, как он активируется, а также его входные и выходные параметры. Дополнительные сведения см. в статье о триггерах и привязках.
Функции скриптов PowerShell, как и другие типы функций, принимают параметры, соответствующие именам всех входных привязок, определенных в файле function.json
. Также передается параметр TriggerMetadata
, содержащий дополнительные сведения о триггере, который запустил функцию.
В этой статье предполагается, что вы уже прочли руководство для разработчиков по Функциям Azure. Кроме того, предполагается, что вы выполнили краткое руководство по функциям Для PowerShell, чтобы создать первую функцию PowerShell .
Структура папок
Необходимая структура папок для проекта PowerShell выглядит следующим образом. Это значение по умолчанию можно изменить. Дополнительные сведения см. в разделе scriptFile .
PSFunctionApp
| - MyFirstFunction
| | - run.ps1
| | - function.json
| - MySecondFunction
| | - run.ps1
| | - function.json
| - Modules
| | - myFirstHelperModule
| | | - myFirstHelperModule.psd1
| | | - myFirstHelperModule.psm1
| | - mySecondHelperModule
| | | - mySecondHelperModule.psd1
| | | - mySecondHelperModule.psm1
| - local.settings.json
| - host.json
| - requirements.psd1
| - profile.ps1
| - extensions.csproj
| - bin
В корневой папке проекта существует общий файл host.json
, который может использоваться для настройки приложения-функции. У каждой функции есть папка с собственным файлом кода (PS1) и файлом конфигурации привязки (function.json
). Имя родительского каталога файла function.json всегда является именем этой функции.
Для определенных привязок требуется наличие файла extensions.csproj
. Расширения привязки, необходимые в версии 2.x и более поздних среды выполнения функций, определены в файле extensions.csproj
с фактическими файлами библиотеки в папке bin
. При локальной разработке необходимо зарегистрировать расширения привязки. При разработке функций в портал Azure эта регистрация выполняется для вас.
В приложениях-функциях PowerShell может быть при необходимости запущено profile.ps1
приложение-функция (в противном случае — холодный запуск). Дополнительные сведения см. в статье Профиль PowerShell.
Определение скрипта PowerShell как функции
По умолчанию среда выполнения Функций ищет функцию в файле run.ps1
, где run.ps1
использует тот же родительский каталог, что и соответствующий файл function.json
.
Скрипт передает несколько аргументов при выполнении. Для обработки этих параметров добавьте блок param
в начало скрипта, как в следующем примере.
# $TriggerMetadata is optional here. If you don't need it, you can safely remove it from the param block
param($MyFirstInputBinding, $MySecondInputBinding, $TriggerMetadata)
Параметр TriggerMetadata
Параметр TriggerMetadata
используется для предоставления дополнительных сведений о триггере. Эти метаданные зависят от привязки к привязке, но все они содержат sys
свойство, содержащее следующие данные:
$TriggerMetadata.sys
Свойство | Описание | Тип |
---|---|---|
UtcNow | Время активации функции (в формате UTC) | Дата/время |
MethodName | Имя активированной функции | строка |
RandGuid | Уникальный GUID для этого выполнения функции | строка |
Каждый тип триггера имеет свой набор метаданных. Например, $TriggerMetadata
для QueueTrigger
, помимо прочего, содержит InsertionTime
, Id
и DequeueCount
. Дополнительные сведения о метаданных триггера очереди см. в официальной документации по триггерам очереди. Чтобы узнать, что входит в метаданные триггера, ознакомьтесь с документацией по триггерам, с которыми вы работаете.
Привязки
В PowerShell привязки настраиваются и определяются в файле function.json функции. Функции взаимодействуют с привязками несколькими способами.
Чтение триггера и входных данных
Триггеры и входные привязки считываются как параметры, передаваемые в вашу функцию. Для входных привязок в файле function.json значению direction
присваивается значение in
. Свойство name
, определенное в файле function.json
, является именем параметра в блоке param
. Поскольку в PowerShell для привязки используются именованные параметры, порядок параметров не имеет значения. При этом рекомендуется следовать порядку привязок, определенному в файле function.json
.
param($MyFirstInputBinding, $MySecondInputBinding)
запись выходных данных;
В Функциях в файле function.json параметру direction
присваивается значение out
. Для записи данных в выходную привязку можно использовать командлет Push-OutputBinding
, доступный в среде выполнения Функций. Во любом случае свойство name
привязки, определенное в файле function.json
, соответствует параметру Name
командлета Push-OutputBinding
.
В следующем примере показано, как вызвать Push-OutputBinding
в скрипте функции:
param($MyFirstInputBinding, $MySecondInputBinding)
Push-OutputBinding -Name myQueue -Value $myValue
Значение для конкретной привязки можно также передать через конвейер.
param($MyFirstInputBinding, $MySecondInputBinding)
Produce-MyOutputValue | Push-OutputBinding -Name myQueue
Командлет Push-OutputBinding
ведет себя по-разному в зависимости от того, какое значение указано для параметра -Name
.
Если указанное имя не может быть разрешено для допустимой выходной привязки, возникает ошибка.
Если выходная привязка принимает коллекцию значений, можно вызвать командлет
Push-OutputBinding
многократно, чтобы отправить несколько значений.Если выходная привязка принимает только отдельное значение, вызов командлета
Push-OutputBinding
во второй раз приведет к ошибке.
Синтаксис командлета Push-OutputBinding
Для вызова командлета Push-OutputBinding
допустимы следующие параметры.
Имя. | Тип | Position | Description |
---|---|---|---|
-Name |
Строка | 1 | Имя выходной привязки, которую вам нужно задать. |
-Value |
Object | 2 | Значение выходной привязки, которую вам нужно задать, принимается из конвейера ByValue. |
-Clobber |
SwitchParameter | Названный | (Необязательно.) Если задан, приводит к установке значения для определенной выходной привязки. |
Также поддерживаются следующие общие параметры.
Verbose
Debug
ErrorAction
ErrorVariable
WarningAction
WarningVariable
OutBuffer
PipelineVariable
OutVariable
Дополнительные сведения см. в статье Об общих параметрах.
Пример командлета Push-OutputBinding: HTTP-ответы
Триггер HTTP возвращает ответ, используя выходную привязку с именем response
. В следующем примере выходная привязка response
имеет значение output #1.
PS >Push-OutputBinding -Name response -Value ([HttpResponseContext]@{
StatusCode = [System.Net.HttpStatusCode]::OK
Body = "output #1"
})
Поскольку выходные данные передаются в HTTP, который принимает только отдельное значение, при повторном вызове командлета Push-OutputBinding
возникает ошибка.
PS >Push-OutputBinding -Name response -Value ([HttpResponseContext]@{
StatusCode = [System.Net.HttpStatusCode]::OK
Body = "output #2"
})
Для выходных данных, которые принимают только отдельные значения, можно использовать переопределение старого значения с помощью параметра -Clobber
, а не пытаться добавить его в коллекцию. В следующем примере предполагается, что вы уже добавили значение. При использовании параметра -Clobber
ответ из следующего примера переопределяет существующее значение и возвращает значение output #3.
PS >Push-OutputBinding -Name response -Value ([HttpResponseContext]@{
StatusCode = [System.Net.HttpStatusCode]::OK
Body = "output #3"
}) -Clobber
Пример командлета Push-OutputBinding: выходная привязка очереди
Командлет Push-OutputBinding
используется для отправки данных в выходные привязки, такие как выходная привязка хранилища очередей Azure. В следующем примере сообщение, которое записывается в очередь, имеет значение output #1.
PS >Push-OutputBinding -Name outQueue -Value "output #1"
Выходная привязка для очереди хранилища принимает несколько выходных значений. В этом случае при вызове следующего примера после первой записи в очередь выдаются два элемента: output #1 и output #2.
PS >Push-OutputBinding -Name outQueue -Value "output #2"
В следующем примере, если командлет вызывается после двух предыдущих, он добавляет в выходную коллекцию еще два значения.
PS >Push-OutputBinding -Name outQueue -Value @("output #3", "output #4")
При записи в очередь сообщение содержит следующие четыре значения: output #1, output #2, output #3 и output #4.
Командлет Get-OutputBinding
Командлет Get-OutputBinding
позволяет получать значения, установленные для ваших выходных привязок в данный момент. Этот командлет извлекает хэш-таблицу, содержащую имена выходных привязок с соответствующими значениями.
Ниже приведен пример использования командлета Get-OutputBinding
для получения текущих значений привязки.
Get-OutputBinding
Name Value
---- -----
MyQueue myData
MyOtherQueue myData
Командлет Get-OutputBinding
также содержит параметр с именем -Name
, который можно использовать для фильтрования возвращаемой привязки, как показано в следующем примере.
Get-OutputBinding -Name MyQ*
Name Value
---- -----
MyQueue myData
В командлете Get-OutputBinding
можно использовать подстановочные знаки (*).
Ведение журнала
Ведение журнала в функциях PowerShell работает как обычное ведение журнала PowerShell. Командлеты ведения журнала можно использовать для записи данных в каждый выходной поток. Каждый командлет сопоставляется с уровнем ведения журнала, который используется Функциями.
Уровень ведения журнала Функций | Командлет ведения журнала |
---|---|
Ошибка | Write-Error |
Предупреждение | Write-Warning |
Информация | Write-Information Write-Host Write-Output Записывает на уровень ведения журнала Information . |
Отладка | Write-Debug |
Трассировка | Write-Progress Write-Verbose |
Все, что записывается в конвейер помимо этих командлетов, перенаправляется на уровень ведения журнала Information
и отображается с форматированием PowerShell по умолчанию.
Внимание
Командлетов Write-Verbose
и Write-Debug
недостаточно для просмотра сведений в журнале на уровне подробной информации и на уровне отладки. Кроме того, необходимо настроить пороговое значение для уровня ведения журнала, которое объявляет, какой уровень журналов вас интересует. Дополнительные сведения см. в разделе Настройка уровня ведения журнала для приложения-функции.
Настройка уровня ведения журнала для приложения-функции
Функции Azure позволяют определить пороговый уровень и, таким образом, упростить управление порядком записи данных в журналы Функций. Чтобы задать пороговое значение для всех трассировок, которые записываются в консоль, используйте свойство logging.logLevel.default
в файле host.json
. Этот параметр применяется ко всем функциям в приложении-функции.
В следующем примере устанавливается пороговое значение для включения подробного ведения журнала для всех функций, и при этом задается пороговое значение включения ведения журнала отладки для функции с именем MyFunction
.
{
"logging": {
"logLevel": {
"Function.MyFunction": "Debug",
"default": "Trace"
}
}
}
Дополнительные сведения см. в справочной статье о host.json.
Просмотр журналов
Если приложение-функция выполняется в Azure, можно использовать для мониторинга Application Insights. Дополнительные сведения о просмотре журналов функций и обращении к ним см. в статье мониторинг Функций Azure.
Если вы используете приложение-функцию локально для разработки, журнал по умолчанию ведется в файловой системе. Для просмотра журналов в консоли задайте для переменной среды AZURE_FUNCTIONS_ENVIRONMENT
значение Development
, прежде чем запускать приложение-функцию.
Типы триггеров и привязок
Существует множество триггеров и привязок, доступных для использования с приложением-функцией. Полный список триггеров и привязок см. здесь.
Все триггеры и привязки представлены в коде как несколько реальных типов данных.
- Хэш-таблица
- строка
- byte[]
- INT
- двойной точности
- HttpRequestContext
- HttpResponseContext
Первые пять типов в этом списке являются стандартными типами .NET. Последние два использует только триггер HttpTrigger.
Каждый параметр привязки в ваших функциях должен относиться к одному из этих типов.
Триггеры и привязки HTTP
Триггеры HTTP и webhook, а также привязки вывода HTTP используют объекты запроса и ответа для обмена сообщениями HTTP.
Объект запроса
Объект запроса, передаваемый в скрипт, имеет тип HttpRequestContext
, имеющий следующие свойства:
Свойство | Описание | Тип |
---|---|---|
Body |
Объект, содержащий текст запроса. Свойство Body сериализуется в тип, оптимальный для данных. Например, если данные являются JSON, он передается в виде хэш-файла. Если данные являются строкой, они передаются как строка. |
объект |
Headers |
Словарь, содержащий заголовки запросов. | Словарь<строка, строка>* |
Method |
Метод HTTP, используемый для запроса. | строка |
Params |
Объект, содержащий параметры маршрутизации запроса. | Словарь<строка, строка>* |
Query |
Объект, содержащий параметры запроса. | Словарь<строка, строка>* |
Url |
URL-адрес запроса. | строка |
* В ключах Dictionary<string,string>
регистр не учитывается.
Объект ответа
Объект ответа, который необходимо отправить обратно, имеет тип HttpResponseContext
со следующими свойствами.
Свойство | Описание | Тип |
---|---|---|
Body |
Объект, содержащий текст ответа. | объект |
ContentType |
Быстрый способ установки типа содержимого для ответа. | строка |
Headers |
Объект, содержащий заголовок ответа. | Словарь или хэш-таблица |
StatusCode |
Код состояния HTTP для ответа. | строка или целое число |
Доступ к запросу и ответу
При работе с триггерами HTTP доступ к HTTP-запросу можно получить точно так же, как и с любой другой входной привязкой. Он находится в блоке param
.
HttpResponseContext
Используйте объект для возврата ответа, как показано в следующем примере:
function.json
{
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"authLevel": "anonymous"
},
{
"type": "http",
"direction": "out",
"name": "Response"
}
]
}
run.ps1
param($req, $TriggerMetadata)
$name = $req.Query.Name
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [System.Net.HttpStatusCode]::OK
Body = "Hello $name!"
})
Результат вызова этой функции будет выглядеть следующим образом.
PS > irm http://localhost:5001?Name=Functions
Hello Functions!
Приведение типов триггеров и привязок
Для некоторых привязок, например привязки BLOB-объектов, можно указывать тип параметра.
Например, чтобы данные из хранилища BLOB-объектов передавались в виде строки, добавьте в блок param
следующее приведение типа.
param([string] $myBlob)
Профиль PowerShell
В PowerShell есть понятие профиля PowerShell. Если вы не знакомы с профилями PowerShell, см. статью О профилях.
В Функциях PowerShell скрипт профиля выполняется для каждого экземпляра рабочего процесса PowerShell в приложении по одному разу при первом развертывании и после пребывания в бездействии (холодный запуск). Если с помощью значения PSWorkerInProcConcurrencyUpperBound включен параллелизм, скрипт профиля выполняется для каждого созданного пространства выполнения.
При создании приложения-функции с использованием таких средств, как Visual Studio Code и Azure Functions Core Tools, создается значение по умолчанию profile.ps1
. Профиль по умолчанию хранится в репозитории основных средств GitHub и содержит следующее:
- автоматическая проверка подлинности MSI в Azure;
- возможность при желании включать псевдонимы
AzureRM
в Azure PowerShell.
Версии PowerShell
В следующей таблице показаны версии PowerShell, доступные для каждой основной версии среды выполнения Функций, и требуемая версия .NET.
Версия службы "Функции" | Версия PowerShell | Версия .NET |
---|---|---|
4.x | PowerShell 7.4 | .NET 8 |
4.x | PowerShell 7.2 (окончание поддержки) | .NET 6 |
Чтобы выяснить текущую версию, распечатайте $PSVersionTable
из любой функции.
Дополнительные сведения о политике поддержки среды выполнения в Функциях Azure см. в этой статье
Примечание.
Поддержка PowerShell 7.2 в Функции Azure заканчивается 8 ноября 2024 г. При обновлении функций PowerShell 7.2 для запуска в PowerShell 7.4 может потребоваться устранить некоторые критические изменения. Следуйте этому руководству по миграции, чтобы перейти на PowerShell 7.4.
Локальное выполнение в определенной версии
При локальном запуске функций PowerShell необходимо добавить параметр "FUNCTIONS_WORKER_RUNTIME_VERSION" : "7.4"
Values
в массив в файл local.setting.json в корневом каталоге проекта. При локальном запуске в PowerShell 7.4 файл local.settings.json выглядит следующим образом:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "powershell",
"FUNCTIONS_WORKER_RUNTIME_VERSION" : "7.4"
}
}
Примечание.
В Функциях PowerShell значение "~7" для FUNCTIONS_WORKER_RUNTIME_VERSION относится к "7.0.x". Мы не обновляем автоматически приложения-функции PowerShell, имеющие "~7" до "7.4". Для приложений-функций PowerShell потребуется, чтобы приложения указали основную и дополнительную версию, которую они хотят использовать. Следовательно, необходимо упомянуть "7.4", если вы хотите использовать "7.4.x".
Изменение версии PowerShell
Перед переносом приложения-функции PowerShell в PowerShell 7.4 следует учитывать следующие рекомендации.
Так как миграция может привести к критическим изменениям в приложении, ознакомьтесь с этим руководством по миграции перед обновлением приложения до PowerShell 7.4.
Убедитесь, что приложение-функция работает в последней версии среды выполнения Функций в Azure, которая является версией 4.x. Дополнительные сведения см. в разделе "Просмотр и обновление текущей версии среды выполнения".
Чтобы изменить версию PowerShell, используемую приложением-функцией, выполните указанные ниже действия. Эту операцию можно выполнить в портал Azure или с помощью PowerShell.
На портале Azure перейдите к приложению-функции.
В разделе Параметры выберите пункт Конфигурация. На вкладке Общие параметры найдите версию PowerShell.
Выберите нужную версию PowerShell Core и нажмите Сохранить. Когда появится предупреждение об ожидающем перезапуске, нажмите Продолжить. Приложение-функция перезапустится в выбранной версии PowerShell.
Примечание.
Функции Azure поддержка PowerShell 7.4 общедоступна(общедоступная версия). PowerShell 7.4 по-прежнему отображается как предварительная версия в портал Azure, но это будет обновлено в ближайшее время, чтобы отразить состояние общедоступной версии.
После внесения изменений в конфигурацию приложение-функция перезапустится.
Управление зависимостями
Управление модулями в Функции Azure, написанных в PowerShell, можно двумя способами: с помощью функции управляемых зависимостей или включения модулей непосредственно в содержимое приложения. Каждый метод имеет свои собственные преимущества, и выбор правильного зависит от ваших конкретных потребностей.
Выбор правильного подхода к управлению модулями
Почему используйте функцию управляемых зависимостей?
- Упрощенная начальная установка: автоматически обрабатывает установку модуля на
requirements.psd1
основе файла. - Автоматическое обновление: модули обновляются автоматически, включая исправления безопасности, не требуя вмешательства вручную.
Зачем включать модули в содержимое приложения?
- Нет зависимости от коллекция PowerShell: модули упаковываются в приложение, устраняя внешние зависимости.
- Дополнительные средства управления: избегает риска регрессии, вызванной автоматическим обновлением, что дает полный контроль над используемыми версиями модулей.
- Совместимость: работает с гибким потреблением и рекомендуется использовать для других номеров SKU Linux.
Функция управляемых зависимостей
Функция управляемых зависимостей позволяет Функции Azure автоматически загружать модули PowerShell и управлять ими, указанными requirements.psd1
в файле. Эта функция включена по умолчанию в новых приложениях-функциях PowerShell.
Настройка requirements.psd1
Чтобы использовать управляемые зависимости в Функции Azure с PowerShell, необходимо настроить requirements.psd1
файл. Этот файл указывает необходимые модули, и Функции Azure автоматически скачивать и обновлять эти модули, чтобы обеспечить актуальность вашей среды.
Вот как настроить и настроить requirements.psd1
файл:
requirements.psd1
Создайте файл в корневом каталоге функции Azure, если он еще не существует.- Определите модули и их версии в структуре данных PowerShell.
Пример файла requirements.psd1
:
@{
'Az' = '9.*' # Specifies the Az module and will use the latest version with major version 9
}
Включение модулей в содержимое приложения
Для получения большего контроля над версиями модулей и предотвращения зависимостей внешних ресурсов можно включить модули непосредственно в содержимое приложения-функции.
Чтобы включить пользовательские модули, выполните следующие действия.
Создайте папку
Modules
в корне приложения-функции.mkdir ./Modules
Скопируйте модули в папку
Modules
с помощью одного из следующих методов:Если модули уже доступны локально:
Copy-Item -Path /mymodules/mycustommodule -Destination ./Modules -Recurse
Использование
Save-Module
для получения из коллекция PowerShell:Save-Module -Name MyCustomModule -Path ./Modules
Использование
Save-PSResource
изPSResourceGet
модуля:Save-PSResource -Name MyCustomModule -Path ./Modules
Приложение-функция должно иметь следующую структуру:
PSFunctionApp
| - MyFunction
| | - run.ps1
| | - function.json
| - Modules
| | - MyCustomModule
| | - MyOtherCustomModule
| | - MySpecialModule.psm1
| - local.settings.json
| - host.json
| - requirements.psd1
При запуске приложения-функции обработчик языка в PowerShell добавляет эту папку Modules
в $env:PSModulePath
, чтобы вы могли использовать автозагрузку модуля, как в обычном сценарии PowerShell.
Устранение неполадок управляемых зависимостей
Включение управляемых зависимостей
Чтобы управляемые зависимости функционировали, функция должна быть включена в host.json:
{
"managedDependency": {
"enabled": true
}
}
Конкретные целевые версии
При выборе определенных версий модулей важно выполнить оба следующих шага, чтобы убедиться, что задана правильная версия модуля:
Укажите версию модуля в
requirements.psd1
:@{ 'Az.Accounts' = '1.9.5' }
Добавление инструкции импорта в
profile.ps1
:Import-Module Az.Accounts -RequiredVersion '1.9.5'
После выполнения этих действий гарантируется, что указанная версия загружается при запуске функции.
Настройка определенных параметров интервала управляемой зависимости
Вы можете настроить скачивание и установку управляемых зависимостей с помощью следующих параметров приложения:
Параметр | Значение по умолчанию | Description |
---|---|---|
MDMaxBackgroundUpgradePeriod | 7.00:00:00 (семь дней) |
Управляет периодом фонового обновления для приложений-функций PowerShell. |
MDNewSnapshotCheckPeriod | 01:00:00 (один час) |
Указывает, как часто рабочая роль PowerShell проверяет наличие обновлений. |
MDMinBackgroundUpgradePeriod | 1.00:00:00 (один день) |
Минимальное время между проверками обновления. |
Рекомендации по управлению зависимостями
- Доступ к Интернету: управляемые зависимости требуют доступа к
https://www.powershellgallery.com
модулям скачивания. Убедитесь, что ваша среда разрешает этот доступ, включая изменение правил брандмауэра или виртуальной сети по мере необходимости. - Принятие лицензий. Управляемые зависимости не поддерживают модули, требующие принятия лицензий.
- План потребления Flex: функция управляемых зависимостей не поддерживается в плане потребления Flex. Вместо этого используйте пользовательские модули.
- Расположения модулей: на локальном компьютере модули обычно устанавливаются в одну из глобальных доступных папок в вашей системе
$env:PSModulePath
. При запуске в Azure$env:PSModulePath
приложение-функция PowerShell отличается от$env:PSModulePath
обычного скрипта PowerShell и будет содержать как папку, отправленную с содержимым приложения, такModules
и отдельное расположение, управляемое управляемыми зависимостями.
Переменные среды
В Функциях параметры приложения, такие как строки подключения службы, доступны в виде переменных среды во время выполнения. Вы можете получить доступ к этим параметрам с помощью $env:NAME_OF_ENV_VAR
, как показано в следующем примере.:
param($myTimer)
Write-Host "PowerShell timer trigger function ran! $(Get-Date)"
Write-Host $env:AzureWebJobsStorage
Write-Host $env:WEBSITE_SITE_NAME
Существует несколько способов для добавления, обновления и удаления параметров приложения-функции.
После изменения параметров приложения-функции нужно перезапустить приложение-функцию.
При локальном запуске приложения параметры считываются из файла проекта local.settings.json.
Параллелизм
По умолчанию среда выполнения Функций PowerShell может обрабатывать только один вызов функции за раз. Однако данного уровня параллелизма может быть недостаточно в следующих ситуациях:
- при попытке обработки большого количества вызовов одновременно;
- при наличии функций, которые вызывают другие функции в одном и том же приложении-функции.
В зависимости от типа рабочей нагрузки можно попробовать несколько моделей параллелизма.
Увеличьте
FUNCTIONS_WORKER_PROCESS_COUNT
. Увеличение этого параметра позволяет обрабатывать вызовы функций в нескольких процессах в одном экземпляре, что приводит к определенным затратам на ЦП и память. Как правило, функции ввода-вывода не страдают от этой нагрузки. Для функций, зависящих от процессора, влияние может быть значительным.Увеличьте значение параметра приложения
PSWorkerInProcConcurrencyUpperBound
. Увеличение этого параметра позволяет создавать несколько пространств выполнения в одном процессе, что значительно снижает нагрузку на ЦП и память.
Эти переменные среды задаются в параметрах приложения для приложения функции.
В зависимости от варианта использования масштабируемость могут значительно повысить Устойчивые функции. Дополнительные сведения см. в разделе Шаблоны приложения Устойчивых функций.
Примечание.
Если появится сообщение "запросы помещаются в очередь из-за отсутствия доступных пространств выполнения", это не ошибка. Такое сообщение говорит о том, что запросы помещаются в очередь и будут обработаны после выполнения предыдущих запросов.
Рекомендации по использованию параллелизма
PowerShell является отдельным потоковым языком сценариев по умолчанию. При этом параллелизм можно добавить, используя несколько пространств выполнения PowerShell в одном и том же процессе. Количество созданных пространств выполнения и, следовательно, количество параллельных потоков на одну рабочую роль ограничивается параметром приложения PSWorkerInProcConcurrencyUpperBound
. По умолчанию для количества пространств выполнения функций задано значение 1000 в версии 4.x среды выполнения Функций. В версиях 3.x и более поздних максимальное число пространств выполнения равно 1. Пропускная способность приложения-функции влияет на объем ЦП и памяти, доступных в выбранном плане.
Azure PowerShell использует некоторые контексты и состояния на уровне процесса, что позволяет писать меньше кода. Однако при включении параллелизма в приложении-функции и вызове действий, изменяющих состояние, могут возникать состояния гонки. Их трудно отлаживать, потому что один вызов требует определенного состояния, а другой изменил это состояние.
Параллелизм в Azure PowerShell полезен потому, что некоторые операции могут занимать много времени. При этом следует соблюдать осторожность. Если вы считаете, что столкнулись с состоянием гонки, задайте для параметра приложения PSWorkerInProcConcurrencyUpperBound значение 1
и используйте для параллелизма изоляцию на уровне обработки обработчика языков.
Настройка свойства scriptFile функции
По умолчанию функция PowerShell выполняется из файла run.ps1
, расположенного в том же родительском каталоге, что и соответствующий файл function.json
.
Свойство scriptFile
в файле function.json
можно использовать для получения структуры папок, которая выглядит следующим образом.
FunctionApp
| - host.json
| - myFunction
| | - function.json
| - lib
| | - PSFunction.ps1
В этом случае function.json
для myFunction
включает свойство scriptFile
, которое для выполнения ссылается на файл с экспортированной функцией.
{
"scriptFile": "../lib/PSFunction.ps1",
"bindings": [
// ...
]
}
Использование модулей PowerShell путем настройки entryPoint
Функции PowerShell в этой статье показаны с файлом скрипта по умолчанию run.ps1
, созданным шаблонами.
Однако функции можно включить и в модулях PowerShell. Вы можете привести в модуле ссылку на код определенной функции, используя поля scriptFile
и entryPoint
в файле конфигурации function.json.
В этом случае entryPoint
— это имя функции или командлета в модуле PowerShell, на которые ссылается scriptFile
.
Рассмотрите следующую структуру папок.
FunctionApp
| - host.json
| - myFunction
| | - function.json
| - lib
| | - PSFunction.psm1
PSFunction.psm1
содержит следующий код.
function Invoke-PSTestFunc {
param($InputBinding, $TriggerMetadata)
Push-OutputBinding -Name OutputBinding -Value "output"
}
Export-ModuleMember -Function "Invoke-PSTestFunc"
В этом примере конфигурация myFunction
включает свойство scriptFile
, которое ссылается на модуль PowerShell PSFunction.psm1
в другой папке. Свойство entryPoint
ссылается на функцию Invoke-PSTestFunc
, которая в этом модуле является точкой входа.
{
"scriptFile": "../lib/PSFunction.psm1",
"entryPoint": "Invoke-PSTestFunc",
"bindings": [
// ...
]
}
В этой конфигурации функция Invoke-PSTestFunc
выполняется точно так же, как выполнялся бы скрипт run.ps1
.
Рекомендации для функций PowerShell
При работе с функциями PowerShell следует помнить о рекомендациях, приведенных в следующих разделах.
Холодный запуск
С разработкой Функций Azure в виде бессерверной модели размещения холодные запуски стали реальностью. Холодный запуск — это период времени, который требуется для запуска приложения-функции и обработки запроса. Холодный запуск чаще происходит в плане потребления, поскольку в периоды бездействия приложение-функция завершает работу.
Избегайте использования install-Module
Выполнение Install-Module
в скрипте функции для каждого вызова может привести к проблемам с производительностью. Вместо этого используйте Save-Module
или Save-PSResource
перед публикацией приложения-функции для упаковки необходимых модулей.
Дополнительные сведения см. в разделе "Управление зависимостями ".
Следующие шаги
Дополнительные сведения см. на следующих ресурсах: