web-dev-qa-db-ja.com

CloudWatchデータをLogstashに取り込む際の問題

新しいELKセットアップを始めたばかりです(これまで使用したことがなく、学習しようとしているだけです)。私はLogstash2.2.4をubuntu14.04LTSで実行しています。

モニターユーザーの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に3つのサーバーがあり、タグ「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": "*"
    }
  ]
}

実は、事前に定義されたポリシー以外のものを使うのは初めてなので、それを書いているときに何かを見逃したのではないかと思います。

2
Paul

ドキュメントで説明されていないのは、フィルターを使用するには、さらにいくつかの権限を設定する必要があるということです。このコードは、アカウントで describe-instances 呼び出しを実行し、filtersを使用してインスタンスIDのリストを取得し、それからcloudwatchAPI呼び出しを実行します。

ドキュメントに記載されているIAMポリシーは、cloudwatchAPI呼び出しのみを対象としています。設定でフィルタを完全に省略した場合、 データを取得します

ただし、タグでフィルタリングする必要があります。そのためには、少なくとも次のものが必要です。

ec2:DescribeInstances
ec2:DescribeTags

Allowステートメントで、必要なデータを取得できるようにします。

これをトラブルシューティングするために、AWS認証情報がそれを除外するために必要なことを実行することを確認します。彼らが行っていることに相当するAWSCLIは次のとおりです。

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

それが失敗した場合、これはあなたの問題です。 ec2:DescribeNetworkInterfacesも必要かもしれませんが、私にはわかりません。

それが成功した場合、問題はEC2の権利ではなく、他の何かにあります。プラグインがクラウドウォッチに対して行っている呼び出しを次のように複製できます。

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

プラグインはdescribe-instances呼び出しを使用して、Monitoringタグを持つインスタンスのInstanceId値をフェッチしています。

これが機能し、インスタンスフェッチも機能する場合は、プラグインに何らかの問題があります。資格情報ファイルがlogstashプロセスによって実際に読み取り可能であることを確認します。特定のインスタンスをフェッチしようとすると、タグを検索する必要がなくなります。 コードに例があります これを指定する方法について。

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