Problema ao trazer dados do CloudWatch para o Logstash

2

Começando com uma nova configuração do ELK (nunca usei antes, apenas tentando aprender). Eu tenho o Logstash 2.2.4 rodando no Ubuntu 14.04 LTS.

Depois de colocar um arquivo yaml com as credenciais da AWS do meu monitor (política configurada de acordo com a documentação via copy / paste), criei o seguinte arquivo .conf em /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"]
  }
}

Eu tenho três servidores em us-east-1 com a tag "Monitoring" definida como "Yes", mas quando ligo meus logs do logstash, ocorre a falha de não haver métricas para consultar. Uma entrada de erro de exemplo (formatada para legibilidade):

{
  :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}

EDITAR

Com base no comentário, atualizei minha política para o usuário do serviço cujas credenciais estão no arquivo .yaml mencionado acima. Isso não alterou o comportamento. Veja como minha política se parece atualmente:

{
    "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": "*"
        }
    ]
}

Ao verificar que eu realmente atribuí a política ao usuário corretamente, notei que em algum momento da depuração eu também designei a política 'CloudWatchReadOnlyAccess', que se parece com isso (no caso de quebra alguma coisa):

{
  "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": "*"
    }
  ]
}

Esta é, na verdade, minha primeira vez usando algo diferente das políticas pré-definidas, então estou pensando que talvez tenha perdido alguma coisa na redação dela.

    
por Paul 31.10.2016 / 18:43

1 resposta

2

O que eles não dizem na documentação é que você precisa ter mais alguns direitos para usar filtros. O código realiza uma chamada de descrever as instâncias na sua conta, usando o filters para obter uma lista de IDs de instâncias, as quais então executam as chamadas da API do cloudwatch.

A política do IAM listada na documentação abrange apenas as chamadas da API do cloudwatch. Se você parou de filtrar completamente na sua configuração, você obteria dados .

No entanto, você deseja filtrar tags. Para isso, você precisará de pelo menos:

ec2:DescribeInstances
ec2:DescribeTags

Em uma declaração de permissão, consiga obter os dados de que você precisa.

Para resolver isso, eu verificaria se as credenciais da AWS fazem o que devem para descartá-las. O equivalente da AWS CLI do que eles estão fazendo é:

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

Se isso falhar, então este é o seu problema. Você pode precisar de ec2:DescribeNetworkInterfaces também, mas não tenho certeza disso.

Se isso for bem-sucedido, o problema não está nos seus direitos do EC2, mas em algo mais. Você pode replicar a chamada que o plug-in está fazendo para cloudwatch dessa maneira:

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

O plug-in está usando a chamada describe-instances para buscar os valores InstanceId para instâncias com a tag de monitoramento.

Se isso funcionar, assim como a busca de instâncias, então é um problema com o plugin de alguma forma. Verifique se o arquivo de credenciais está realmente legível pelo processo logstash. Você pode ignorar a necessidade de pesquisar tags tentando obter uma instância específica. Há um exemplo no código para saber como especificar isso.

filters => { 'instance-id' => 'i-1234abcd' }
    
por 01.11.2016 / 03:29

Tags