オブジェクトロックで保護されたS3バケットをCDKで構築する

オブジェクトロック機能で保護されたS3バケットをCDKを使って構築するサンプルです。
2021.06.08

現在、自分はProfllyというコミュニケーションハブサービスの開発を行っています。

その中で、以下のような要件のリソースを構築する必要がありました。

  • とあるファイルを保管するS3バケット
  • バケットに保管されたファイルの閲覧やAthenaでのデータクエリはしたいが、(一定期間)ファイルの更新・削除は不可としたい

この要件だとS3のオブジェクトロック機能が使うのが良さげだったので、今回はそちらを適用して対象のS3バケットを作成することにしました。

このエントリでは、オブジェクトロックで保護されたS3バケットをAWS CDKを利用して構築するサンプルをご紹介します。

なお、今回作成したサンプルはGitHubに公開しています。
amotz/object-locked-s3-cdk-sample

S3 オブジェクトロックとは

S3 オブジェクトロックは、いわゆるWrite Once Read Many (WORM) モデルを使用してオブジェクトを保存できる機能です。
S3バケットに保管されたオブジェクトに対し、オブジェクトの上書きや削除を一定期間or無期限に防止することができます。

【AWS公式ドキュメント】S3 オブジェクトロックの使用

ユースケースとしては、間違って削除されたくないファイルや改ざんを防止したいファイルの保護などが考えられます。

CDKを使ってオブジェクトロックで保護されたS3バケットを構築

それでは、早速CDKを利用してオブジェクトロックで保護されたS3バケットを構築していきます。
今回は、サンプルとして以下の条件でオブジェクトロックを適用します。

  • リテンションモード: ガバナンスモード
  • 保持期間: 1日

リテンションモードをコンプライアンスモードにした場合、対象のオブジェクトは保持期間中(rootユーザーであっても)削除できなくなります。デプロイ前にCDKのコードレビューや十分な内容確認をオススメします。

参考:S3 オブジェクトロックの仕組み:リテンションモード

検証環境

  • AWS CDK 1.103.0
  • TypeScript 3.9.7

CDKのソースコード

実際のCDKのソースコードは以下のようになりました。

lib/object-locked-s3-cdk-sample-stack.ts

import * as cdk from '@aws-cdk/core';
import * as s3 from "@aws-cdk/aws-s3";
export class ObjectLockedS3CdkSampleStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucketName = "sample-object-locked-bucket-xxxxxxxxxxx"
    new s3.CfnBucket(this, "sampleObjectLockedBucket", {
      bucketName: bucketName,
      bucketEncryption: {
        serverSideEncryptionConfiguration: [
          {
            serverSideEncryptionByDefault: {
              sseAlgorithm: "AES256"
            }
          }
        ]
      },
      versioningConfiguration: {
        status: "Enabled"
      },
      objectLockEnabled: true,
      objectLockConfiguration: {
        objectLockEnabled: "Enabled",
        rule: {
          defaultRetention: {
            mode: "GOVERNANCE",
            days: 1
          }
        }
      }
    });
  }
}

CDKでは、s3.bucketを利用してバケットを作成するケースが多いのではと思いますが、オブジェクトロック周りの設定は 2021/6/8 現在 High Level Constructでは提供されていないため、Low Level Constructである s3.cfnBucketを利用して実装しています。

また、 objectLockEnabledプロパティと objectLockConfiguration.objectLockEnabled プロパティの型が微妙に違うのも若干のハマリポイントでした。。

デプロイ

コードが書けたので、CDKをデプロイしてみましょう。

$ cdk deploy

デプロイ完了後にマネジメントコンソールを確認すると、無事にオブジェクトロックが適用されたS3バケットが作成されています。

おわりに

CDKを使ってオブジェクトロックで保護されたS3バケットを構築する機会があったので、サンプルとしてブログを書きました。
CDKやCloudFormationを使って一発で構築できるのは便利ですが、S3のオブジェクトロックに関しては、思わぬ長期間の保持期間を設定したままバケットを作成してしまうなどの事故が起こりかねないので、デプロイ前に設定やソースコードを入念に確認しておきたいところです。

どなたかの参考になれば幸いです。

参考

S3 オブジェクトロックをガバナンスモードで利用するときの権限について調べてみた

[小ネタ]S3オブジェクトロックを誤って設定したらどうなるのか?

AWS CDK の3種類の Construct を使ってデプロイしてみた