はじめに
データベースは慎重に設計するのに、S3はデフォルトの設定に任せていませんか。
ただのログファイルだったり、ドキュメント管理程度に使用しているなら全く問題ないですが、システムに組み込まれた重要なバケットであるにも関わらず何も意識せず実装していたということが私自身ありました。
今回はS3を守るために設定したい二つの機能と、それをCDKで実装する方法について調査した内容をまとめました。
バックアップの機能を果たす「バージョニング」
S3のバージョニング機能を用いると、オブジェクトに自動的にバージョンを付与してくれます。
これによって万が一オブジェクトを削除してしまってもバージョンを指定して復元することができるようです。
詳しくはこちら
【図解あり】Amazon S3バージョニング機能を用いる理由
CDKで実装
import { RemovalPolicy } from 'aws-cdk-lib';
new s3.Bucket(scope, 'Bucket', {
// ...省略
versioned: true, // バージョニングを有効化
});
S3オブジェクトを守る「オブジェクトロック」
S3オブジェクトロックを用いると、バケット内のオブジェクトを上書きしたり削除したりする操作を不可能にすることができます。このロックを突破する条件は設定するモードによって選ぶことができます。
リテンションモード
ロックする期限を設けて、期限が来ると解除されます。
リテンションモードはさらに「ガバナンスモード」と「コンプライアンスモード」という二つのモードに分けられます。
ガバナンスモードでは特別な権限を持つロールを使用すればロックを突破できます。
コンプライアンスモードではいかなる権限を持っていてもロックを解除できず、期限が来るのを待つしかありません。
リーガルホールド
無期限でロックされます。
ロックを突破するには特別な権限が必要です。
こちらを参考
AWS S3のオブジェクトロックの機能
CDKで実装
複数のモードがあるということでしたが、リーガルホールドは公式のCDKドキュメントで見つからなかったのでガバナンスモードのやり方のみ掲載します。(リーガルホールドもし見つけたら教えてください。)
// ガバナンスモード
new s3.Bucket(this, 'Bucket1', {
objectLockDefaultRetention: s3.ObjectLockRetention.governance(Duration.days(7 * 365)),
// 有効期限は7年
});
// コンプライアンスモード
new s3.Bucket(this, 'Bucket2', {
objectLockDefaultRetention: s3.ObjectLockRetention.compliance(Duration.days(365)),
// 有効期限は1年
});
結論
「そんなこと言わせてごめんね」