こんにちは、技術3課の城です。
以前、【Amazon Elasticsearch Service】CloudTrail、VPC Flowlogsを集約するというブログを書いたのですが、このままだとデータがたまる一方なので、Lambdaを利用したローテーションを実装してみました。
下記のドキュメントほぼそのままなのですが、必要なモジュールやライブラリを含めるなど、Lambdaをあまり利用していなった私にとっては色々と調べつつの実装だったので、記録として残しておきたいと思います。
https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/curator.html
※Python2.7での実装となっているため、ご注意ください。
開発環境
開発環境としてはAmazonLinux2のEC2インスタンスを利用しました。
Pythonのバージョンは2.7.14です。
$ python --version Python 2.7.14
pipのインストール
モジュールやライブラリのインストールに必要なので、pipをインストールします。
インストールスクリプトのダウンロード
curl -O https://bootstrap.pypa.io/get-pip.py
インストール
python get-pip.py --user
Lambbda関数用ディレクトリの作成、及び、移動
Lambda関数を作成するのに利用するディレクトリを作成、移動します。
mkdir aes_rotate cd aes_rotate
必要なモジュール、ライブラリのインストール
Curatorを利用するのに必要なモジュールをインストールします。
pip install requests_aws4auth -t . pip install elasticsearch -t . pip install elasticsearch-curator -t .
*.dist-infoの削除
*.dist-infoは不要なので、削除します。
rm -r ./*.dist-info
lambda_function.pyの作成
ほぼほぼドキュメントのままですが、下記は30日分のインデックスを保持する内容となります。
保持期間を変更する場合はunit_countの値を変更します。
vi lambda_function.py
import boto3 from requests_aws4auth import AWS4Auth from elasticsearch import Elasticsearch, RequestsHttpConnection import curator host = 'ドメインのURL' # For example, search-my-domain.region.es.amazonaws.com region = 'ap-northeast-1' # For example, us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Lambda execution starts here. def lambda_handler(event, context): # Build the Elasticsearch client. es = Elasticsearch( hosts = [{'host': host, 'port': 443}], http_auth = awsauth, use_ssl = True, verify_certs = True, connection_class = RequestsHttpConnection ) index_list = curator.IndexList(es) # Filters by age, anything with a time stamp older than 30 days in the index name. index_list.filter_by_age(source='name', direction='older', timestring='%Y.%m.%d', unit='days', unit_count=30) print("Found %s indices to delete" % len(index_list.indices)) # If our filtered list contains any indices, delete them. if index_list.indices: curator.DeleteIndices(index_list).do_action()
デプロイパッケージの作成
デプロイパッケージを作成し、ローカルにダウンロードしておきます。
zip -r ../aes_rotate.zip .
私はWindowsユーザーなので、TeratermのSSH SCPやWinSCPを使ってダウンロードしてます。
IAMロールの作成
Lambda関数が利用するIAM Roleを作成します。
IAMポリシーの作成
先にロールにアタッチするIAMポリシーを作成しておきます。
IAMダッシュボードにて左側サイドバーの[ポリシー]⇒[ポリシー作成]をクリックします。
[JSON]タブをクリックし、下記の内容をエディタに貼り付け、[ポリシーの確認]をクリックします。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "es:ESHttpPost", "es:ESHttpGet", "es:ESHttpPut", "es:ESHttpDelete" ], "Resource": "[対象ドメインのARN]/*" } ] }
[名前]、[説明]を記載し、[ポリシーの作成]をクリックします。
IAMロールの作成
IAMダッシュボードにて左側サイドバーの[ロール]⇒[ロールの作成]をクリックします。
[このロールを使用するサービスを選択]でLambdaを選択し、[次のステップ: アクセス権限]をクリックします。
先ほど作成したポリシー[aes-index-rotation]をチェックし、[次のステップ: タグ]をクリックします。
タグの追加はオプション設定なので、今回はスキップします。
[次のステップ: 確認]をクリックします。
[ロール名]を記入して、[ロールの作成]をクリックします。
Lambda関数の作成
関数の作成
Lambdaダッシュボードにて、左側サイドバーの[関数]⇒[関数の作成]をクリックします。
下記内容を入力し、[関数の作成]をクリックします。
関数名:任意の名前
ランタイム:Python2.7
実行ロール:既存のロールを使用する
既存のロール:前項で作成したロール
デプロイパッケージのアップロード
コードエントリタイプを[.zip ファイルをアップロード]をプルダウンメニューから選択し、アップロードをクリックし、先ほど作成したデプロイパッケージ[aes_rotate.zip]を選択し、[保存]をクリックします。
トリガー(CloudWatch Events)の追加
[+ トリガーを追加]をクリックします。
トリガーの選択欄に[CloudWtatch Events]を選択し、下記内容を入力、[追加]をクリックします。
ルール:新規のルールの作成
ルール名:任意の名前
ルールタイプ:スケジュール式
スケジュール式(例):cron(5 18 * * ? *)
スケジュール式はUTCでの記載となり、上記例では毎日AM3:05に実行となります。
記載方法の詳細については下記ドキュメントをご覧ください。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
以上で実装完了となります。
さいごに
ローテーションについてはどうしようかと悩んでいたのですが、ドキュメントを探してみるとあるあたり、さすがAWSだなと感じています。
丁寧に書かれたドキュメントは本当にありがたいものですね。
城 航太 (記事一覧)
営業部カスタマーサクセス課・課長
AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020