你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
从自动化 Runbook 发送电子邮件
可以使用 PowerShell 通过 SendGrid 从 runbook 发送电子邮件。
如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
先决条件
SendGrid 发送方验证。 域或单个发送方
你的 SendGrid API 密钥。
至少具有一个用户分配的托管标识的 Azure 自动化帐户。 有关详细信息,请参阅启用托管标识。
导入到自动化帐户中的 Az 模块:
Az.Accounts
和Az.KeyVault
。 有关详细信息,请参阅导入 Az 模块。在计算机上安装 Azure Az PowerShell 模块。 若要安装或升级,请参阅如何安装 Azure Az PowerShell 模块。
创建 Azure Key Vault
创建一个 Azure 密钥保管库和密钥保管库访问策略,该策略允许凭据获取和设置指定密钥保管库中的密钥保管库机密。
使用 Connect-AzAccount cmdlet 以交互方式登录到 Azure,并按照说明进行操作。
# 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>
为以下变量提供适当的值,然后执行脚本。
$resourceGroup = "<Resource group>" $automationAccount = "<Automation account>" $region = "<Region>" $SendGridAPIKey = "<SendGrid API key>" $VaultName = "<A universally unique vault name>" $userAssignedManagedIdentity = "<User-assigned managed identity>"
创建密钥保管库并分配权限
# 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
若要通过其他方式创建 Azure 密钥保管库并存储机密,请参阅密钥保管库快速入门。
向托管标识分配权限
向适当的托管标识分配权限。 Runbook 可使用自动化帐户的系统分配的托管标识或用户分配的托管标识。 已提供为每个标识分配权限的步骤。 以下步骤使用 PowerShell。 如果你偏向于使用门户,请参阅使用 Azure 门户分配 Azure 角色。
使用 PowerShell cmdlet New-AzRoleAssignment 将角色分配给系统分配的托管标识。
New-AzRoleAssignment ` -ObjectId $SA_PrincipalId ` -ResourceGroupName $resourceGroup ` -RoleDefinitionName "Reader"
为用户分配的托管标识分配角色。
New-AzRoleAssignment ` -ObjectId $UAMI.PrincipalId` -ResourceGroupName $resourceGroup ` -RoleDefinitionName "Reader"
对于系统分配的托管标识,请显示
ClientId
并记录值供稍后使用。$UAMI.ClientId
创建用于发送电子邮件的 runbook
在创建密钥保管库并存储 SendGrid
API 密钥后,接下来可以创建 Runbook 来检索 API 密钥和发送电子邮件。 让我们使用一个 Runbook,该 Runbook 使用系统分配的托管标识向 Azure 进行身份验证,以便从 Azure 密钥保管库检索机密。 我们将该 runbook 命名为 Send-GridMailMessage。 可以修改用于不同方案的 PowerShell 脚本。
登录到 Azure 门户,并导航到自动化帐户。
在打开的自动化帐户页面中,选择“流程自动化”下的“Runbook”
选择“+ 创建 Runbook”。
- 将 runbook 命名为
Send-GridMailMessage
。 - 从“Runbook 类型”下拉列表中,选择“PowerShell” 。
- 选择创建。
- 将 runbook 命名为
此时会创建 Runbook 并打开“编辑 PowerShell Runbook”页。
将以下 PowerShell 示例复制到“编辑”页中。 确保
VaultName
指定你为密钥保管库选择的名称。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
如果希望 Runbook 使用系统分配的托管标识执行,请按原样保留代码。 如果希望使用用户分配的托管标识,则执行以下操作:
- 从第 18 行中删除
$AzureContext = (Connect-AzAccount -Identity).context
, - 将其替换为
$AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context
,然后 - 输入之前获取的客户端 ID。
- 从第 18 行中删除
选择“保存”、“发布”,并在出现系统提示时选择“是” 。
若要验证 runbook 是否成功执行,可以按测试 runbook 或启动 runbook 下的步骤操作。
如果一开始看不到测试电子邮件,请检查 Junk 和 Spam 文件夹。
清理资源
如果不再需要该 Runbook,请在 Runbook 列表中选择它,然后选择“删除”。
使用 Remove-AzKeyVault cmdlet 删除密钥保管库。
$VaultName = "<your KeyVault name>" $resourceGroup = "<your ResourceGroup name>" Remove-AzKeyVault -VaultName $VaultName -ResourceGroupName $resourceGroup
后续步骤
- 若要将 runbook 作业数据发送到 Log Analytics 工作区,请参阅将 Azure 自动化作业数据转发到 Azure Monitor 日志。
- 若要监视基本级别的指标和日志,请参阅使用警报触发 Azure 自动化 runbook。