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
Comprobación del remitente de SendGrid. Dominio o remitente único
Una cuenta de Azure Automation con al menos una identidad administrada asignada por el usuario. Para más información, consulte Habilitación de identidades administradas.
Módulos de az:
Az.Accounts
yAz.KeyVault
se han importado en la cuenta de Automation. Para más información, consulte Importación de módulos Az.El módulo Azure Az de PowerShell instalado en la máquina. Para instalar o actualizar, vea Instalación del módulo Azure Az de PowerShell.
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.
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>
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>"
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.
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"
Asigne un rol a una identidad administrada asignada por el usuario.
New-AzRoleAssignment ` -ObjectId $UAMI.PrincipalId` -ResourceGroupName $resourceGroup ` -RoleDefinitionName "Reader"
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.
Inicie sesión en Azure Portal y vaya a su cuenta de Automation.
En la página de la cuenta de Automation abierta, en Automatización de procesos, seleccione Runbooks.
Seleccione + Crear un runbook.
- Asigne al runbook el nombre
Send-GridMailMessage
. - En la lista desplegable Tipo de Runbook, seleccione PowerShell.
- Seleccione Crear.
- Asigne al runbook el nombre
Se crea el runbook y se abre la página Editar Runbook de PowerShell.
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
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:
- En la línea 18, elimine
$AzureContext = (Connect-AzAccount -Identity).context
. - Reemplace el valor por
$AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context
. - Escriba el identificador de cliente que obtuvo anteriormente.
- En la línea 18, elimine
Seleccione Guardar, luego Publicar y, finalmente, Sí 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
Cuando ya no sea necesario el runbook, selecciónelo en la lista de runbooks y seleccione Eliminar.
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
- Para enviar datos de trabajo de runbook al área de trabajo de Log Analytics, consulte Reenvío de datos de un trabajo de Azure Automation a registros de Azure Monitor.
- Para supervisar los registros y las métricas de nivel básico, consulte Uso de una alerta para desencadenar un runbook de Azure Automation.