デフォルトでは、Amazon CloudFront 標準ログは一部のフィールドの機密データをキャプチャします。プライバシーの懸念から、ログのこの部分を削除したいです。
簡単な説明
注: この記事では、Client-IP (c-ip) フィールドの例を使用します。
CloudFront ログは、デフォルトで c-ip をフィールドの 1 つとしてキャプチャします。ログから c-ip を削除する方法は 3 つあります。
- Amazon Simple Storage Service (Amazon S3) へのログ配信でフィールドを削除する AWS Lambda 関数をトリガーする。
- フィールドを削除するために一定の間隔で実行する Amazon Elastic Compute Cloud (Amazon EC2) プロセスを用意する。
- CloudFront 標準ログを使用し、ログデータを Amazon S3 に送信する前に機密フィールドを削除する。
注: 標準ログを有効にするには、プロプランまたは従量制料金プランを使用する必要があります。詳細については、「Amazon CloudFront の料金」を参照してください。
解決策
Lambda 関数をトリガーする
c-ip フィールドを削除する 1 つの方法は、Amazon S3 通知イベントを使用することです。CloudFront がログファイルを Amazon S3 バケットに配信するときに、Lambda 関数をトリガーするようにバケットを設定します。
Lambda 関数を作成する
1.AWS Lambda コンソールを開きます。
2.[関数] で、次の構成を持つ新しい Lambda 関数を作成します。
- Amazon S3 イベントのオブジェクト名を使用します。
- S3 バケットからオブジェクトを取得します。
3.c-ip 列を削除するか、値を匿名化されたデータに置き換えます。
注: 他のアプリケーションでログをさらに処理する場合に備えて、同じ形式を維持するように値を置き換えてください。
4.ログを保存して Amazon S3 にアップロードします。
新しいイベントを作成する
1.ログターゲットバケットで、[プロパティ] に移動します。
2.[イベント通知] で、新しいイベントを作成します。
3.イベントタイプ Put と送信先の Lambda 関数を選択します。
4.ステップ 1 で作成した Lambda 関数を選択し、[保存] をクリックします。
重要: Lambda 関数での再帰呼び出し (無限ループ) を回避するには、次のアクションを実行します。
- CloudFront ログを初期ステージングプレフィックスに配信します。(例: "original")。
- Amazon S3 イベントをそのプレフィックスでのみトリガーするようにします。
- Lambda 関数にログを別のプレフィックスに配信させます。(例: "processed")。
同じプレフィックスにログを配信すると、Lambda 関数が再びトリガーされ、再帰呼び出しが作成されます。詳細については、「Avoiding recursive invocation with Amazon S3 and AWS Lambda」(Amazon S3 と AWS Lambda による再帰呼び出しの回避) を参照してください。
注: Amazon S3 のコストを低く抑えるには、特定の期間が経過すると元のログが期限切れになるように Amazon S3 ライフサイクルポリシーを設定します。
Amazon EC2 プロセスを用意する
Amazon EventBridge を使用して、EC2 インスタンスを起動し、定期的にログファイルを処理するスケジュールルール (cron) を作成します。(例: 1 日に 1 回)。プロセスが完了したら、コストを節約するために次の繰り返しまで EC2 インスタンスを停止します。
1.特定の時間に EC2 インスタンスを起動するように EventBridge と Lambda を設定します。詳細については、「Lambda を使用して Amazon EC2 インスタンスを定期的に停止し、起動する方法を教えてください」を参照してください。
2.EC2 インスタンスに、一定期間のログをダウンロードするコードをデプロイします。(例: 丸 1 日)。c-ip 列を削除してログを処理するか、列値を匿名化されたデータに置き換えます。処理されたログを S3 バケットにアップロードします。
オプション: Amazon S3 ライフサイクルの移行コストを節約するために、処理されたすべてのログを 1 つのファイルにマージします。このプロセスは、ログを長期間保存する場合に便利です。
Kinesis Data Firehose を使用する
CloudFront リアルタイムログを使用して、保存するフィールドを選択します。後で、Amazon Kinesis Data Firehose にログデータを Amazon S3 に送信させます。
CloudFront リアルタイムログを設定すると、各リアルタイムログレコードに含まれるフィールドのリストが表示されます。各ログレコードには最大 40 のフィールドが含まれます。使用可能なすべてのフィールドを受け取るか、パフォーマンスを監視および分析する必要があるフィールドのみを受け取るかを選択できます。フィールド c-ip を無効にして、そのフィールドをログから除外します。
注: Amazon Kinesis Data Streams を使用しているため、このオプションは高額になる可能性があります。より費用対効果の高いソリューションとして、他の 2 つのオプション (Lambda 関数をトリガーする、または Amazon EC2 プロセスを用意する) を検討してください。