logstash-output-amazon_esを使ってAmazon Elasticsearch Serviceにデータを投入する
はじめに
もうこの際はっきり言っておきますけど今日は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が出来上がっています!
もちろんちゃんとデータが流し込まれてます。
さいごに
IAM Roleを使ってAmazon ESのアクセスコントロールができるので、適切なアクセスポリシーを設定することで、セキュアにデータが投入できます。素敵ですね。
aws-fluent-plugin-amazon_esもそのうちリリースされるのかな(ボソッ)