刚刚开始使用新的 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' }