LoginSignup
32
35

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-10-18

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

32
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
35