Inviare un messaggio di posta elettronica da un runbook di Automazione

Per inviare un messaggio di posta elettronica da un runbook con SendGrid, è possibile usare PowerShell.

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Prerequisiti

Creare un Azure Key Vault

Creare un insieme di credenziali delle chiavi di Azure e criteri di accesso di Key Vault che consentano alle credenziali di ottenere e impostare i segreti dell'insieme di credenziali delle chiavi nell'insieme di credenziali delle chiavi specificato.

  1. Accedere ad Azure in modo interattivo usando il cmdlet Connessione-AzAccount e seguire le istruzioni.

    # 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. Specificare un valore appropriato per le variabili seguenti e quindi eseguire lo script.

    $resourceGroup = "<Resource group>"
    $automationAccount = "<Automation account>"
    $region = "<Region>"
    $SendGridAPIKey = "<SendGrid API key>"
    $VaultName = "<A universally unique vault name>"
    
    $userAssignedManagedIdentity = "<User-assigned managed identity>"
    
  3. Creare l'insieme di credenziali delle chiavi e assegnare le autorizzazioni

    # 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
    

    Per altre modalità di creazione di un'istanza di Azure Key Vault e di archiviazione di un segreto, vedere le guide di avvio rapido di Key Vault.

Assegnare le autorizzazioni alle identità gestite

Assegnare le autorizzazioni all'identità gestita appropriata. Il runbook può usare l'identità gestita assegnata dal sistema dell'account di Automazione o un'identità gestita assegnata dall'utente. Vengono forniti passaggi per assegnare le autorizzazioni a ogni identità. La procedura seguente usa PowerShell. Se si preferisce usare il portale, vedere Assegnare ruoli di Azure usando il portale di Azure.

  1. Usare il cmdlet di PowerShell New-AzRoleAssignment per assegnare un ruolo all'identità gestita assegnata dal sistema.

    New-AzRoleAssignment `
        -ObjectId $SA_PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  2. Assegnare un ruolo a un'identità gestita assegnata dall'utente.

    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId`
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  3. Per l'identità gestita assegnata dal sistema, visualizzare ClientId e registrare il valore per un uso successivo.

    $UAMI.ClientId
    

Creare il runbook per inviare un messaggio di posta elettronica

Dopo aver creato un insieme di credenziali delle chiavi e aver archiviato la SendGrid chiave API, è possibile creare il runbook che recupera la chiave API e invia un messaggio di posta elettronica. Si userà ora un runbook che usa l'identità gestita assegnata dal sistema per eseguire l'autenticazione con Azure per recuperare il segreto da Azure Key Vault. Il runbook sarà denominato Send-GridMailMessage. È possibile modificare lo script di PowerShell usato per diversi scenari.

  1. Accedere al portale di Azure e passare all'account di Automazione.

  2. Nella pagina apri account di Automazione, in Automazione processi selezionare Runbook

  3. Selezionare + Crea un runbook.

    1. Assegnare al runbook Send-GridMailMessageil nome .
    2. Nell'elenco a discesa Tipo di runbook selezionare PowerShell.
    3. Seleziona Crea.

    Create Runbook

  4. Il runbook viene creato e si apre la pagina Modifica runbook di PowerShell. Edit the Runbook

  5. Copiare l'esempio di PowerShell seguente nella pagina Modifica. Assicurarsi che VaultName specifichi il nome scelto per l'istanza di 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. Se si vuole che il runbook venga eseguito con l'identità gestita assegnata dal sistema, lasciare invariato il codice. Se si preferisce usare un'identità gestita assegnata dall'utente, procedere come illustrato di seguito:

    1. Dalla riga 18 rimuovere $AzureContext = (Connect-AzAccount -Identity).context,
    2. Sostituirlo con $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).contexte
    3. Immettere l'ID client ottenuto in precedenza.
  7. Selezionare Salva, Pubblica e quindi quando richiesto.

Per verificare che il runbook venga eseguito correttamente, è possibile seguire la procedura descritta in Testare un runbook o Avviare un runbook.

Se il messaggio di posta elettronica non viene visualizzato inizialmente, controllare la cartella Postaindesiderata.

Pulire le risorse

  1. Quando il runbook non è più necessario, selezionarlo nell'elenco dei runbook e selezionare Elimina.

  2. Eliminare l'istanza di Key Vault usando il cmdlet Remove-AzKeyVault.

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

Passaggi successivi