为啥从我的 Windows EC2 实例发送的 CloudWatch Logs 没有显示在 AWS 控制台上?

Posted

技术标签:

【中文标题】为啥从我的 Windows EC2 实例发送的 CloudWatch Logs 没有显示在 AWS 控制台上?【英文标题】:Why are CloudWatch Logs sent from my Windows EC2 Instance not showing up on AWS Console?为什么从我的 Windows EC2 实例发送的 CloudWatch Logs 没有显示在 AWS 控制台上? 【发布时间】:2017-04-01 04:38:08 【问题描述】:

我在 ec2 windows server-R2 上设置了 CloudWatch Logs,但它没有显示在 AWS 控制台上。 (我的 IAM 用户拥有完全访问权限) https://aws.amazon.com/blogs/devops/using-cloudwatch-logs-with-amazon-ec2-running-microsoft-windows-server/

我的 CloudWatch json 文件如下所示:


  "EngineConfiguration": 
    "PollInterval": "00:00:15",
    "Components": [
      
        "Id": "ApplicationEventLog",
        "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "LogName": "Application",
          "Levels": "1"
        
      ,
      
        "Id": "SystemEventLog",
        "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "LogName": "System",
          "Levels": "7"
        
      ,
      
        "Id": "SecurityEventLog",
        "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "LogName": "Security",
          "Levels": "7"
        
      ,
      
        "Id": "ETW",
        "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "LogName": "Microsoft-Windows-WinINet/Analytic",
          "Levels": "7"
        
      ,
      
        "Id": "IISLogs",
        "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
          "TimestampFormat": "yyyy-MM-dd HH:mm:ss",
          "Encoding": "UTF-8",
          "Filter": "",
          "CultureName": "en-US",
          "TimeZoneKind": "UTC",
          "LineCount": "3"
        
      ,
      
        "Id": "CustomLogs",
        "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "LogDirectoryPath": "C:\\CustomLogs\\",
          "TimestampFormat": "MM/dd/yyyy HH:mm:ss",
          "Encoding": "UTF-8",
          "Filter": "",
          "CultureName": "en-US",
          "TimeZoneKind": "Local"
        
      ,
      
        "Id": "PerformanceCounter",
        "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "CategoryName": "Memory",
          "CounterName": "Available MBytes",
          "InstanceName": "",
          "MetricName": "Memory",
          "Unit": "Megabytes",
          "DimensionName": "",
          "DimensionValue": ""
        
      ,
      
        "Id": "CloudWatchLogs",
        "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "AccessKey": "accesskey",
          "SecretKey": "secretkey",
          "Region": "eu-west-1",
          "LogGroup": "Default-Log-Group",
          "LogStream": "instance_id"
        
      ,
      
        "Id": "CloudWatch",
        "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": 
          "AccessKey": "accesskey",
          "SecretKey": "secretkey",
          "Region": "eu-west-1",
          "NameSpace": "Windows/Default"
        
      
    ],
    "Flows": 
      "Flows": [
        "(ApplicationEventLog,SystemEventLog),CloudWatchLogs",
        "PerformanceCounter,CloudWatch"
      ]
    
  

我发现它还需要安装 SSM 才能在 AWS 控制台上显示?!我正在根据此链接进行 SSM 的安装过程: http://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/managed-instances.html#install-managed-win

但是无法下载文件,详情如下:

PS C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell> $dir = $env:TEMP + "\ssm"
> New-Item -ItemType directory -Path $dir
> cd $dir
> $username = admin
> $password = 1234
> $wc = New-Object System.Net.Networkcredential($username, $password)
> $wc.DownloadFile("https://amazon-ssm-region.s3.amazonaws.com/latest/windows_amd64/AmazonSSMAgentSetup.exe", $dir + "\AmazonSSMAgentSetup.exe")



You cannot call a method on a null-valued expression.

At line:1 char:1

+ $wc.DownloadFile("https://amazon-ssm-    region.s3.amazonaws.com/latest/windows_amd64 ...

+ 

  + CategoryInfo  : InvalidOperation: (:) [], RuntimeException

  + FullyQualifiedErrorId : InvokeMethodOnNull

你知道问题是什么吗?

【问题讨论】:

您到底想向 CloudWatch 日志发送什么?只是 Windows 事件日志? 【参考方案1】:

注意:如果您是从搜索引擎来到这里并正在寻求有关 Windows Server 2016 上的 EC2Launch/EC2Config 4.x 的帮助,请参阅此documentation 了解相关更改。本指南在编写时考虑了旧 Windows 服务器上的 EC2Config 3.x Windows 服务,给出的建议可能不会直接与 EC2Launch 并行。

记下您的 EC2Config 版本,并查看以下文档以获取更多特定于版本的建议:

Use EC2Config 3.x or Earlier to Configure CloudWatch Use EC2Config 4.x to Configure CloudWatch

对于从 3.x 迁移到 4.x 的用户:您特别需要:

"IsEnabled":true 添加到您的AWS.EC2.Windows.CloudWatch.json JSON 文件中。 将此文件从C:\Program Files\Amazon\Ec2ConfigService\Settings\ 移动到C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\

你对一个问题提出了很多要求,所以我将分部分回答这个问题:

1) 您所遵循的指南不适用于您的用例

