読者です 読者をやめる 読者になる 読者になる

ようへいの日々精進XP

どげんもこげんも無かろうもん

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

初老丸の独り Advent calendar 2015 AWS Amazon ES Elasticsearch kibana メモ CloudWatch

これは「初老丸の独り 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 にログが放り込まれてきている(はず)。

f:id:inokara:20151206191601p:plain

Amazon ES への転送設定開始

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

f:id:inokara:20151206185506p:plain

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

f:id:inokara:20151206185716p:plain

[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 も以下のように自動的に作成されている。

f:id:inokara:20151206192137p:plain

ログフォーマットを指定

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

f:id:inokara:20151206191634p:plain

確認して Start Streaming

f:id:inokara:20151206190715p:plain

念のために 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 が開始するとインデックスが作成されている。

f:id:inokara:20151206191848p:plain

そして Kibana3 で

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

f:id:inokara:20151206192346p:plain

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


以上

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