刚刚开始使用一个新的ELK设置(以前从未使用过,只是试图学习它)。 我已经在Ubuntu 14.04 LTS上运行Logstash 2.2.4。
在使用我的监视器用户的AWS凭据(通过复制/粘贴按照文档configuration策略)放置yaml文件后,我在/etc/logstash/conf.d中创build了以下.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"] } }
我有三个服务器在我们东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": "*" } ] }
在检查我实际上是否已经将策略分配给了用户,我注意到在debugging的某个时候,我还分配了“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": "*" } ] }
这实际上是我第一次使用预定义策略以外的东西,所以我想也许我错过了写作中的一些东西。
他们在文档中没有告诉你的是,为了使用filter,你需要设置更多的权限。 代码在您的帐户上执行describe-instances调用,使用filters获取实例ID的列表,然后运行cloudwatch API调用。
文档中列出的IAM策略仅涵盖cloudwatch API调用。 如果你完全没有在你的configurationfilter, 你会得到的数据 。
但是,您要过滤标签。 为此,您至less需要:
ec2:DescribeInstances ec2:DescribeTags
在允许声明中能够获取你需要的数据。
为了解决这个问题,我会validationAWS证书是否应该排除这个问题。 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调用为具有Monitoring标签的实例获取InstanceId值。
如果这个工作,并且取得实例也是如此,那么这个插件就是一个问题。 validation凭证文件实际上是由logstash进程可读的。 您可以绕过通过尝试获取特定实例来search标签的需求。 代码中有一个例子来说明如何指定。
filters => { 'instance-id' => 'i-1234abcd' }