Skicka ett e-postmeddelande från en Automation-runbook

Du kan skicka ett e-postmeddelande från en runbook med SendGrid med hjälp av PowerShell.

Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Förutsättningar

Skapa ett Azure Key Vault

Skapa en Azure Key Vault- och Key Vault-åtkomstprincip som gör att autentiseringsuppgifterna kan hämta och ange nyckelvalvshemligheter i det angivna nyckelvalvet.

  1. Logga in på Azure interaktivt med cmdleten Anslut-AzAccount och följ anvisningarna.

    # 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. Ange ett lämpligt värde för variablerna nedan och kör sedan skriptet.

    $resourceGroup = "<Resource group>"
    $automationAccount = "<Automation account>"
    $region = "<Region>"
    $SendGridAPIKey = "<SendGrid API key>"
    $VaultName = "<A universally unique vault name>"
    
    $userAssignedManagedIdentity = "<User-assigned managed identity>"
    
  3. Skapa Key Vault och tilldela behörigheter

    # 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
    

    Andra sätt att skapa ett Azure Key Vault och lagra en hemlighet finns i Key Vault-snabbstarter.

Tilldela behörigheter till hanterade identiteter

Tilldela behörigheter till lämplig hanterad identitet. Runbooken kan använda antingen den systemtilldelade hanterade identiteten för Automation-kontot eller en användartilldelad hanterad identitet. Steg tillhandahålls för att tilldela behörigheter till varje identitet. Stegen nedan använder PowerShell. Om du föredrar att använda portalen kan du läsa Tilldela Azure-roller med hjälp av Azure-portalen.

  1. Använd PowerShell-cmdleten New-AzRoleAssignment för att tilldela en roll till den systemtilldelade hanterade identiteten.

    New-AzRoleAssignment `
        -ObjectId $SA_PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  2. Tilldela en roll till en användartilldelad hanterad identitet.

    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId`
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  3. För den systemtilldelade hanterade identiteten visar ClientId och registrerar du värdet för senare användning.

    $UAMI.ClientId
    

Skapa runbooken för att skicka ett e-postmeddelande

När du har skapat ett nyckelvalv och lagrat din SendGrid API-nyckel är det dags att skapa runbooken som hämtar API-nyckeln och skickar ett e-postmeddelande. Nu ska vi använda en runbook som använder den systemtilldelade hanterade identiteten för att autentisera med Azure för att hämta hemligheten från Azure Key Vault. Vi anropar runbooken Send-GridMailMessage. Du kan ändra PowerShell-skriptet som används för olika scenarier.

  1. Logga in på Azure-portalen och gå till ditt Automation-konto.

  2. På sidan för ditt öppna Automation-konto går du till ProcessAutomatisering och väljer Runbooks

  3. Välj + Skapa en runbook.

    1. Ge runbooken Send-GridMailMessagenamnet .
    2. I listrutan Runbook-typ väljer du PowerShell.
    3. Välj Skapa.

    Create Runbook

  4. Runbooken skapas och sidan Redigera PowerShell-runbook öppnas. Edit the Runbook

  5. Kopiera följande PowerShell-exempel till sidan Redigera. Kontrollera att anger det VaultName namn som du har valt för ditt 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. Om du vill att runbooken ska köras med den systemtilldelade hanterade identiteten lämnar du koden som den är. Om du föredrar att använda en användartilldelad hanterad identitet:

    1. Från rad 18 tar du bort $AzureContext = (Connect-AzAccount -Identity).context,
    2. Ersätt den med $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context, och
    3. Ange det klient-ID som du hämtade tidigare.
  7. Välj Spara, Publicera och sedan Ja när du uppmanas att göra det.

Du kan kontrollera att runbooken körs korrekt genom att följa stegen under Testa en runbook eller Starta en runbook.

Om du inte ser din test-e-post från början kontrollerar du skräppostmapparna.

Rensa resurser

  1. När runbooken inte längre behövs väljer du den i runbook-listan och väljer Ta bort.

  2. Ta bort Nyckelvalvet med cmdleten Remove-AzKeyVault .

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

Nästa steg