Edited at

S3からAmazon Elasticsearch Serviceへログを流してみた

More than 3 years have passed since last update.

AmazonElasticsearchを使ってみたいと思い調べました。

現時点で、S3/Kinesis/DynamoDB/CloudWatchからデータを流しこめるということなのでS3に溜めているログファイルで試した内容をざっくりメモ。


材料


  • Amazon Elasticsearch Service(AmazonES)

  • S3

  • ログファイル

  • Lambda


Amazon Elasticsearchを立ち上げる

ドメインの作成方法はこちらに詳しく書いてあります。

(見れば確実に分かるので、、割愛します)

http://aws.typepad.com/aws_japan/2015/10/amazon-elasticsearch-service.html


S3にBucketとログファイルを用意する

自分の場合は、自社サービスの運用で既にアクセスログなどをS3に保存していたのでそれを使いました。

もし必要なデータがない場合は、アプリケーションからFluentdなどを使ってS3に投げるようにすると良いと思います。

そちらの方法は今回の話題と別なので割愛させていただきます。


LambdaにFunctionを登録する


実行するjsファイルを用意

以下にLambdaを動かすjsのサンプルコードがあります。

https://github.com/awslabs/amazon-elasticsearch-lambda-samples

こちらのs3_lambda_es.jsを使います。

ここからの説明はこちらにかいてあります。

http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-aws-integrations.html#es-aws-integrations-s3-lambda-es

書いてあるままですが、、

以下のようなディレクトリ構成を用意して、↑で取得したjsファイルのファイル名を『index.js』へ変更してeslambdaに置きます。

※ここハマりどころだと思います。LambdaにHandlerという目立たない設定項目があるのですが、デフォルトが『index.handler』となっています。このindexという部分とjsファイル名を合わせないとUnable to import module 'index'というエラーが出て一向に何も実行されません。ご注意ください。(なのでindexじゃなくても設定とファイル名が揃ってればOKです)

eslambda

index.js
\node_modules

jsファイルに書かれているAmazonESへの接続情報を更新します。

説明に従って/* Globals */の部分をご自身の環境に合わせて書き換えてください。

必要なモジュールを取得します。

サンプルコードのままであれば以下のコマンドを実行します。

npm install byline clf-parser path stream

そしてフォルダごとzip圧縮します。

cd eslambda

zip -r eslambda.zip *


ロールの作成

実行するFunctionに権限を与えるためのロールを作ります。

IAMで新しいポリシーを以下のポリシードキュメントで作成してください。

※CloudWatchで動作確認できるように、そちらの権限も追加しています。

{

"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Action": [
"es:*"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::log-file-bucket-name/*"
]
}
]
}

次に新規ロールを作成し先ほどのポリシーを登録します。


Functionの作成

Lambdaのトップ画面から『Create a Lambda function』>『Skip』で作成画面へ進みます。

Function名を決めたら『Code entry type』は『Upload a .ZIP file』選択します。

『Role』には、↑で作成したロールがプルダウンに表示されているので、そちらを選択します。

『Next』>『Creat function』で作成完了です。


トリガーの設定

Lambdaの画面で『Event sources』タブを選択します。

『Add event source』をクリックし

『Event source type』から『S3』を選択。

『Bucket』でログを保存しているバケットを選択し、

『Event type』で『Put』を選択。

必要があれば『Prefix』でパスを指定、

『Suffix』で指定したい拡張子を設定してください。

『Submit』をクリックして完了です。


動作確認

Lambdaの画面で『Monitoring』タブを選択します。

右にある『View logs in CloudWatch』をクリックすると、そのFunctionが吐き出したログを確認できます。

S3へログファイルが投入されるタイミングでLambdaが動くのでエラーなどないか確認してください。