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が動くのでエラーなどないか確認してください。