S3 バッチオペレーションを用いて既存の S3 オブジェクトをロックしてみた

2024.05.17

こんにちは!アノテーションの砂川です。

去年、既存 S3 バケットに対してオブジェクトロックを有効化できるようになるアップデートがありました。 詳細は以下をご覧ください。

一方で、オブジェクトロックの対象となるオブジェクトは、ロック有効化後にアップロードしたオブジェクトのみとなっており、既存の既に保存されているオブジェクトには別途手動でロックを適用する必要がありました。

なので、今回は S3 バッチオペレーションを用いて、既存のオブジェクトに対してオブジェクトロックを適用する方法をレポートします。

やってみた

環境準備

以下画像のように S3 バケット(バージョニング有効, オブジェクトロック無効)を作成し、オブジェクトを 3 つアップロードしておきます。

上記オブジェクトのアップロード後、S3 バケットのオブジェクトロックを有効化します。

バケットレベルでオブジェクトロックを有効化しても、既存のオブジェクト(test1.txt, test2.txt, test3.txt)では、以下のようにオブジェクトロックが適用されていません。

S3 バッチオペレーションで利用するマニフェストファイルの作成

S3 バッチオペレーションで、既存のオブジェクトにオブジェクトロックを適用していきます。

バッチオペレーションでは対象とするオブジェクトをマニフェストファイルで記述する必要があります。
そのため、今回は以下のように manifest.csv を作成しておきます。

manifest.csv の中身

sunagawa-s3-object-lock-test,test1.txt
sunagawa-s3-object-lock-test,test2.txt
sunagawa-s3-object-lock-test,test3.txt

上記のマニフェストファイル作成では、既存のオブジェクト一覧を取得するため、以下コマンドを利用しています。

$ aws s3 ls s3://sunagawa-s3-object-lock-test --recursive | awk '{print $4}' | awk '{ if(!/\/$/) {print "sunagawa-s3-object-lock-test," $0}}' > manifest.csv

※本コマンドは、S3 オブジェクトロックとリーガルホールドの機能のおさらいとそれらの設定方法 のものを使用させていただきました。

作成した manifest.csv を適当なバケットにアップロードします。今回は、新しく作成したバケット sunagawa-inventory-report-bucket にアップロードしておきます。

S3 バッチオペレーションの実行

コンソール左ペインのバッチオペレーションの項目を選択し、ジョブの作成 を行います。 マニフェスト選択画面にて、形式を CSV とし、先ほどアップロードした manifest.csvのパスを指定します。

続いて、オペレーションで「オブジェクトロックの保持」を選択し、保持モードはガバナンスとしておきます。

「追加のオプションを設定」の画面にて、完了レポートの生成にチェックを入れ、送信先バケットのパスを設定します。

アクセス許可設定の項目にて、S3 Batch Operations サービス プリンシパルに付与する IAM ロールを指定します。
今回は事前に適切な権限を持つ IAM ロールを作成しておき、それを使用しました。ポリシーの中身については公式ドキュメントまたは、下記画像のように設定画面の中でも例が記載されているので、そちらをお使いください。

自分は今回以下のように設定しました。

信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "batchoperations.s3.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

許可ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketObjectLockConfiguration"
            ],
            "Resource": "arn:aws:s3:::sunagawa-s3-object-lock-test"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectRetention",
                "s3:BypassGovernanceRetention"
            ],
            "Resource": "arn:aws:s3:::sunagawa-s3-object-lock-test/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::sunagawa-inventory-report-bucket/manifest.csv"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::sunagawa-inventory-report-bucket/*"
            ]
        }
    ]
}

ここまでできたら、S3 バッチオペレーションの確認画面で設定ミスがないかチェックしジョブを作成します。 作成したら、以下の様にバッチオペレーションの画面に表示されます。

作成されたジョブを選択して、「ジョブを実行」します。 実行後、数十秒程度で以下の様にステータスが「完了済み」になりました。

バケット sunagawa-s3-object-lock-test の中身の3つのファイル(test1.txt, test2.txt, test3.txt)を確認してみると、以下のようにガバナンスモードでオブジェクトロックが適用されていました。

まとめ

今回は、S3 バッチオペレーションを用いて、既存オブジェクトに対してオブジェクトロックを適用してみました。 S3 バッチオペレーションって何それ美味しいの?くらいの理解度でしたが、今回触ってみてより理解が深まりました!

既存オブジェクトにオブジェクトロックを適用したい方がいればぜひ今回紹介した手順をお試しいただければと思います。

本記事がどなたかの参考になれば幸いです。
最後までお読みいただきありがとうございました!

参考文献

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。