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

「Data Connector for Amazon S3」でELBのログを取り込む

embulk s3 TreasureData 技術

こんにちは。matsです。

 

トレジャーデータからこんなサービスがリリースされました。

http://blog-jp.treasuredata.com/entry/2015/06/22/125518

たまたま社内でELBのログを調査する機会があったので、「Data Connector」でELBのアクセスログをTDに送るのに使用してみました。

今回は「Data Connector」を使う時の手順について書こうかと思います。

 

TreasureData ToolBeltのインストール

公式サイトから落としてインストールします。

私は自分のMacbookにインストールしました。

 

TreasureData ToolBeltの設定

アカウント認証

下記コマンドでアカウント認証をします。(対話形式です)

$ td -e https://api.treasuredata.com account -f

Enter your Treasure Data credentials.
Email: kazuki.matsuda@intimatemerger.com
Password (typing will be hidden):
Authenticated successfully.
Use 'td -e https://api.treasuredata.com db:create <db_name>' to create a database.

 

APIエンドポイントの登録

下記コマンドでコールするAPIを設定します。(切り替えるとYBIでもいけるのかな?)

$ td server:endpoint https://api.treasuredata.com

 

設定ファイルの作成

基本的にはembulkの設定と同じようです。

ELBのログファイルを読み込む設定はこんな感じになりました。

elb.yml

config:
  in:
    type: s3
    bucket: <bucket_name>
    path_prefix: [prefix]/AWSLogs/[account_id]/elasticloadbalancing/ap-northeast-1/[YYYY]/[MM]/[DD]/
    endpoint: s3-ap-northeast-1.amazonaws.com
    access_key_id: XXXXXXXXXXXXXXXXXXXXXX
    secret_access_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    parser:
      charset: UTF-8
      newline: CRLF
      type: csv
      delimiter: ' '
      skip_header_lines: 1
      allow_extra_columns: true
      allow_optional_columns: true
      columns:
        - name: time
          type: timestamp
          format: "%Y-%m-%dT%H:%M:%S"
        - name: elb_name
          type: string
        - name: client:port
          type: string
        - name: backend:port
          type: string
        - name: request_processing_time
          type: double
        - name: backend_processing_time
          type: double
        - name: response_processing_time
          type: double
        - name: elb_status_code
          type: string
        - name: backend_status_code
          type: string
        - name: received_bytes
          type: long
        - name: sent_bytes
          type: long
        - name: request
          type: string
        - name: user_agent
          type: string
        - name: ssl_cipher
          type: string
        - name: ssl_protocol
          type: string
  out:
    mode: append

 

ログフォーマットはこちらを参考にしました。が、実際にはかれているログをよく見ると

  • user_agent
  • ssl_cipher
  • ssl_protocol

といった項目があるので、注意が必要です。(これ公式のドキュメントに書いてほしいな。。)

embulk使用時とちがうのは、outの書き方ぐらいかと思います。デフォルトの出力先がTDになっているので、アウトプットプラグインの指定が必要ない感じです。

 

今回は特定の日のログが目当てだったので、path_prefixで日にちまで指定して取り込みました。

階層を上げれば月別とかで取り込むことができるので便利ですね。

 

ジョブの登録

次のコマンドでTDにジョブを登録します。

$ td connector:issue elb.yml --database embulk --table elb_accesslog --time-column time

Job 27708303 is queued.
Use 'td job:show 27708303' to show the status.

databaseとtableをあらかじめ作っていないと、ジョブを登録できないようなので注意が必要です。

 

実行するとTDの画面上からはこんな感じで「RUNNING」のジョブに積まれます。

 

td_bulk

 

ジョブの定期実行

ジョブをタスクスケジューラーで定期的に動かす場合は、下記コマンドで登録することができます。

 

$ td connector:create 
  daily_import 
  "10 0 * * *" 
  embulk 
  elb_accesslog 
  elb.yml 
  --time-column time

 

が、定期的に出力されるログを取り込む場合は、取り込む際に対象ファイルの削除か、path_prefixの動的な変更が出来ないと正直使いにくいです。。

 

定期実行とは相性が悪いみたいなので、Lambdaを絡めてファイルの生成と同時にTDに取り込むというのをそのうちやってみようかと思います。

 

おしまい