AWS
lambda
curator
ElasticsearchService

Elasticsearch Service (6.0/6.2) に取り込んだログ(INDEX)をCuratorで削除するメモ

Elasticsearch Service (6.0/6.2) 小ネタメモシリーズは、100番煎じ?の「Curator on Lambdaでログ(INDEX)削除」でシメたいと思います。

で取り込んだログ(INDEX)を、一定期間経過後に削除するものです。

※当然ですが、Elasticsearch Service が起動していて、既に削除すべきログ(INDEX)が存在することが前提です。

手順

1. IAM Role の確認/作成

すでに IAM Role が作成されていれば問題ないのですが、なければ作成します。

2. AWS Lambda ファンクションの作成

Lambda にアップロードする .zip ファイルの作成

elasticsearch-curatorが必要なので、今回も .zip ファイルとしてあらかじめ用意します。elasticsearch-curatorをインストールしたディレクトリに Lambda ファンクションの内容を記述して.zip化します。

なお、Elasticsearch Service (6.0/6.2) に対応するのは Curator 5 です。

今回は Curator 5.5.2 を使いました。

実行例
$ mkdir ~/logrotate
$ pip2 install elasticsearch-curator -t ~/logrotate/
※環境によって「pip」「pip2」など
$ cd ~/logrotate
$ vi logrotate.py
※Lambda ファンクションの内容を記述して保存
$ zip -r ../logrotate.zip *
Lambdaファンクションの内容
import boto3
import curator
import os
from elasticsearch import Elasticsearch, RequestsHttpConnection
from requests_aws4auth import AWS4Auth

es_host = os.environ["ES_HOST"]
es_index = os.environ["ES_INDEX_PREFIX"] + "-"
rotation_period = int(os.environ["ROTATION_PERIOD"])
region = os.environ["AWS_REGION"]

def lambda_handler(event, context):
    awsauth = AWS4Auth(
        os.environ["AWS_ACCESS_KEY_ID"],
        os.environ["AWS_SECRET_ACCESS_KEY"],
        region,
        "es",
        session_token=os.environ["AWS_SESSION_TOKEN"]
    )

    es = Elasticsearch(
        hosts=[{"host": es_host, "port": 443}],
        http_auth=awsauth,
        use_ssl=True,
        verify_certs=True,
        connection_class=RequestsHttpConnection
    )
    runCurator(es)


def runCurator(es):
    ilo = curator.IndexList(es)
    ilo.filter_by_regex(kind="prefix", value=es_index)
    ilo.filter_by_age(source="name", direction="older", timestring="%Y%m%d", unit="days", unit_count=rotation_period)
    delete_indices = curator.DeleteIndices(ilo)
    delete_indices.do_action()

Lambda ファンクションの作成

先ほどの.zipファイルをアップロードする形で作成します。
curator-log-rotate-1.png
ランタイムは Python 2.7、ハンドラは【アップロードしたファイル名】.lambda_handlerを指定します。

環境変数の設定は以下の通りです。
curator-log-rotate-2.png
ES_INDEX_PREFIXで削除対象のログ(INDEX)のプレフィックス、ROTATION_PERIODで削除するまでの期間(日数)を指定します。

トリガーは「CloudWatch Events」で cron 式を使って、00:00 UTC を過ぎたあたりの時刻に、毎日実行するよう指定すると良いでしょう(画面は省略)。

実行ロールは最初に確認/作成したものを使います。タイムアウトの時間も延長しておきます。
curator-log-rotate-3.png

ネットワークの設定は環境に合わせます。VPC を使う場合は、先の記事を参考にしてください。

補足

まだ削除対象のログ(INDEX)がない場合はエラーが発生しますが、異常ではありません。