您链接到的documentation 用于在混合环境中设置 SSM 代理,例如在 EC2 实例和本地机器协同工作的环境中。由于您使用的是 EC2 实例而不是本地机器,因此本文档与您无关。这改变了以下假设:

您应该明确下载 EC2Config 而不是 SSM 代理。 (见第 3 步) 您需要将IAM Instance Profile 附加到您的实例,而不是拥有所有相关权限的 IAM 用户。 (见第 4 步)

2) 使用EC2 Run Command验证您的 SSM 代理

根据documentation,您可能已经安装了 SSM 代理:

SSM 代理默认安装在 Windows Server 2016 实例和从 2016 年 11 月或之后发布的 Windows Server 2003-2012 R2 AMI 创建的实例上。

要查看 AWS Web 控制台,请导航至 EC2 > Commands > Command History > Run A Command

在“运行命令”UI 中查找“选择实例”按钮。这将打开正在运行 SSM 代理的正在运行实例的下拉列表。

如果您的实例在此处列出,恭喜!您已经安装了 SSM 代理。跳过第 3 步。

3) 为 CloudWatch Logs 设置 SSM 代理

你应该install the latest version of EC2Config。 SSM 代理与 EC2Config 捆绑在一起,并与它一起安装。您可以以交互方式执行此操作,也可以使用 PowerShell(此示例需要 v5):

iwr https://ec2-downloads-windows.s3.amazonaws.com/EC2Config/EC2Install.zip -UseBasicParsing -OutFile Ec2Config.zip
Expand-Archive Ec2Config.zip
.\Ec2Config\Ec2Install.exe /install

安装后,EC2 Config Service 将重新启动。继续并重新启动实例(如果您是managing your password with EC2Config,如果您没有重新启用该设置,您可能无法在重新启动后从控制台检索它 - 将其复制到某处以防万一!),然后再次执行第 2 步以验证您的实例是否可用于 EC2 Run Command。新增福利:从现在开始,您将能够从 EC2 Run Command 更新 EC2Config 和 SSM 代理。

4) 验证您的 IAM 实例配置文件的 IAM 角色是否具有足够的权限

AWS 文档涵盖了这个here,所以我不会重读它。

如果当前没有实例配置文件附加到您的 EC2 实例,您应该create an AMI 并启动一个新实例,其所有配置都与您当前的实例相同,但它使用您创建的新 AMI 并使用 IAM 角色具有足够的权限。

5) 您无需在 CloudWatch 配置中明确指定您的 AWS 凭证

AccessKey 和 SecretKey 应留空,因为凭证将从您的 IAM 实例配置文件继承:


    "Id": "CloudWatchLogs",
    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
    "Parameters": 
        "AccessKey": "",
        "SecretKey": "",
        "Region": "eu-west-1",
        "LogGroup": "MyLogGroup",
        "LogStream": "instance_id"
    
,

    "Id": "CloudWatch",
    "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
    "Parameters": 
    
        "AccessKey": "",
        "SecretKey": "",
        "Region": "eu-west-1",
        "NameSpace": "MyMetricsNameSpace"
    

对配置文件进行任何更改后,重新启动 EC2Config(或您的实例本身,如果这在您的工作流程中更容易的话)并且应该应用更改。

6) 故障排除

可以在您的实例上找到与将本地日志发送到 CW 相关的日志:C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt。这对我第一次配置时非常宝贵。

documentation 也有常见问题的指导。


除此之外,我觉得一切都很好。或许可以分小块处理问题——首先处理设置 Windows 事件日志,然后是指标,然后是自定义日志。

【讨论】:

完美指导 :) 非常感谢。【参考方案2】:

我在 Cloudwatch 指标方面遇到了很多问题,但我终于解决了其中的大部分问题。

为了接收指标,您需要在文件顶部添加"IsEnabled":true,如下所示:


    "IsEnabled": true
    "EngineConfiguration": 
        "PollInterval": "00:00:15",
        "Components": [

您还必须将 EC2Config 从 here 更新到最新版本

【讨论】:

以上是关于为啥从我的 Windows EC2 实例发送的 CloudWatch Logs 没有显示在 AWS 控制台上?的主要内容,如果未能解决你的问题,请参考以下文章

远程桌面连接到 ec2 实例

如何从我的 EBS 支持的 EC2 实例创建 AMI?

如何从我的 EC2 实例调用 AWS Lambda 函数?

如何从我的 Amazon EC2 实例中连接到 Amazon Redshift 集群

为啥我的 ECS 服务无法向我的 ELB 注册可用的 EC2 实例?

使用 Terraform 时从实例获取 EC2 Windows 密码