- tl;dr
- やったこと
— 構成イメージ
— プロキシ用 EC2 の作成
— Amazon ES の作成
— EC2 への Nginx インストールと設定
— CloudWatch Logs Agent のセットアップ
— Kibana へのアクセス
— アクセスログ - 以上
— 感想
— メリ
— 出目
— 解決出来ていない課題
tl;dr
Amazon ES の Kibana へのアクセスってログ取れたらいいのになーと思ったので、以下の記事を参考に Kibana の前に Nginx か何かでプロキシサーバーを立ててみることにした。
やったこと
構成イメージ
プロキシ用 EC2 の作成
- CentOS 6.x
- IAM role を付与しておく(ポリシーは以下のポリシーを付与)
- AmazonEC2ReadOnlyAccess - CloudWatch-Logs
CloudWatch-Logs は以下のようなポリシーとなっている。(Nginx のログを CloudWatch Logs に送る為)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ], "Resource": [ "arn:aws:logs:*:*:*" ] } ] }
Amazon ES の作成
- AccessPolicy の設定で EC2 の IP を設定しておく(例:xx.xxx.xx.0)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:xxxxxxxxxxxx:domain/oreno-es/*", "Condition": { "IpAddress": { "aws:SourceIp": "xx.xxx.xx.0" } } } ] }
EC2 への Nginx インストールと設定
- 自己証明書の作成と設置(参考:http://qiita.com/hito3/items/0e539e82ee3c410cccf1)
$ cd ~/ $ openssl genrsa 2048 > server.key $ openssl req -new -key server.key > server.csr $ openssl x509 -days 3650 -req -signkey server.key server.crt $ sudo mv server.* /etc/nginx/conf.d/ $ cd /etc/nginx/conf.d/ $ sudo chown root:root server.*
- Nginx の設定
$ cat /etc/nginx/conf.d/es.conf server { listen 443 default ssl; ssl on; ssl_certificate /etc/nginx/conf.d/server.crt; ssl_certificate_key /etc/nginx/conf.d/server.key; server_name oreno-es.inokara.com; proxy_set_header Host $http_host; location / { proxy_pass https://search-oreno-es-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com/; } }
- Nginx の再起動
sudo service nginx restart
CloudWatch Logs Agent のセットアップ
- /var/awslogs/etc/awslogs.conf
$ sudo cat /var/awslogs/etc/awslogs.conf (snip) [/var/log/nginx/access.log] datetime_format = %d/%b/%Y:%H:%M:%S file = /var/log/nginx/access.log buffer_duration = 5000 log_stream_name = {instance_id} initial_position = start_of_file log_group_name = /var/log/nginx/access.lo
Kibana へのアクセス
- https://xxx.xxx.xxx.0/_plugin/kibana にアクセスする
やったー、アクセス出来た。
アクセスログ
- プロキシ用サーバー上で確認
$ sudo tail -f /var/log/nginx/access.log (snip) xxx.xxx.xx.xxx - - [22/Oct/2016:11:28:46 +0900] "POST /.kibana-4/_mget?timeout=0&preference=1477103333038 HTTP/1.1" 200 2843 "https://xxx.xxx.xx.0/_plugin/kibana/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-" xxx.xxx.xx.xxx - - [22/Oct/2016:11:28:46 +0900] "GET /_plugin/kibana/bower_components/font-awesome/fonts/fontawesome-webfont.woff?v=4.2.0 HTTP/1.1" 200 65452 "https://xxx.xxx.xx.0/_plugin/kibana/styles/main.css?_b=7562" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-" xxx.xxx.xx.xxx - - [22/Oct/2016:11:28:47 +0900] "GET /_plugin/kibana/styles/theme/elk.ico HTTP/1.1" 200 1150 "https://xxx.xxx.xx.0/_plugin/kibana/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-" xxx.xxx.xx.xxx - - [22/Oct/2016:11:28:47 +0900] "POST /.kibana-4/__kibanaQueryValidator/_validate/query?explain=true&ignore_unavailable=true HTTP/1.1" 200 190 "https://xxx.xxx.xx.0/_plugin/kibana/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-" xxx.xxx.xx.xxx - - [22/Oct/2016:11:28:47 +0900] "POST /cwl-2016.10.22/_msearch?timeout=0&preference=1477103333038 HTTP/1.1" 200 9323 "https://xxx.xxx.xx.0/_plugin/kibana/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" "-"
- CloudWatch Logs でも確認
以上
感想
- 思ったよりも簡単にプロキシ経由で Kibana にアクセスすることが出来た
メリ
- Kibana へのアクセス(厳密には Amazon ES へのアクセスも)を EC2 のセキュリティグループや Web サーバーの認証機構を利用出来る
- Amazon ES のアクセスポリシー変更作業に依存しなくなる(構成変更に時間が掛かる…)、EC2 の IP だけアクセスポリシーに設定しておけば良い
出目
- EC2 を用意する必要がある
- 同時に EC2 の管理を行う必要がある
解決出来ていない課題
- Kibana だけアクセスさせるという課題はプロキシでも解決出来ない(Kibana にアクセスさせるけど Elasticsearch API を叩かせないということは出来なさそう)