2020/01/07 追記:
Python 3.8 / Elasticsearch Service 6.8 対応版アップデート記事はこちらです。
Elasticsearch Service (6.0/6.2) 小ネタメモシリーズは、100番煎じ?の**「Curator on Lambdaでログ(INDEX)削除」**でシメたいと思います。
- ALB/CLBのアクセスログをElasticsearch Service (6.0/6.2) に取り込むメモ
- CloudFrontのアクセスログをElasticsearch Service (6.0/6.2) に取り込むメモ(手抜き編)
- TABLE形式のAurora(MySQL互換)スロークエリログをElasticsearch Service (6.0/6.2) に取り込みS3に保存するメモ
で取り込んだログ(INDEX)を、一定期間経過後に削除するものです。
※当然ですが、Elasticsearch Service が起動していて、既に削除すべきログ(INDEX)が存在することが前提です。
手順
1. IAM Role の確認/作成
すでに IAM Role が作成されていれば問題ないのですが、なければ作成します。
- IAM Role の作成(前述の ALB/CLB 取り込みメモより)
2. AWS Lambda ファンクションの作成
Lambda にアップロードする .zip ファイルの作成
elasticsearch-curator
が必要なので、今回も .zip ファイルとしてあらかじめ用意します。elasticsearch-curator
をインストールしたディレクトリに Lambda ファンクションの内容を記述して.zip
化します。
なお、Elasticsearch Service (6.0/6.2) に対応するのは Curator 5 です。
- Version Compatibility(Curator Reference [5.5] | Elastic)
今回は Curator 5.5.2 を使いました。
$ mkdir ~/logrotate
$ pip2 install elasticsearch-curator -t ~/logrotate/
※環境によって「pip」「pip2」など
$ cd ~/logrotate
$ vi logrotate.py
※Lambda ファンクションの内容を記述して保存
$ zip -r ../logrotate.zip *
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
ファイルをアップロードする形で作成します。
ランタイムは Python 2.7、ハンドラは【アップロードしたファイル名】.lambda_handler
を指定します。
環境変数の設定は以下の通りです。
ES_INDEX_PREFIX
で削除対象のログ(INDEX)のプレフィックス、ROTATION_PERIOD
で削除するまでの期間(日数)を指定します。
トリガーは「CloudWatch Events」で cron 式を使って、00:00 UTC を過ぎたあたりの時刻に、毎日実行するよう指定すると良いでしょう(画面は省略)。
実行ロールは最初に確認/作成したものを使います。タイムアウトの時間も延長しておきます。
ネットワークの設定は環境に合わせます。VPC を使う場合は、先の記事を参考にしてください。
補足
まだ削除対象のログ(INDEX)がない場合はエラーが発生しますが、異常ではありません。