Назад | Перейти на главную страницу

Проблемы с переносом данных CloudWatch в Logstash

Только начинаю работать с новой установкой ELK (никогда раньше не использовал, просто пытаюсь изучить). У меня Logstash 2.2.4 работает на ubuntu 14.04 LTS.

После размещения файла yaml с учетными данными пользователя AWS моего монитора (политика, настроенная в соответствии с документацией посредством копирования / вставки), я создал следующий файл .conf в /etc/logstash/conf.d:

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 с тегом «Monitoring», установленным на «Yes», ​​но когда я просматриваю свои журналы 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": "*"
    }
  ]
}

На самом деле это мой первый раз, когда я использую что-то отличное от заранее определенных политик, поэтому я думаю, что, возможно, я что-то пропустил при написании этого.

В документации не говорится, что вам нужно установить еще несколько прав для использования фильтров. Код выполняет описать экземпляры позвоните в свой аккаунт, используя filters чтобы получить список идентификаторов экземпляров, который затем запускает API-интерфейс cloudwatch.

Политика IAM, указанная в документации, распространяется только на вызовы API Cloudwatch. Если вы полностью отключили фильтры в своей конфигурации, ты бы получил данные.

Однако вы хотите фильтровать по тегам. Для этого вам понадобится как минимум:

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 значения для экземпляров с тегом Monitoring.

Если это работает, как и выборка экземпляра, значит, проблема связана с плагином. Убедитесь, что файл учетных данных действительно доступен для чтения процессом logstash. Вы можете обойтись без поиска тегов, попытавшись получить определенный экземпляр. В коде есть пример как это указать.

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