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