デフォルトでは、Amazon CloudFront 標準ログは一部のフィールドの機密データをキャプチャします。プライバシー上の懸念から、ログのこの部分を削除したいと考えています。
簡単な説明
注: この記事では、クライアント 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 に送信する前に機密フィールドを削除する方法。
解決方法
Lambda 関数をトリガーする
c-ip フィールドを削除する 1 つの方法は、 Amazon S3 通知イベントを使用することです。CloudFront が Amazon S3 バケットにログファイルを配信したら、Lambda 関数をトリガーするようにバケットを設定します。
Lambda 関数を作成する
1. AWS Lambda コンソールを開きます。
2. [Functions] (関数) で、以下の設定を含む新しい Lambda 関数を作成します。
- Amazon S3 イベントのオブジェクト名を使用します。
- S3 バケットからオブジェクトを取得します。
3. c-ip 列を削除するか、値を匿名化されたデータに置き換えます。
注: 他のアプリケーションにログをさらに処理させる場合に備えて、値を置き換えて同じフォーマットを維持してください。
4. ログを保存して Amazon S3 にアップロードし直します。
新しいイベントを作成する
1. ログターゲットバケットで、[Properties] (プロパティ) に移動します。
2. [Event notifications] (イベント通知) で、新しいイベントを作成します。
3. イベントタイプ Put と送信先の Lambda 関数を選択します。
4. ステップ 1 で作成した Lambda 関数を選択し、[Save] (保存) を選択します。
重要: Lambda 関数での再帰呼び出し (無限ループ) を避けるには、以下のアクションを実行してください。
- CloudFront ログを初期ステージングプレフィックスに配信します。例えば、「オリジナル」。
- Amazon S3 イベントをそのプレフィックスでのみトリガーするようにしてください。
- Lambda 関数でログを別のプレフィックスに配信するようにします。例えば、「処理済み」。
ログを同じプレフィックスに配信すると、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 インスタンスに、特定の期間のログをダウンロードするコードをデプロイします。例えば、丸一日。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 プロセスを用意する) をご検討ください。