Отправка электронной почты из runbook службы автоматизации

Сообщение электронной почты из модуля Runbook можно отправить с помощью SendGrid, используя PowerShell.

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Необходимые компоненты

создать Azure Key Vault;

Создайте политику доступа к Azure Key Vault и Key Vault, которая позволяет учетным данным получать и задавать секреты хранилища ключей в указанном хранилище ключей.

  1. Войдите в 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>
    
  2. Укажите соответствующие значения для перечисленных ниже переменных, а затем выполните скрипт.

    $resourceGroup = "<Resource group>"
    $automationAccount = "<Automation account>"
    $region = "<Region>"
    $SendGridAPIKey = "<SendGrid API key>"
    $VaultName = "<A universally unique vault name>"
    
    $userAssignedManagedIdentity = "<User-assigned managed identity>"
    
  3. Создание 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".

  1. Примените командлет PowerShell New-AzRoleAssignment, чтобы назначить роль управляемому удостоверению, назначаемому системой.

    New-AzRoleAssignment `
        -ObjectId $SA_PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  2. Назначьте роль управляемому удостоверению, назначаемого пользователем.

    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId`
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  3. Для управляемого удостоверения, назначаемого системой, отображаются ClientId и записываются значения для последующего использования.

    $UAMI.ClientId
    

Создание модуля Runbook для отправки электронной почты

После создания Key Vault и сохранения SendGrid ключа API пришло время создать модуль Runbook, который извлекает ключ API и отправляет сообщение электронной почты. Давайте используем модуль Runbook, использующий управляемое удостоверение, назначаемое системой, для проверки подлинности в Azure для получения секрета из Azure Key Vault. Мы присвоим этому runbook имя Send-GridMailMessage. Вы можете изменить сценарий PowerShell, используемый для различных сценариев.

  1. Войдите на портал Azure и перейдите к учетной записи службы автоматизации Azure.

  2. На странице учетной записи службы автоматизации выберите элемент Модули Runbook в области Автоматизация процессов.

  3. Нажмите кнопку + Создать runbook.

    1. Присвойте новому модулю runbook имя Send-GridMailMessage.
    2. В раскрывающемся списке типов Runbook выберите PowerShell.
    3. Выберите Создать.

    Create Runbook

  4. После этого создается модуль runbook и откроется страница "Изменение Runbook PowerShell". Edit the Runbook

  5. Скопируйте следующий пример 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
    
  6. Если вы хотите, чтобы модуль runbook выполнялся с управляемым удостоверением, назначаемым системой, оставьте код как есть. Если вы предпочитаете использовать управляемое удостоверение, назначаемое пользователем, сделайте следующее:

    1. Из строки 18 удалите ,$AzureContext = (Connect-AzAccount -Identity).context
    2. Замените его $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context.
    3. Введите идентификатор клиента, полученный ранее.
  7. Нажмите кнопку "Сохранить", "Опубликовать" и "Да" при появлении запроса.

Чтобы убедиться, что runbook выполняется успешно, выполните действия из статьи Тестирование модуля Runbook или Start a runbook in Azure Automation (Запуск модуля Runbook в службе автоматизации Azure).

Если тестовое сообщение электронной почты не удастся получить сразу, проверьте папки Нежелательная почта и (или) Спам.

Очистка ресурсов

  1. Если модуль Runbook больше не нужен, выберите его в списке Runbook и нажмите кнопку "Удалить".

  2. Удалите Key Vault с помощью командлета Remove-AzKeyVault.

    $VaultName = "<your KeyVault name>"
    $resourceGroup = "<your ResourceGroup name>"
    Remove-AzKeyVault -VaultName $VaultName -ResourceGroupName $resourceGroup
    

Следующие шаги