logstash-output-amazon_esを使ってAmazon Elasticsearch Serviceにデータを投入する

Elasticsearch Service

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

もうこの際はっきり言っておきますけど今日はAmazon Elasticsearch Service(Amazon ES)のことしかやってません。どうも佐々木です。

朝からずーっとAmazon ESのブログ書いてました。

すると、同僚がネタを提供してくれました!

AWS謹製のLogstashプラグインです。Amazon ESはIAMによってアクセス制御を行うのですが、このLogstashプラグインを使うことで、EC2に割り当てたIAM Roleを使ってAmazon ESにデータを投入することができます。EC2でアクセスキーを持つ必要も無いし、IPアドレスが動的に変わっても問題ありません。これは便利ですね。

ということで!早速やってみました!

やってみた

できないことの確認

今回の処理を実行するEC2は、AdministratorAccessのIAM Roleを付与されています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

Amazon ESのアクセスポリシーは以下の通り。特定のIPアドレスからのみアクセスを許可しています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-1:000000000000:domain/myes/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "XX.XX.XX.XX"
        }
      }
    }
  ]
}

この状態で、上記のIPアドレスでは無いEC2からアクセスしても、以下のように拒否されます。

$ curl -XGET search-myes-hoge.ap-northeast-1.es.amazonaws.com
{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:ap-northeast-1:000000000000:domain/myes/"}

Logstashのインストール

Logstash + Elasticsearch + Kibana4でTwitterを可視化するに書いたのと同じやり方です。

$ wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-1.5.4-1.noarch.rpm
$ sudo rpm -ivh logstash-1.5.4-1.noarch.rpm
$ /opt/logstash/bin/logstash --version
logstash 1.5.4

logstash-output-amazon_esプラグインのインストール

Logstashのpluginコマンドで一発でインストールできます。

$ sudo /opt/logstash/bin/plugin install logstash-output-amazon_es
Validating logstash-output-amazon_es
Installing logstash-output-amazon_es
Installation successful

logstash-output-amazon_esプラグインでAmazon ESにデータを投入する

inputとしてTwitter(Twitter Streaming API)を指定し、全てのtweetを対象に、"aws"というキーワードで取得します。そのデータをAmazon ESに投入します。

$ /opt/logstash/bin/logstash -e 'input { 
  twitter {
    consumer_key => "<YOUR_CONSUMER_KEY>"
    consumer_secret => "<YOUR_CONSUMER_SECRET_KEY>"
    oauth_token => "<YOUR_OAUTH_TOKEN>"
    oauth_token_secret => "<YOUR_OAUTH_SECRET_TOKEN>"
    keywords => ["aws"]
    full_tweet => true
  }} 
output { 
    amazon_es {
        hosts => ["search-myes-hoge.ap-northeast-1.es.amazonaws.com"]
        region => "ap-northeast-1"
        index => "twitter"
        document_type => "stream"
    }
    stdout { } }'

結果

twitterというIndexが出来上がっています!

Amazon_Elasticsearch_Service_Management_Console

もちろんちゃんとデータが流し込まれてます。

Visualize_-_Kibana_4

さいごに

IAM Roleを使ってAmazon ESのアクセスコントロールができるので、適切なアクセスポリシーを設定することで、セキュアにデータが投入できます。素敵ですね。

aws-fluent-plugin-amazon_esもそのうちリリースされるのかな(ボソッ)