share facebook facebook2 twitter menu hatena pocket slack

2016.02.02 TUE

(ショロカレ 7 日目)2015 年のうちにやっておきたい Amazon Elasticsearch Service 入門(3)~CloudWatch Logs との連携~

川原 洋平

WRITTEN BY川原 洋平

これは「初老丸の独り Advent calendar 2015」の七日目の記事です。

tl;dr

引き続き、Amazon ES を使う。

CloudWatch Logs との連携を試してみる。

CloudWatch Logs との連携

連携の概要

  • CloudWatch Logs のログを直接というわけにはいかない
  • Subscription Filter を指定する
  • Lambda を介して Amazon ES に転送される

ざっくり手順

ざっくりとした手順は以下の通り。

  1. CloudWatch Logs の Log Group の作成
  2. Log Group に Log Stream を作成
  3. Log Stream にログが入ってくる…
  4. Log Group を選択して [Start Streaming to Amazon Elasticsearch Service] を選択
  5. Amazon ES のドメインを選択、Lambda Function 用の IAM role を作成(既存の role を選択するか新規作成する)
  6. Log Format を選択(今回は JSON を選ぶ)
  7. 確認して Start Streaming
  8. Amazon ES にインデックスが作成されていることを確認する

CloudWatch Logs にログを突っ込むまで

今回は fluentd を利用して Apache のアクセスログを CloudWatch Logs に放り込むことにする。

$ fluent-gem install fluent-plugin-cloudwatch-logs --no-ri --no-rdoc -V
$ cat fluentd.conf
<source>
  type tail
  path /tmp/log/apache2/access.log
  format apache2
  pos_file /tmp/apache.access.log.pos
  tag apache.access
</source>

<match apache.access>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type cloudwatch_logs
    log_group_name apache-log
    log_stream_name apache-access-log
    auto_create_stream true
  </store>
</match>
$ export AWS_REGION="ap-northeast-1"
$ export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
$ export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_ACCESS_KEY"
$ fluentd -c fluentd.conf -l debug.log &

しばらくすると apache-access-log-demo にログが放り込まれてきている(はず)。

20151206191601

Amazon ES への転送設定開始

ロググループを指定してアクションから [Start Streaming to Amazon Elasticsearch Service] を選択する。

20151206185506

Amazon ES のドメインと Lambda Function 用の IAM role を作成

20151206185716

[Create new IAM role] を選択すると以下のような IAM role が作成される。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": [
        "arn:aws:logs:*:*:*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "es:ESHttpPost",
      "Resource": "arn:aws:es:*:*:*"
    }
  ]
}

Lambda function も以下のように自動的に作成されている。

20151206192137

ログフォーマットを指定

今回は Fluentd でシリアライズされたログが CloudWatch Logs に入っているのでそのまま JSON を選択。

20151206191634

確認して Start Streaming

20151206190715

念のために Subscription filter を AWS CLI で確認する。

$ aws logs describe-subscription-filters --log-group-name apache-log
{
    "subscriptionFilters": [
        {
            "filterName": "ElasticsearchStream_oreno-es",
            "destinationArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxxxxx:function:LogsToElasticsearch_oreno-es",
            "creationTime": 1449390986860,
            "filterPattern": "",
            "logGroupName": "apache-log"
        }
    ]
}

Amazon ES でインデックスを確認

Streaming が開始するとインデックスが作成されている。

20151206191848

そして Kibana3 で

Amazon ES には Kibana4 と Kibana3 が同梱されているので、今回は Kibana3 でポチポチ。

20151206192346

久しぶりの Kibana3 は個人的には敷居が高かった…

以上

とりあえず 7 日目までキタけど、CloudWatch Logs との連携は思った以上に簡単だった。

元記事はこちら

(ショロカレ 7 日目)2015 年のうちにやっておきたい Amazon Elasticsearch Service 入門(3)~CloudWatch Logs との連携~