はじめに
あるチームは一時エクスポートを 90 日間保持しますが、同じバケットの永久保存用の記録は、そのポリシーの範囲外に置く必要があります。範囲を限定したライフサイクルルールを設定して確認し、練習用リソースを削除します。
最初に キーとメタデータで文書を整理する を完了し、プレフィックス、プロパティ、ダウンロード、削除について学んでください。この新しい VM には、CLI 接続、バケット、エクスポート、永久保存用の記録が準備済みです。Terminal と隣の AWS View タブを使ってください。将来の経過日数に基づく処理を待つのではなく、保存された設定を確認します。
認定試験との関連
このラボでは、次の試験トピックに関連する実践的な演習を行います。
- Cloud Practitioner (CLF-C02) · タスク 3.6: S3 ストレージクラスと範囲を限定したライフサイクル設定。
- Solutions Architect – Associate (SAA-C03) · タスク 4.1: S3 ストレージクラスと範囲を限定したライフサイクル設定。
- Developer – Associate (DVA-C02) · タスク 1.3: S3 ストレージクラスと範囲を限定したライフサイクル設定。
- CloudOps Engineer – Associate (SOA-C03) · タスク 1.3: S3 ストレージクラスと範囲を限定したライフサイクル設定。
- Security – Specialty (SCS-C03) · タスク 5.2: 基礎演習:S3 ストレージクラスと範囲を限定したライフサイクル設定。
- Data Engineer – Associate (DEA-C01) · タスク 2.3: 基礎演習:S3 ストレージクラスと範囲を限定したライフサイクル設定。
一時データと永久保存用データを確認する
このステップでは、ポリシーの意図した範囲を特定し、除外すべき永久保存用の記録を確認します。
ライフサイクルルールは、どのオブジェクトを管理し、時間の経過に応じて何を行うかを指定します。移行(transition)はストレージクラスを変更し、有効期限による削除(expiration)は条件を満たす保存済みオブジェクトを削除します。どちらもローカルファイルは変更しません。まず、このルールに含めるべき保存済みキーを特定します。
ディレクトリを変更する cd で、作業ディレクトリに移動します。
cd /home/labex/project
プレフィックスを含む完全なオブジェクトキーが見えるよう、準備済みバケットを再帰的に一覧表示します。
aws s3 ls s3://labex-export-retention/ --recursive
キーは二つあります。exports/monthly.csv と records/retention-policy.txt です。エクスポートは 128 KB より大きく、永久保存用の記録は小さなテキストファイルです。プレフィックスはオブジェクトキーの先頭部分であり、実際のディレクトリではありません。exports/ にフィルターしたルールはエクスポートに一致しますが、records/retention-policy.txt は除外します。
cp で永久保存用の記録をダウンロードし、cat でバイト列を確認します。
aws s3 cp s3://labex-export-retention/records/retention-policy.txt permanent-record.txt
cat permanent-record.txt
Permanent record: retain until approved removal.
AWS View で records/retention-policy.txt を展開し、同じ保存済みテキストを確認します。ルールの設定後、この記録を比較します。ライフサイクルポリシーによって、同じバケットにあるという理由だけで、無関係なデータを誤って期限切れ削除してはいけません。
範囲を限定したライフサイクルルールを記述して適用する
このステップでは、チームの保持要件を表す一つのライフサイクルルールを保存します。
S3 Standard は、頻繁にアクセスするデータのデフォルトクラスです。S3 Standard-IA(低頻度アクセス)は、即時の取得を維持しますが、取得に料金がかかり、最低保存期間は 30 日です。ここではエクスポートへのアクセス頻度が 30 日後に低下し、90 日目まで保持するため、Standard-IA に 60 日間置かれます。デフォルトのライフサイクル動作では、128 KB 未満のオブジェクトは移行されません。準備済みのエクスポートは、そのしきい値より大きいものです。これらは選択時の考慮事項であり、特定の節約額を約束するものではありません。
90 日での有効期限による削除は、使い捨てのエクスポートには適していますが、永久保存用の記録には適しません。このバケットではバージョニングが無効であるため、有効期限によって条件を満たすオブジェクトを永久に削除できます。バージョン付きバケットでは、現在版の有効期限と非現行バージョンの削除は異なる効果があり、処理を別々に検討する必要があります。
模式図:ルールは exports/ に適用されます。日数のしきい値は対象となる条件を表し、正確な時刻での実行を保証するものではありません。

