Envío de un correo electrónico desde un runbook de Azure Automation

Puede enviar un correo electrónico desde un runbook con SendGrid mediante PowerShell.

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Requisitos previos

Crear una instancia de Azure Key Vault

Cree una instancia de Azure Key Vault y una directiva de acceso de Key Vault que permita a la credencial obtener y establecer los secretos del almacén de claves especificado.

  1. Inicie sesión en Azure de forma interactiva con el cmdlet Connect-AzAccount y siga las instrucciones.

    # 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. Proporcione un valor adecuado para las variables siguientes y, a continuación, ejecute el 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. Creación del almacén de claves y asignación de permisos

    # 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
    

    Para ver otras formas de crear un almacén de Azure Key Vault y almacenar un secreto, consulte los inicios rápidos de Key Vault.

Asignación de permisos a las identidades administradas

Asigne permisos a la identidad administrada adecuada. El runbook puede usar la identidad administrada asignada por el sistema de la cuenta de Automation o una identidad administrada asignada por el usuario. Se proporcionan los pasos necesarios para asignar permisos a cada identidad. En los pasos siguientes se usa PowerShell. Si prefiere utilizar Azure Portal, consulte Asignación de roles de Azure mediante Azure Portal.

  1. Use el cmdlet de PowerShell New-AzRoleAssignment para asignar un rol a la identidad administrada asignada por el sistema.

    New-AzRoleAssignment `
        -ObjectId $SA_PrincipalId `
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  2. Asigne un rol a una identidad administrada asignada por el usuario.

    New-AzRoleAssignment `
        -ObjectId $UAMI.PrincipalId`
        -ResourceGroupName $resourceGroup `
        -RoleDefinitionName "Reader"
    
  3. Para la identidad administrada asignada por el sistema, muestre ClientId y registre el valor para su uso posterior.

    $UAMI.ClientId
    

Creación del runbook para enviar un correo electrónico

Después de crear un almacén de claves y de almacenar la clave de API de SendGrid, es el momento de crear el runbook que recupere la clave de API y envíe un correo electrónico. Vamos a usar un runbook que utiliza la identidad administrada asignada por el sistema para autenticarse en Azure con el fin de recuperar el secreto de Azure Key Vault. Llamaremos al runbook Send-GridMailMessage. Puede modificar el script de PowerShell utilizado para distintos escenarios.

  1. Inicie sesión en Azure Portal y vaya a su cuenta de Automation.

  2. En la página de la cuenta de Automation abierta, en Automatización de procesos, seleccione Runbooks.

  3. Seleccione + Crear un runbook.

    1. Asigne al runbook el nombre Send-GridMailMessage.
    2. En la lista desplegable Tipo de Runbook, seleccione PowerShell.
    3. Seleccione Crear.

    Create Runbook

  4. Se crea el runbook y se abre la página Editar Runbook de PowerShell. Edit the Runbook

  5. Copie el siguiente ejemplo de PowerShell en la página Editar. Asegúrese de que VaultName especifique el nombre que haya elegido para la instancia de 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. Si desea que el runbook se ejecute con la identidad administrada asignada por el sistema, deje el código tal y como está. Si prefiere usar una identidad administrada asignada por el usuario, haga lo siguiente:

    1. En la línea 18, elimine $AzureContext = (Connect-AzAccount -Identity).context.
    2. Reemplace el valor por $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context.
    3. Escriba el identificador de cliente que obtuvo anteriormente.
  7. Seleccione Guardar, luego Publicar y, finalmente, cuando se le pida confirmación.

Para comprobar que el runbook se ejecuta correctamente, puede seguir los pasos descritos en Prueba de un runbook o de Inicio de un runbook.

Si no ve inicialmente el correo electrónico de prueba, compruebe las carpetas de correo no deseado y de spam.

Limpieza de recursos

  1. Cuando ya no sea necesario el runbook, selecciónelo en la lista de runbooks y seleccione Eliminar.

  2. Elimine el almacén de claves mediante el cmdlet Remove-AzKeyVault.

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

Pasos siguientes