LoginSignup
0
0

【AWS CDK】日付ベースのパーティション分割でS3アクセスログを設定

Posted at

はじめに

2023年11月21日にS3アクセスログ周りのアップデートが行われました。
今回のアップデートにより、日付ベースの自動パーティション分割がサポートされました。
https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-s3-server-access-logging-date-partitioning/

マネジメントコンソールで、日付ベースのパーティション分割でアクセスログを設定する記事はありますが、CDKで実装する方法を記載した記事がなかったので、本記事ではその方法をご紹介したいと思います。

環境情報

OS:Windows 10
CDK:ver 2.137.0
IDE:VS Code
CDKの言語:TypeScript

用語の説明

S3アクセスログとは

S3アクセスログは、Amazon Simple Storage Service(S3)でのオブジェクトへのアクセスに関する情報を記録する機能です。
これには、オブジェクトのリクエスト者、アクセスの種類、日時などが含まれます。

アクセスログを有効化することのメリット

S3アクセスログを有効化することにより、次のようなメリットがあります。

セキュリティ:アクセスログを分析して不正なアクセスを検知することができます。
監査:誰がいつ、どのオブジェクトにアクセスしたかをトラッキングすることができます。

日付ベースのパーティション分割とは

日付ベースのパーティション分割は、ログファイルを日付ごとのフォルダに保存する方法です。
これにより、Amazon Athena、Amazon EMR、Amazon Redshift Spectrum などのサービスでは、ログのクエリを実行するときにパフォーマンスを向上させ、コストを削減することができます。
(クエリ実行時に、特定のパーティションのみを読み込むため)

CDKとは

AWS Cloud Development Kit(CDK)は、プログラミング言語(TypeScript、Python、Javaなど)を使用して、AWSリソースをプロビジョニングするためのフレームワークです。
CDKを使用すると、インフラストラクチャのコードを簡潔に記述し、再利用可能なコンポーネントを作成できます。

実装

CDKの初期化とライブラリのインストール

まず、CDKの作業ディレクトリに移動し、以下のコマンドを実行してCDKプロジェクトを作成します。

$ cdk init --lang typescript

コーディング

日付ベースのパーティション分割を有効化した、S3アクセスログ設定のCDKコードを以下に記載します。
 lib配下のstack.tsにこのコードを記載します。

sample-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Bucket, PartitionDateSource, TargetObjectKeyFormat } from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';

export class AccesslogPartitionStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // アクセスログバケット名
    const accessLogBucketName: string = "bucket-for-accesslog-test";

    // アクセスログを有効化するバケット
    const bucketName: string = "bucket-for-partition-test";

    // アクセスログを保存するバケット
    const accessLogBucket: Bucket = new Bucket(this, accessLogBucketName, {
      bucketName: accessLogBucketName,
    });

    // アクセスログを有効化するバケット
    const bucket: Bucket = new Bucket(this, bucketName, {
      bucketName: bucketName,
      serverAccessLogsBucket: accessLogBucket,
      // 日付ベースのパーティションを有効化する際は、partitionedPrefixにPartitionDateSource.EVENT_TIMEを指定
      targetObjectKeyFormat: TargetObjectKeyFormat.partitionedPrefix(PartitionDateSource.EVENT_TIME),
    });
  }
}

日付ベースのパーティションを有効化する際は、アクセスログ有効化対象バケットのtargetObjectKeyFormatプロパティに以下の値を指定します。

TargetObjectKeyFormat.partitionedPrefix(PartitionDateSource.EVENT_TIME)

デプロイ

カレントディレクトリを作業ディレクトリにした状態で以下のコマンドを実行します。

$ cdk deploy

動作確認

cdk deploy後、アクセスログを有効化したバケットのアクセスログ設定を確認すると、ログオブジェクトキー形式が以下になっています。
この形式になっていれば、日付ベースでパーティションが分割されています。
 [SourceAccountId]/​[SourceRegion]/​[SourceBucket]/​[YYYY]/​[MM]/​[DD]/​[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
image.png

アクセスログを見ると、日付フォルダ毎にアクセスログが保存されています。
image.png

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0