re:dash!!!
ダッシュボードの生成元となるデータソース、
MySQLやTreasureData、BigQueryなどのデータベースはもちろん
Google Spreadsheetsからもデータを取得できたり、
Pythonのコードを直接実行することも可能でなんと無料!
ログ可視化に最適なダッシュボードツールですが、自分も検証がてらデビューしてみました。
■今回やりたいこと


・redashサーバをEC2で構築
・redashサーバのnginxアクセスログをS3とRedshiftに格納(fluentdで)
・redashサーバでRedshiftのDBやらを参照できること
BigQueryで実現しようと思いましたが、みんなやってるのでw
結局ログフォーマットを色々いじる上で、
どのサービスを使っても同じなのであえてRedshiftにしてみました。
■re:dashサーバの構築
https://github.com/getredash/redash/releases
・redashインストール
| 1 2 3 4 5 | # wget https://github.com/getredash/redash/archive/v2.0.0.zip # unzip v2.0.0.zip # cd redash-2.0.0/ # cd setup/amazon_linux/ # ./bootstrap.sh | 
・80番重複エラー修正
redashはnginxで動いているので、
以下のようにデフォルトのポートを変更する必要があります。(80→8081)
| 1 2 3 4 5 | # vim /etc/nginx/nginx.conf 40 server { 41 listen 8081 default_server; 42 listen [::]:8081 default_server; 43 server_name localhost; | 
・「TemplateNotFound: login.html」の対応
上記の設定をしてnginx再起動すると今度はアクセスができなくなります(私用なのかw)
なので.envにassetのpath指定を行います。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # vim /opt/redash/.env export REDASH_LOG_LEVEL="INFO" export REDASH_REDIS_URL=redis://localhost:6379/1 export REDASH_DATABASE_URL="postgresql://redash" export REDASH_COOKIE_SECRET=veryverysecret export REDASH_STATIC_ASSETS_PATH="../rd_ui/dist/" export REDASH_MAIL_SERVER="localhost" export REDASH_MAIL_PORT="25" export REDASH_MAIL_USE_TLS="false" export REDASH_MAIL_USE_SSL="false" export REDASH_MAIL_USERNAME="None" export REDASH_MAIL_PASSWORD="None" export REDASH_MAIL_DEFAULT_SENDER="redash@adachin-gmail.com" export REDASH_HOST="https://redash.adachin.com" | 
・もう一度./bootstrap.sh
redashのプロセスを一旦killして./bootstrap.shを叩きます。
| 1 | # /etc/init.d/redash_supervisord restart | 
・セキュリティーグループはredshiftのport 5439を付与
・ダッシュボードのログイン
■S3の作成
「Tokyo」リージョンにバケットを作成
バケットの中に「logs」フォルダを作成
■IAMの設定
redashユーザを作成
Attach Policyで「AmazonS3FullAccess」を追加してクレデンシャルをメモ
■Redshiftにクラスターの起動
・適当なテーブルを作る
| 1 2 | # yum install postgresql # psql -U root -W -h redash.xxxxxxxxxxxxxxxxxx.amazonaws.com -d redash -p 5439 | 
下記のSQLを作成する
| 1 2 3 4 5 6 7 8 9 10 | redash=# CREATE TABLE access_log ( redash(# time varchar(255), redash(# host varchar(255), redash(# req varchar(255), redash(# status integer, redash(# size integer, redash(# referer varchar(255), redash(# ua varchar(255) redash(# ); CREATE TABLE | 
| 1 2 3 4 5 6 7 8 9 10 11 | redash=# \d access_log  Table "public.access_log"   Column | Type | Modifiers ---------+------------------------+-----------  time | character varying(255) |  host | character varying(255) |  req | character varying(255) |  status | integer |  size | integer |  referer | character varying(255) |  ua | character varying(255) | | 
■fluentd(ラッパー)のインストールと設定(td-agent)
※yumでtd-agentをインストールする場合
| 1 2 3 4 5 6 | # yum groupinstall -y "Development Tools" # vi /etc/yum.repos.d/td.repo [treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgcheck=0 | 
・Redshitと連携するためにプラグインのインストール
※curlでtd-agentをインストールする場合
| 1 2 3 4 | # yum groupinstall -y "Development Tools" # curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sudo sh # /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-redshift # /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-jsonbucket | 
・td-agentにaccess_logの読み込み権限を付与
| 1 | # chgrp td-agent /var/log/nginx | 
・nginx log formatをltdvに変更する
ログフォーマットはデフォルトだと自分でフォーマットを書く必要があるので(正規表現ツラたん)
ltsvにすれば超楽になります。
| 1 2 3 4 5 6 7 8 | # vim /etc/nginx.conf log_format ltsv 'time:$time_local\t'                 'host:$remote_addr\t'                 'req:$request\t'                 'status:$status\t'                 'size:$body_bytes_sent\t'                 'referer:$http_referer\t'                 'ua:$http_user_agent\t'; | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | # vim /etc/nginx/conf.d/redash.conf upstream rd_servers {  server 127.0.0.1:5000; } server { server_tokens off; listen 80 default; access_log /var/log/nginx/rd.access.log ltsv; ~省略~ | 
・nginxのログ確認
上記の設定をしたことでフォーマットがltsv用に変わりました。
| 1 2 | # tail -f /var/log/nginx/rd.access.log time:23/Jun/2017:05:46:50 +0000 host:xxx.xxxx.xxxx.xxxx req:GET /images/favicon-32x32.png HTTP/1.1 status:200 size:1171 referer:http://xx.xxx.xxx.xxxx./ ua:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36 | 
・td-agent.conf
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <source>  type tail  path /var/log/nginx/rd.access.log  pos_file /tmp/access.log.pos  tag nginx.access  format ltsv  time_format %d/%b/%Y:%H:%M:%S %z </source> <match nginx.access>  type jsonbucket  output_tag redshift.nginx.access  json_key log </match> <match redshift.nginx.access>  type redshift # s3  aws_key_id xxxxxxxxxxxxxxxx  aws_sec_key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  s3_bucket redash-log  s3_endpoint s3-ap-northeast-1.amazonaws.com  path logs/  timestamp_key_format %Y%m%d/%Y%m%d-%H%M # redshift  redshift_host redash.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.amazonaws.com  redshift_port 5439  redshift_dbname redash  redshift_user root  redshift_password xxxxxxxxxxxxxxxx  redshift_schemaname public  redshift_tablename access_log  redshift_copy_base_options TIMEFORMAT 'auto' TRUNCATECOLUMNS COMPUPDATE ON  file_type json # buffer  buffer_type file  buffer_path /var/log/td-agent/buffer  flush_interval 1m  buffer_chunk_limit 1g </match> | 
・td-agent起動
の前に!そのまま起動するとエラー出るので起動スクリプトを変更します。(権限の問題)
| 1 2 3 4 5 | # vim /etc/init.d/td-agent USER=root # Running user #td-agentユーザからrootに # /etc/init.d/td-agent start # chkconfig td-agent on | 
・td-agentログ確認
実際にredashに何回かアクセスすると
ログにs3とRedshiftにcopyされました〜と出るはずです。
■S3にちゃんとlogが溜まっているか確認
■Redshiftのクエリが溜まっているか確認
■redashのダッシュボードからRedshiftのDBにアクセスできるか確認
Queries > New Queryからredash DBを選択し、適当にSQL書く。
よし!できた!あとはVisualization Editorでグラフ化するだけ!
■まとめ
少しハマったのはテーブル内のカラムが違ったくらいでしたね。
次回はグラフ化 how to ブログします。
というか個人でredashサーバ作ってこのブログのsshアタックとか
可視化してみよう。(GIPで犯人特定的なw)
おもしろいし簡単!





 
													 
													
0件のコメント