Curator による取り込みログ(INDEX)削除の Elasticsearch Service 6.8 / Lambda Python 3.8 対応化メモを残しておきます。
旧記事:
手順
1. IAM Role の確認/作成
ログ取り込みで IAM Role は作成されてるはずですが、なければ作成します。
- IAM Role の作成(以前の ALB/CLB 取り込みメモより)
2. AWS Lambda ファンクションの作成
Lambda にアップロードする .zip ファイルの作成(Amazon Linux 2 上で)
$ python3 -m venv dev
$ . dev/bin/activate
(dev) $ mkdir logrotate
(dev) $ cd logrotate/
(dev) $ pip install elasticsearch-curator requests_aws4auth -t ./
(省略)
(dev) $ rm -rf *.dist-info
(dev) $ vi logrotate.py
(ここで「logrotate.py」のコードを入力)
(dev) $ 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()
※Python コード自体は変わりませんが、.zip ファイルの作成方法が変わっています。
Lambda ファンクションの作成
ここから先は旧記事と同じ手順です。
先ほどの .zip ファイルをアップロードする形で作成します。
ランタイムは Python 3.8、ハンドラはlogrotate.lambda_handler
を指定します。
※elasticsearch-curator の容量が大きくなった関係で、↑のスクリーンショットの頃とは違い、Python のコードは表示されない可能性が高いです。
- 環境変数
ES_INDEX_PREFIX
で削除対象のログ(INDEX)のプレフィックス、ROTATION_PERIOD
で削除するまでの期間(日数)を指定します。
- トリガー
「CloudWatch Events」で cron 式を使って、00:00 UTC を過ぎたあたりの時刻に、毎日実行するよう指定すると良いでしょう(画面は省略)。
- 実行ロール
最初に確認/作成したものを使います。タイムアウトの時間も延長しておきます。
- ネットワーク
環境に合わせます。VPC を使う場合は、ALB の元記事を参考にしてください。
※実行時、まだ削除対象のログ(INDEX)がない場合はエラーが発生しますが、異常ではありません。