无法将 CloudWatch 数据导入 Logstash

无法将 CloudWatch 数据导入 Logstash

刚刚开始使用新的 ELK 设置(以前从未使用过,只是想学习它)。我在 ubuntu 14.04 LTS 上运行 Logstash 2.2.4。

在将包含我的监控用户的 AWS 凭证的 yaml 文件(根据文档通过复制/粘贴配置的策略)放下后,我在 /etc/logstash/conf.d 中创建了以下 .conf 文件:

input {
  cloudwatch {
   metrics => ["CPUUtilization"]
   filters => { "tag:Monitoring" => "Yes" }
   region => "us-east-1"
   namespace => "AWS/EC2"
   aws_credentials_file => "/var/opt/aws.yaml"
  }
}
output {
  elasticsearch {
    hosts => ["localhost:9200"]
  }
}

我在 us-east-1 有三台服务器,标签“监控”设置为“是”,但当我跟踪 logstash 日志时,它出错了,提示没有要查询的指标。错误条目示例(已格式化,便于阅读):

{
  :timestamp=>"2016-10-31T13:38:06.314000-0400", 
  :message=>"A plugin had an unrecoverable error. Will restart this plugin.\n  
  Plugin: <LogStash::Inputs::CloudWatch 
              metrics=>[\"CPUUtilization\"], 
              filters=>{\"tag:Monitoring\"=>\"Yes\"}, 
              region=>\"us-east-1\", 
              namespace=>\"AWS/EC2\",  
              aws_credentials_file=>\"/var/opt/aws.yaml\", 
              codec=><LogStash::Codecs::Plain charset=>\"UTF-8\">, 
                     use_ssl=>true, 
                     statistics=>[\"SampleCount\", \"Average\", \"Minimum\", \"Maximum\", \"Sum\"], 
                     interval=>900, 
                     period=>300, 
                     combined=>false>\n  Error: No metrics to query", :level=>:error}

编辑

根据评论,我更新了服务用户的策略,该用户的凭证位于上述 .yaml 文件中。这并没有改变行为,这是我的策略目前的样子:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1444715676000",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Stmt1444716576170",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags"
            ],
            "Resource": "*"
        }
    ]
}

在检查我是否正确地将策略分配给用户时,我注意到在调试的某个时候我分配了“CloudWatchReadOnlyAccess”策略,它看起来像这样(以防万一出现某些问题):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "autoscaling:Describe*",
        "cloudwatch:Describe*",
        "cloudwatch:Get*",
        "cloudwatch:List*",
        "logs:Get*",
        "logs:Describe*",
        "logs:TestMetricFilter",
        "sns:Get*",
        "sns:List*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

这实际上是我第一次使用预定义策略之外的东西,所以我想也许我在写作过程中遗漏了一些东西。

答案1

文档中没有告诉你的是,你需要设置更多的权限才能使用过滤器。代码执行描述实例调用您的帐户,使用它filters来获取实例 ID 列表,然后在其上运行 cloudwatch API 调用。

文档中列出的 IAM 策略仅涵盖 CloudWatch API 调用。如果您在配置中完全不使用过滤器,你会得到数据

但是,您需要按标签进行过滤。为此,您至少需要:

ec2:DescribeInstances
ec2:DescribeTags

在允许语句中能够获取所需的数据。

为了解决此问题,我将验证 AWS 凭证是否按其应有的方式排除此问题。AWS CLI 中与他们所做操作相同的操作是:

aws ec2 describe-instances --filters "Name=tag:Monitoring,Value=Yes"

如果失败了,那么这就是你的问题。你可能ec2:DescribeNetworkInterfaces也需要,但我不确定。

如果成功,则问题不在于您的 EC2 权限,而在于其他方面。您可以通过以下方式复制插件对 cloudwatch 的调用:

aws cloudwatch list-metrics --namespace AWS/EC2 --dimensions "Name=InstanceId,Value=i-1234abcd" --metric-name CPUUtilization

该插件正在使用describe-instances调用来获取InstanceId带有监控标签的实例的值。

如果此方法有效,并且实例获取也有效,那么这可能是插件出了问题。验证凭证文件是否真的可以被 logstash 进程读取。您可以通过尝试获取特定实例来绕过搜索标签的需要。代码中有一个例子关于如何指定这一点。

filters => { 'instance-id' => 'i-1234abcd' }

相关内容