Отправка электронной почты из runbook службы автоматизации
Сообщение электронной почты из модуля Runbook можно отправить с помощью SendGrid, используя PowerShell.
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Необходимые компоненты
Проверка отправителя SendGrid. Домен или один отправитель
Учетная запись службы автоматизации Azure, которой назначено хотя бы одно управляемое удостоверение. Дополнительные сведения см. в статье Включение управляемых удостоверений.
Модули Az:
Az.Accounts
иAz.KeyVault
, импортированные в учетную запись службы автоматизации. Дополнительные сведения см. в разделе Импорт модулей Az.Модуль Azure Az PowerShell, установленный на компьютере. Сведения об установке или обновлении см. в разделе Установка модуля Azure Az PowerShell.
создать Azure Key Vault;
Создайте политику доступа к Azure Key Vault и Key Vault, которая позволяет учетным данным получать и задавать секреты хранилища ключей в указанном хранилище ключей.
Войдите в Azure в интерактивном режиме с помощью командлета Connect-AzAccount и следуйте инструкциям.
# Sign in to your Azure subscription $sub = Get-AzSubscription -ErrorAction SilentlyContinue if(-not($sub)) { Connect-AzAccount } # If you have multiple subscriptions, set the one to use # Select-AzSubscription -SubscriptionId <SUBSCRIPTIONID>
Укажите соответствующие значения для перечисленных ниже переменных, а затем выполните скрипт.
$resourceGroup = "<Resource group>" $automationAccount = "<Automation account>" $region = "<Region>" $SendGridAPIKey = "<SendGrid API key>" $VaultName = "<A universally unique vault name>" $userAssignedManagedIdentity = "<User-assigned managed identity>"
Создание Key Vault и назначение разрешений
# Create the new key vault $newKeyVault = New-AzKeyVault ` -VaultName $VaultName ` -ResourceGroupName $resourceGroup ` -Location $region $resourceId = $newKeyVault.ResourceId # Convert the SendGrid API key into a SecureString $Secret = ConvertTo-SecureString -String $SendGridAPIKey ` -AsPlainText -Force Set-AzKeyVaultSecret -VaultName $VaultName ` -Name 'SendGridAPIKey' ` -SecretValue $Secret # Grant Key Vault access to the Automation account's system-assigned managed identity. $SA_PrincipalId = (Get-AzAutomationAccount ` -ResourceGroupName $resourceGroup ` -Name $automationAccount).Identity.PrincipalId Set-AzKeyVaultAccessPolicy ` -VaultName $vaultName ` -ObjectId $SA_PrincipalId ` -PermissionsToSecrets Set, Get # Grant Key Vault access to the user-assigned managed identity. $UAMI = Get-AzUserAssignedIdentity ` -ResourceGroupName $resourceGroup ` -Name $userAssignedManagedIdentity Set-AzKeyVaultAccessPolicy ` -VaultName $vaultName ` -ObjectId $UAMI.PrincipalId ` -PermissionsToSecrets Set, Get
Другие способы создания хранилища ключей в Azure Key Vault и сохранения секрета см. в кратких руководствах по Key Vault.
Назначьте разрешения управляемым удостоверениям
Назначьте разрешения соответствующему управляемому удостоверению. Runbook может использовать управляемое удостоверение учетной записи службы автоматизации, назначаемое пользователем или системой. Здесь приведены инструкции по назначению разрешений обоим видам удостоверений. Приведенные ниже действия используют PowerShell. Если вы предпочитаете использовать портал, см. статью "Назначение ролей Azure с помощью портал Azure".
Примените командлет PowerShell New-AzRoleAssignment, чтобы назначить роль управляемому удостоверению, назначаемому системой.
New-AzRoleAssignment ` -ObjectId $SA_PrincipalId ` -ResourceGroupName $resourceGroup ` -RoleDefinitionName "Reader"
Назначьте роль управляемому удостоверению, назначаемого пользователем.
New-AzRoleAssignment ` -ObjectId $UAMI.PrincipalId` -ResourceGroupName $resourceGroup ` -RoleDefinitionName "Reader"
Для управляемого удостоверения, назначаемого системой, отображаются
ClientId
и записываются значения для последующего использования.$UAMI.ClientId
Создание модуля Runbook для отправки электронной почты
После создания Key Vault и сохранения SendGrid
ключа API пришло время создать модуль Runbook, который извлекает ключ API и отправляет сообщение электронной почты. Давайте используем модуль Runbook, использующий управляемое удостоверение, назначаемое системой, для проверки подлинности в Azure для получения секрета из Azure Key Vault. Мы присвоим этому runbook имя Send-GridMailMessage. Вы можете изменить сценарий PowerShell, используемый для различных сценариев.
Войдите на портал Azure и перейдите к учетной записи службы автоматизации Azure.
На странице учетной записи службы автоматизации выберите элемент Модули Runbook в области Автоматизация процессов.
Нажмите кнопку + Создать runbook.
- Присвойте новому модулю runbook имя
Send-GridMailMessage
. - В раскрывающемся списке типов Runbook выберите PowerShell.
- Нажмите кнопку создания.
- Присвойте новому модулю runbook имя
После этого создается модуль runbook и откроется страница "Изменение Runbook PowerShell".
Скопируйте следующий пример PowerShell на страницу "Изменение". Убедитесь, что
VaultName
содержит имя, указанное при создании Key Vault.Param( [Parameter(Mandatory=$True)] [String] $destEmailAddress, [Parameter(Mandatory=$True)] [String] $fromEmailAddress, [Parameter(Mandatory=$True)] [String] $subject, [Parameter(Mandatory=$True)] [String] $content, [Parameter(Mandatory=$True)] [String] $ResourceGroupName ) # Ensures you do not inherit an AzContext in your runbook Disable-AzContextAutosave -Scope Process # Connect to Azure with system-assigned managed identity $AzureContext = (Connect-AzAccount -Identity).context # set and store context $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext $VaultName = "<Enter your vault name>" $SENDGRID_API_KEY = Get-AzKeyVaultSecret ` -VaultName $VaultName ` -Name "SendGridAPIKey" ` -AsPlainText -DefaultProfile $AzureContext $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", "Bearer " + $SENDGRID_API_KEY) $headers.Add("Content-Type", "application/json") $body = @{ personalizations = @( @{ to = @( @{ email = $destEmailAddress } ) } ) from = @{ email = $fromEmailAddress } subject = $subject content = @( @{ type = "text/plain" value = $content } ) } $bodyJson = $body | ConvertTo-Json -Depth 4 $response = Invoke-RestMethod -Uri https://api.sendgrid.com/v3/mail/send -Method Post -Headers $headers -Body $bodyJson
Если вы хотите, чтобы модуль runbook выполнялся с управляемым удостоверением, назначаемым системой, оставьте код как есть. Если вы предпочитаете использовать управляемое удостоверение, назначаемое пользователем, сделайте следующее:
- Из строки 18 удалите ,
$AzureContext = (Connect-AzAccount -Identity).context
- Замените его
$AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context
. - Введите идентификатор клиента, полученный ранее.
- Из строки 18 удалите ,
Нажмите кнопку "Сохранить", "Опубликовать" и "Да" при появлении запроса.
Чтобы убедиться, что runbook выполняется успешно, выполните действия из статьи Тестирование модуля Runbook или Start a runbook in Azure Automation (Запуск модуля Runbook в службе автоматизации Azure).
Если тестовое сообщение электронной почты не удастся получить сразу, проверьте папки Нежелательная почта и (или) Спам.
Очистка ресурсов
Если модуль Runbook больше не нужен, выберите его в списке Runbook и нажмите кнопку "Удалить".
Удалите Key Vault с помощью командлета Remove-AzKeyVault.
$VaultName = "<your KeyVault name>" $resourceGroup = "<your ResourceGroup name>" Remove-AzKeyVault -VaultName $VaultName -ResourceGroupName $resourceGroup
Следующие шаги
- Сведения об отправке данных задания runbook в рабочую область Log Analytics см. в статье Пересылка данных задания службы автоматизации Azure в журналы Azure Monitor.
- Чтобы отслеживать базовые метрики и журналы, воспользуйтесь статьей Использование оповещения для активации runbook службы автоматизации Azure.