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

# はじめに
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プロジェクトを作成します。
``` sh
$ 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)
```

# デプロイ
カレントディレクトリを作業ディレクトリにした状態で以下のコマンドを実行します。
``` sh
$ cdk deploy
```


# 動作確認
cdk deploy後、アクセスログを有効化したバケットのアクセスログ設定を確認すると、ログオブジェクトキー形式が以下になっています。
この形式になっていれば、日付ベースでパーティションが分割されています。
　[SourceAccountId]/​[SourceRegion]/​[SourceBucket]/​[YYYY]/​[MM]/​[DD]/​[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/353fa610-1dc1-7609-756a-2d0199012717.png)

アクセスログを見ると、日付フォルダ毎にアクセスログが保存されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485934/7f11e169-e961-a25e-9ea2-b0d0104152c9.png)


# 参考記事
https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-s3-server-access-logging-date-partitioning/

https://dev.classmethod.jp/articles/s3-access-log-date-partitioning/