ようへいの日々精進XP

よかろうもん

Amazon Elasticsearch Service の Kibana にプロキシ経由でアクセスする考察

tl;dr

Amazon ES の Kibana へのアクセスってログ取れたらいいのになーと思ったので、以下の記事を参考に Kibana の前に Nginx か何かでプロキシサーバーを立ててみることにした。

やったこと

構成イメージ

f:id:inokara:20161022120837p:plain

プロキシ用 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 インストールと設定

$ cd ~/
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > 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 へのアクセス

f:id:inokara:20161022114202p:plain

やったー、アクセス出来た。

アクセスログ

  • プロキシ用サーバー上で確認
$ 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 でも確認

f:id:inokara:20161022114947p:plain

以上

感想

  • 思ったよりも簡単にプロキシ経由で Kibana にアクセスすることが出来た

メリ

  • Kibana へのアクセス(厳密には Amazon ES へのアクセスも)を EC2 のセキュリティグループや Web サーバーの認証機構を利用出来る
  • Amazon ES のアクセスポリシー変更作業に依存しなくなる(構成変更に時間が掛かる...)、EC2 の IP だけアクセスポリシーに設定しておけば良い

出目

  • EC2 を用意する必要がある
  • 同時に EC2 の管理を行う必要がある

解決出来ていない課題

  • Kibana だけアクセスさせるという課題はプロキシでも解決出来ない(Kibana にアクセスさせるけど Elasticsearch API を叩かせないということは出来なさそう)