65.9K
CodeProject 正在变化。 阅读更多。
Home

为您的 Windows Azure 项目添加 SMS 通知

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2012年4月30日

CPOL

7分钟阅读

viewsIcon

58908

downloadIcon

352937

了解如何配置短信警报,使其根据您的 Windows Azure 应用程序部署状态触发。

引言

在这篇简短的帖子中,我们将看到使用服务管理 API (SM-API)、Windows PowerShell(以及 Cerebrata 的 Azure 管理 Cmdlet)和流行的短信和语音消息服务 Twilio,为您的 Windows Azure 项目添加基本短信通知是多么容易。如果一切按计划进行,您应该在大约 15 分钟内收到短信通知。 

场景 

在此示例中,当托管服务发生故障时,我们将发送短信通知。这对于负责在下班后监控和管理组织应用程序的 DevOp 或管理员可能很有用。 

我们将使用 PowerShell——我们假设大多数进行此类工作的人都在使用 PowerShell——但是您可以轻松地通过您选择的语言中的原始 HTTPS 请求调用 SM-API REST 调用。事实上,如果您想配置复杂的规则和警报,例如当特定事件触发或达到某个性能计数器阈值时,您几乎肯定会采用后一种方法。

必备组件 

Twilio 

为了加快进度,我们假设您有一个 Twilio 帐户。Twilio 是一个网络服务 API,可让您使用其基础设施快速构建语音和短信应用程序;我们使用它来发送短信。您可以在此处注册他们的免费帐户。 

