Amazon web services 使用AWS CloudWatch监控EC2 Windows实例的服务

Amazon web services 使用AWS CloudWatch监控EC2 Windows实例的服务,amazon-web-services,amazon-ec2,monitoring,amazon-cloudwatch,Amazon Web Services,Amazon Ec2,Monitoring,Amazon Cloudwatch,我使用CloudWatch自定义指标监控了性能计数器,如内存、可用磁盘等。我可以使用CloudWatch监控服务吗?我检查了cloud watch监视的功能,但没有发现与监视服务相关的内容。我只需要监视服务是否正在运行,并在服务状态发生变化时发送通知。是的,但您提到的现成解决方案对于服务级别自定义指标来说并不那么容易 CloudWatch自定义指标允许您使用自己定义的指标和数据扩展CloudWatch,因此您可以自己合理地实施它们以监控自己的服务。您的服务可以将度量数据写入CloudWatch本

我使用CloudWatch自定义指标监控了性能计数器,如内存、可用磁盘等。我可以使用CloudWatch监控服务吗?我检查了cloud watch监视的功能,但没有发现与监视服务相关的内容。我只需要监视服务是否正在运行,并在服务状态发生变化时发送通知。

是的,但您提到的现成解决方案对于服务级别自定义指标来说并不那么容易

CloudWatch自定义指标允许您使用自己定义的指标和数据扩展CloudWatch,因此您可以自己合理地实施它们以监控自己的服务。您的服务可以将度量数据写入CloudWatch本身,或者您可以编写另一个流程来监控您的服务,并根据您的服务对CloudWatch的响应写入度量


根据您的编辑,为任意一组windows服务发布CloudWatch自定义度量将需要一些特定于windows的powershell,因为我们不能假设该服务将有一个要ping的web端点

您需要创建一个服务监视器,通过
Get service
评估您的服务,然后将数据点发布到正在运行的CloudWatch自定义度量

下面是PowerShell中的一个示例实现,它将每隔300秒为名称匹配
*YOURSERVICENAMESHERE*
的服务编写自定义度量。如果您想对EC2实例上的每个服务都运行它,您可以用通配符
*
替换它,但这在规模上可能会很昂贵。如果盒子上有太多的服务,它也可能需要一些调整,因为您一次只能通过
Write CwMetricData
发送这么多的度量。请参阅代码注释以了解有关该问题的详细信息

通过仅在成功时创建一个数据点,您可以建立一个“失败”条件(X秒内没有足够的_数据),用于创建满足通知约束的CloudWatch报警

此脚本必须在Windows EC2实例上运行,并已安装和配置:

Param
(
[字符串]$Period=300,
[字符串]$Namespace='服务监视器'
)
#使用EC2元数据服务获取主机EC2实例的ID
$instanceId=(新对象System.Net.WebClient)。下载字符串(“http://169.254.169.254/latest/meta-data/instance-id")
#将当前EC2实例与自定义cloudwatch度量相关联
$instanceDimension=新对象-类型名称Amazon.CloudWatch.Model.Dimension;
$instanceDimension.Name=“instanceid”;
$instanceDimension.Value=$instanceId;
#“工作”循环;写入CloudWatch,然后在上面的period变量定义的时间间隔内休眠,以秒为单位。
while($true)
{
$metrics=@();
$runningServices=Get Service-Name*YOURSERVICENAMESHERE*|?{$\状态-eq'Running'}
#对于每个正在运行的服务,向metrics集合添加一个度量,该度量向名为“Status”的CloudWatch度量添加一个数据点,维度为:instanceid,servicename
$runningServices |%{
$dimensions=@();
$serviceDimension=新对象-类型名称Amazon.CloudWatch.Model.Dimension;
$serviceDimension.Name=“服务”
$serviceDimension.Value=$\uDimension.Name;
$dimensions+=$instanceDimension;
$dimensions+=$serviceDimension;
$metric=新对象-类型名称Amazon.CloudWatch.Model.MetricDatum;
$metric.Timestamp=[DateTime]::UtcNow;
$metric.MetricName='Status';
$metric.Value=1;
$metric.Dimensions=$Dimensions;
$metrics+=$metric;
写入主机“检查状态:$($.Name)”
}
#一次编写此作业运行的所有度量,以节省调用CloudWatch API的成本。
#如果度量集合中有太多的服务,这将失败;如果发生这种情况,只需减少
#监控服务,或将此行编辑到上述foreach循环中,并直接写入每个度量。
写入CWMetricData-命名空间$Namespace-MetricData$metrics
写入主机“休眠$Period秒”
开始睡眠-s$Period
}
将其保存到一个文件中,您可以从命令行运行它来开始编写度量。一旦您对它感到满意,就可以为计划任务或powershell作业放弃“while true”循环

其他资源:

  • -用于发布假设应用程序的自定义指标的教程/演练。这将是一个开始学习如何发布您自己的自定义指标的好地方

我的要求不太复杂。它只需监视服务是否正在运行。这样,它必须监视ec2实例的services列下的所有服务。还有一件事,我想对Windows实例执行此操作。我已经修改了我的问题。请检查它。确保您的实例正在运行最新版本的AWS Tools for PowerShell(以便您拥有所有正确的类定义),并确保您为其提供了适当的凭据,以便它可以写入Cloudwatch。有关凭据,请查看此文档以了解详细信息:@prudhvi Great!听起来你差不多成功了。按照此脚本的设计方式,只应为运行的服务添加数据点,以便行为符合预期。这确实改变了图形——缺少新的数据点本身就是数据。使用CloudWatch警报,您可以通过在CloudWatch中称为“数据不足”的状态下发出警报来封装警报,这将让您知道您的服务是否停止运行,或者服务监视器本身是否停止运行。因此,例如,对于您的服务,您可以为此指标创建一个警报,其中在某个定义的时间间隔内没有可用的数据。