Envoyer un e-mail à partir d’un runbook Automation

Vous pouvez envoyer un e-mail à partir d’un runbook avec SendGrid à l’aide de PowerShell.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Prérequis

Créer un Azure Key Vault

Créez une instance Azure Key Vault et stratégie d’accès Key Vault qui permet aux informations d’identification d’accéder et de définir les secrets de coffre de clés dans le coffre de clés spécifié.

  1. Connectez-vous à Azure de manière interactive à l’aide de la cmdlet Connect-AzAccount et suivez les instructions.

    # 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. Fournissez une valeur appropriée pour les variables ci-dessous, puis exécutez le 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. Créer une instance Key Vault et assigner des autorisations

    # 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
    

    Pour découvrir d’autres méthodes de création d’un coffre de clés Azure et de stockage d’un secret, consultez Démarrages rapides Key Vault.

Attribuer des autorisations aux identités managées

Affectez des autorisations à l’identité managée appropriée. Le runbook peut utiliser l’identité managée affectée par le système du compte Automation ou une identité managée affectée par l’utilisateur. Des étapes sont fournies pour affecter des autorisations à chaque identité. Les étapes ci-dessous utilisent PowerShell. Si vous préférez utiliser le portail, consultez Attribuer des rôles Azure à l’aide du portail Azure.

  1. Utilisez la cmdlet PowerShell New-AzRoleAssignment pour affecter un rôle à l’identité managée affectée par le système.

    New-AzRoleAssignment `
        -ObjectId $SA_PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  2. Attribuer un rôle à une identité managée affectée par l'utilisateur.

    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId`
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  3. Pour l’identité managée affectée par le système, affichez ClientId et enregistrez la valeur pour une utilisation ultérieure.

    $UAMI.ClientId
    

Créer le runbook pour envoyer un e-mail

Une fois que vous avez créé un coffre de clés et stocké votre clé API SendGrid, il est temps de créer le runbook qui récupère la clé API et envoie un e-mail. Utilisons un runbook qui utilise l'Identité managée affectée par le système pour s'authentifier auprès d'Azure et extraire le secret d'Azure Key Vault. Nous allons appeler le runbook Send-GridMailMessage. Vous pouvez modifier le script PowerShell utilisé pour différents scénarios.

  1. Connectez-vous au portail Azure et accédez à votre compte Automation.

  2. Dans la page de votre compte Automation ouvert, sous Automatisation de processus, sélectionnez Runbooks

  3. Sélectionnez + Créer un runbook.

    1. Nommez le runbook Send-GridMailMessage.
    2. Dans la liste déroulante Type de runbook, sélectionnez PowerShell.
    3. Sélectionnez Créer.

    Create Runbook

  4. Le runbook est créé et la page Modifier un runbook PowerShell s’ouvre. Edit the Runbook

  5. Copiez l’exemple PowerShell suivant dans la page Modifier. Vérifiez que le VaultName spécifie le nom que vous avez choisi pour votre coffre de clés.

    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. Si vous souhaitez que le runbook s’exécute avec l’identité managée affectée par le système, laissez le code tel quel. Si vous préférez utiliser une identité managée affectée par l’utilisateur, procédez comme suit :

    1. À la ligne 18, supprimez $AzureContext = (Connect-AzAccount -Identity).context,
    2. Remplacez-la par $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context et
    3. Entrez l’ID client que vous avez obtenu précédemment.
  7. Sélectionnez Enregistrer, Publier, puis Oui lorsque vous y êtes invité.

Pour vérifier que le runbook s’exécute correctement, vous pouvez suivre les étapes décrites dans Tester un runbook ou Démarrer un runbook.

Si vous ne voyez pas votre e-mail de test, vérifiez vos dossiers de courrier indésirable et de spam.

Nettoyer les ressources

  1. Quand le runbook n’est plus nécessaire, sélectionnez-le dans la liste de runbooks et sélectionnez Supprimer.

  2. Supprimez le coffre de clés à l’aide de l’applet de commande Remove-AzKeyVault.

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

Étapes suivantes