有许多轻量级包装器可用(C#、Java、PHP),可让您快速使用他们的 REST API。在下面的示例中,我们使用twilio-csharp包装器向您展示如何在 C# 中轻松发送短信。  

public void SendSmsMessage(){
    const string accountSid = "ACaaa6f2a6caed4959ba559596xxxxxxxx";
    const string authToken = "a2bc2575c75d44db27a0f8c1xxxxxxxx";
    const string sender = "+4475xxxxxxxx";
    const string recipient = "+4475xxxxxxxx"; 
    const string message = " Twilio is awesome!"; 

    TwilioRestClient twilioClient = new TwilioRestClient(accountSid, authToken);
    twilioClient.SendSmsMessage(sender, recipient, message); 
}    

这个简单的示例在 PowerShell 中转换为以下内容 

Add-Type -Path "D:\Twillo-DLL\Twilio.Api.dll"

$twilio = new-object Twilio.TwilioRestClient($accountSid, $authToken)

$msg = $twilio.SendSmsMessage($sender, $recipient , $message)

PowerShell 和 Cerebrata Azure 管理 Cmdlet  

在 PowerShell 方面,我们将使用CerebrataAzure 管理 Cmdlet——一套 PowerShell Cmdlet,封装了 Microsoft SM-API 的大部分功能,包括用于管理您的 Windows Azure 托管服务、Windows Azure 存储(Blob、表和队列)和 SQL Azure 实例的 Cmdlet。Cerebrata Azure 管理 Cmdlet 在持续集成场景中特别有用,当您尝试简化和自动化部署任务时。下面的屏幕截图列出了一些它们的 Cmdlet,让您了解它们的功能。 

Windows Azure 服务管理 API 101 

好的,在我们深入连接不同部件之前,我想快速提一下服务管理 API。对于那些不知道的人,Microsoft 提供了一个 RESTful API 到 Windows Azure,它允许您自动化许多原本必须通过门户手动完成的任务。它支持整个 Azure 服务生命周期:部署、配置、暂存、暂停和删除。管理服务可以通过在 Windows Azure 中运行的服务访问,也可以通过 Internet 从任何可以发送 HTTPS 请求和接收 HTTPS 响应的应用程序直接访问。显然,对 API 的全面审查超出了本文的范围(有关详细解释,请参阅Windows Azure 文档),但为了让您了解可能实现的功能,让我们看一个基本示例。

通过 SM-API 可用的所有操作都使用您的 Windows Azure 订阅 ID 访问。事实上,您的 ID 构成了您对 SM-API 进行的每个调用的 URI 的一部分。

https://management.core.windows.net/<subscriptionId>

请注意,对 SM-API 的所有操作都通过 SSL 进行,因此必须使用 HTTPS 协议。 

如果我们将存储帐户功能作为一个示例,我们可以通过以下 URI 访问可用服务

https://management.core.windows.net/<subscriptionId>/services/storageservices 

从这里,我们可以“列出存储帐户”、“获取存储帐户属性”、“获取存储帐户密钥”和“重新生成存储帐户密钥”。您还可以使用 SM-API 创建、删除和更新存储帐户。

如果我们查看“列出存储帐户”操作,该操作用于获取用于对存储帐户执行其他操作的 URI,我们向以下 URI 发送 GET 请求

https://management.core.windows.net/<subscription-id>/services/storageservices 

如果一切顺利,请求将返回状态码为 200 (OK)、响应头和结构如下的响应体

<?xml version="1.0" encoding="utf-8"?>
  <StorageServices xmlns="http://schemas.microsoft.com/windowsazure">
    <StorageService>
      <Url>storage-account-request-uri</Url>    
      <ServiceName>storage-account-name</ServiceName>  
    </StorageService>  
  </StorageServices> 

这里的Url是用于对存储帐户执行“获取存储帐户属性”请求的 SM-API 请求 URI,而ServiceName是存储帐户的名称。具体来说,该名称是 DNS 前缀名称,可用于访问存储帐户中的 Blob、队列和表。

如前所述,SM-API 允许您自动化和简化 Windows Azure 部署的大部分内容,包括对存储帐户、托管服务、证书、亲和组、位置和流量管理器的操作。要获取可执行操作的完整列表,请查看Microsoft 的 SM-API 文档

使用服务管理 API 

为了通过 SM-API 执行任何有用的操作,您需要构建和发出 SM-API 请求并处理响应。这可以用您选择的语言完成,但涉及一定量的开销,这并不是特别有趣。我们已经包含了一个 C# 项目,展示了如何构建和发出 SM-API 请求以及如何处理生成的响应。该项目调用了上面描述的相同操作,即“列出存储帐户”,它返回在对存储帐户执行操作时使用的 URI。 

在大多数持续集成场景中,您只是想根据您的特定工作流程发出命令并执行操作。因此,有许多 PowerShell Cmdlet 封装了 SM-API,让您可以通过命令行使用它。这使得脚本命令变得非常简单,并且对于管理和简化 Windows Azure 部署的人来说应该很熟悉。

PowerShell 和服务管理 API  

Microsoft 的 Windows Azure PowerShell Cmdlet 提供了 SM-API 的基本包装,包括用于管理您的订阅、Windows Azure 诊断、SQL Azure、服务总线和流量管理器的 Cmdlet。

Cerebrata Azure 管理 Cmdlet 提供了用于管理您的订阅、Windows Azure 诊断、SQL Azure、流量管理器和 Windows Azure 存储的 PowerShell Cmdlet。管理存储(Blob、表和队列)的能力是两种产品之间最大的区别之一。与存储相关的 Cmdlet 允许您备份和恢复存储帐户数据。它还包括可以将文件从本地计算机传输到 Windows Azure 的 Cmdlet。 

使用代码 

最终的 PowerShell 脚本,用于检查 Windows Azure 部署的状态并相应地发送短信警报,出人意料地简单。该脚本基本分为五个部分。 

  1. 我们提供 Windows Azure 订阅 ID 和有效证书。
     
  2. 我们指定要查询的托管服务名称和环境槽位。
     
  3. 我们指定 Twilio 帐户详细信息,以便我们可以通过其 REST API 发送消息。
     
  4. 我们每分钟使用 Cerebrata 的管理 Cmdlet 检查部署状态。您几乎肯定会希望更改这里的处理逻辑;脚本会每分钟发送一次通知。
     
  5. 当我们的部署状态不是“正在运行”时,我们会发送短信通知。  
# Subscription ID
$SubID = "a83f48c8-e343-4b8b-9263-XXXXXXXXXXXX"

$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate
$Cert = Get-ChildItem -path cert:\CurrentUser\My\728BAD496C1F5CE767D9D005990DC2CF01A59C0C

# Hosted service name and environment slot
$ServiceName = 'lukejefferson'
$Slot = 'Production'

# Twilio
$sid = "ACaaa6f2a6caed4959baXXXXXXXXXXXXXX"
$token = "a2bc2575c75d44db27XXXXXXXXXXXXXX"
$from = "+4420718XXXXX" 
$to = "+4479213XXXXX"

Add-Type -Path "C:\Temp\Twilio.Api.dll"
$twilio = new-object Twilio.TwilioRestClient($sid, $token)

$SleepTime = 60

$error.clear()

while($true)
{
    $status = New-Object Cerebrata.AzureUtilities.ManagementClient.ServiceManagementEntities.DeploymentStatus
    $deploymentProperty = Get-Deployment -Slot $Slot  -ServiceName $ServiceName -SubscriptionId $SubID -Certificate $Cert 
    $status = $deploymentProperty.DeploymentStatus
    if($status -ne "Running")
    {  
        $messageBody = "ServiceName: " + $ServiceName + "`n" + "Slot: " + $Slot + "`n" + "Status: " + $status
        $msg = $twilio.SendSmsMessage($from, $to , $messageBody)
    }
    Sleep $SleepTime
}  

注意:一些变量的值已被遮盖。请记住,您需要用自己的值替换它们。

如果一切顺利,当服务脱离运行状态时,您应该会收到一条短信通知,如下所示。 

总结  

这篇帖子展示了如何使用 Windows Azure 服务管理 API、PowerShell(以及 Cerebrata Azure 管理 Cmdlet)和流行的短信及语音消息服务 Twilio,快速添加基本警报功能。希望它能让您了解可能的功能,并让您思考如何在应用程序中添加通知以及在何处添加通知。下一步可能是通过检查 Windows Azure 诊断数据,配置警报,使其在满足事件日志数据规则或性能计数器阈值时触发。 

历史 

如有任何修改、建议或问题,请发送电子邮件至 ljefferson@cerebrata.com。 

2012 年 4 月 30 日 - 提交第一版。 

© . All rights reserved.