JSON は、オブジェクト({})、配列([])、引用符で囲んだフィールド名、文字列、数値の日数を使って設定を表します。Rules 配列は、バケットの完全なポリシーを保持します。ID はルール名、Status は有効化、Filter.Prefix は範囲の制限に使います。Transitions と Expiration は二つの処理を指定します。
シェルの cat > lifecycle.json <<'JSON' は、最後の JSON までの行をファイルに書き込みます。これはヒアドキュメントです。引用符で囲んだ区切り文字によって、内容をそのまま扱います。最後の区切り文字も含め、ブロック全体をコピーしてください。
cat > lifecycle.json <<'JSON'
{
"Rules": [
{
"ID": "temporary-export-retention",
"Status": "Enabled",
"Filter": {"Prefix": "exports/"},
"Transitions": [{"Days": 30, "StorageClass": "STANDARD_IA"}],
"Expiration": {"Days": 90}
}
]
}
JSON
適用する前に、ファイルを確認します。
cat lifecycle.json
プレフィックスが、末尾のスラッシュを含む exports/ であることを確認してください。空のプレフィックスは、永久保存用の記録を含め、バケットのすべてのオブジェクトを対象にします。
aws s3api は個々の S3 API 操作を提供します。put-bucket-lifecycle-configuration は設定を書き込み、--bucket はバケットを選びます。file://lifecycle.json は、CLI が JSON 引数をローカルファイルから読み取るよう指定します。この操作はバケットのライフサイクル設定全体を置き換えます。既存の設定を更新するときは、保持したいルールをすべて含めてください。この演習は設定がない状態から始まります。
aws s3api put-bucket-lifecycle-configuration --bucket labex-export-retention --lifecycle-configuration file://lifecycle.json
成功したコマンドは応答本文を表示しません。次に、ローカルファイルだけに頼らず、サービスが実際に保存したものを確認します。
保存されたポリシーと影響を受けない記録を確認する
このステップでは、S3 からポリシーを読み取り、新しいデータと除外した永久保存用の記録の両方に引き続きアクセスできることを確認します。
バケットのライフサイクル設定を取得します。
aws s3api get-bucket-lifecycle-configuration --bucket labex-export-retention
応答の Rules 配列には、プレフィックス exports/、30 日で STANDARD_IA への移行、90 日での期限切れ削除を持つ Enabled のルールが一つ含まれます。サービスが追加の応答フィールドを含める場合があります。ルールのフィールドと要件を比較してください。この応答は正式な設定の証拠です。ローカルの JSON ファイルだけでは、ルールが適用されたことは示せません。
AWS View は、オブジェクトの上に同じ保存済みルールを表示します。しきい値は将来のものなので、移行や削除が完了したとは表示しません。

この例は、保存された設定と現在の記録のバイト列を示します。経過日数に基づく処理が完了した状態ではありません。
head-object は、本文をダウンロードせずにオブジェクトのプロパティを読み取ります。新しく作成されたエクスポートを確認します。
aws s3api head-object --bucket labex-export-retention --key exports/monthly.csv
ContentLength は 131072 バイトより大きい値です。現在は Standard のままで、このデフォルトクラスでは StorageClass フィールドが省略される場合があります。ルールを有効にしただけでは、新しいオブジェクトのストレージクラスが即座に書き換わるわけではありません。予定された処理は、対象条件を満たした後に非同期で行われます。このコマンドを実行した時点からのストップウォッチ式のカウントダウンではありません。
除外した永久保存用の記録をもう一度ダウンロードします。
aws s3 cp s3://labex-export-retention/records/retention-policy.txt permanent-record-after.txt
cmp はファイルをバイト単位で比較します。&& は、比較が成功した場合だけメッセージを表示します。
cmp permanent-record.txt permanent-record-after.txt && echo 'Permanent record unchanged'
メッセージは内容が保持されていることを示します。バケットには両方のキーがまだ表示されます。
aws s3 ls s3://labex-export-retention/ --recursive
保存されたプレフィックスによって、永久保存用の記録がこのルールの範囲外であることを確認できます。現在も存在することは、ポリシーの設定中に誤って削除や上書きをしなかったことも示しますが、それだけでは将来のスケジューラーの動作を証明できません。
ポリシーと演習用リソースを削除する
このステップでは、保存されたポリシーを削除してから、将来の期限切れを待たずに実験用オブジェクトとバケットを削除します。
ライフサイクル設定を削除すると、そのポリシーによるバケットの管理が停止します。それ自体がオブジェクトを削除するわけではありません。個別の API 操作でポリシーを削除します。
aws s3api delete-bucket-lifecycle --bucket labex-export-retention
設定がなくなったことを確認します。
aws s3api get-bucket-lifecycle-configuration --bucket labex-export-retention
このコマンドは NoSuchLifecycleConfiguration で失敗する想定です。バケットはまだ存在しますが、ライフサイクルポリシーはありません。AWS View はルールの概要を削除し、両方のオブジェクトを表示し続けます。
永久保存用の記録は、自動的な期限切れ削除から除外されていました。今度はこの使い捨ての演習の削除作業として、正確なキーで意図的に削除します。まず、一時エクスポートを削除します。
aws s3 rm s3://labex-export-retention/exports/monthly.csv
aws s3 rm s3://labex-export-retention/records/retention-policy.txt
正常な一覧表示にオブジェクトの行が含まれないことを確認します。
aws s3 ls s3://labex-export-retention/ --recursive
rb で空のバケットを削除し、ストレージが引き続き応答することを確認します。
aws s3 rb s3://labex-export-retention
aws s3 ls
remove_bucket のメッセージには、この演習のバケット名が表示されます。最後の一覧にはバケットがなく、AWS View は No buckets を表示します。ローカルのポリシーと記録のコピーは確認用に残っています。将来の保持ポリシーを設定し、練習用リソースを明示的に削除しました。これらは別の操作です。
まとめ
一時データの要件を範囲の狭い S3 ライフサイクルルールに置き換え、アクセスと最低保存期間を考慮してストレージクラスを選び、有効期限を設定しました。S3 からルールを読み取り、永久保存用の記録がプレフィックスの範囲外にあり、変更されていないことを確認しました。
設定の証拠と、将来予定された実行は異なります。最後に、経過日数に基づく処理を待たずにポリシーを削除し、実験用ストレージリソースを明示的に削除しました。



