

# S3 Object Lock を使用したオブジェクトのロック
<a name="object-lock"></a>

S3 オブジェクトロックは、Amazon S3 オブジェクトが一定期間または無期限に削除または上書きされるのを防ぐのに役立ちます。オブジェクトロックは、*write-once-read-many* (WORM) モデルを使用してオブジェクトを保存します。Object Lock を使用して、WORM ストレージを必要とする規制要件を満たしたり、オブジェクトの変更や削除に対する保護レイヤーを追加したりできます。

**注記**  
S3 オブジェクトロックは、SEC 17a-4、CFTC、および FINRA の各規制に従った環境での使用について、Cohasset Associates によって評価済みです。オブジェクトロックとこのような規制との関連性の詳細については、「[Cohasset Associates Compliance Assessment](https://d1.awsstatic.com/r2018/b/S3-Object-Lock/Amazon-S3-Compliance-Assessment.pdf)」を参照してください。

オブジェクトロックは、オブジェクトリテンションの管理をするための 2 つの方法、*保持期間*および*リーガルホールド*を提供します。オブジェクトバージョンには、保持期間とリーガルホールド、またはその両方を含めることができます。
+ **保持期間** – オブジェクトバージョンがロックされたままである一定期間を指定します。個々のオブジェクトに固有の保持期間を設定できます。また、S3 バケットにデフォルトの保持期間を設定できます。バケットポリシーの `s3:object-lock-remaining-retention-days` 条件キーを使用して、許容される最小保持期間と最大保持期間を制限することもできます。この条件キーは、許容可能な保持期間を確立するのに役立ちます。詳細については、「[バケットポリシーを使用する保持期間の制限の設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-managing-retention-limits)」を参照してください。
+ **リーガルホールド** – リーガルホールドは、保持期間と同じ保護を提供します。ただし、有効期限はありません。代わりに、明示的に削除するまで、リーガルホールドは維持されます。リーガルホールドは、保持期間から独立しており、個々のオブジェクトバージョンに付与されます。

オブジェクトロックは S3 バージョニングが有効になっているバケットでのみ機能します。オブジェクトバージョンをロックすると、Amazon S3 はそのオブジェクトバージョンのメタデータにロック情報を保存します。オブジェクトに保持期間またはリーガルホールドを設定すると、リクエストで指定されたバージョンのみが保護されます。保持期間とリーガルホールドを使用しても、オブジェクトの新しいバージョンの作成が阻止されたり、オブジェクトの上に追加されるマーカーが削除されたりすることはありません。S3 バージョニングの詳細については、「[S3 バージョニングによる複数のバージョンのオブジェクトの保持](Versioning.md)」を参照してください。

同じオブジェクトキー名を持つ既存の保護対象オブジェクトが既に含まれているバケットにオブジェクトを配置すると、Amazon S3 はそのオブジェクトの新しいバージョンを作成します。オブジェクトの既存の保護バージョンは、その保持設定に従ってロックされたままになります。

## S3 オブジェクトロックの仕組み
<a name="object-lock-overview"></a>

**Topics**
+ [保持期間](#object-lock-retention-periods)
+ [リテンションモード](#object-lock-retention-modes)
+ [リーガルホールド](#object-lock-legal-holds)
+ [S3 Object Lock における削除の仕組み](#object-lock-how-deletes-work)
+ [S3 Object Lock を使用するためのベストプラクティス](#object-lock-best-practices)
+ [必要なアクセス許可](#object-lock-permissions)

### 保持期間
<a name="object-lock-retention-periods"></a>

*保持期間*は、一定期間オブジェクトバージョンを保護します。オブジェクトバージョンに保持期間を設定すると、Amazon S3 はオブジェクトバージョンのメタデータにタイムスタンプを保存して、保持期間の有効期限を示します。保持期間が終了すると、オブジェクトバージョンを上書きまたは削除することができます。

個々のオブジェクトバージョンまたはバケットのプロパティに明示的に保存期間を設定して、バケット内のすべてのオブジェクトに自動的に適用されるようにすることができます。オブジェクトバージョンに保持期間を明示的に適用する場合は、オブジェクトバージョンに対して [*リテンション期日*] を指定します。Amazon S3 はこの日付をオブジェクトバージョンのメタデータにを保存します。

バケットのプロパティに保持期間を設定することもできます。バケットに保持期間を設定する場合、バケット内に配置されたすべてのオブジェクトバージョンを保護する期間を日数または年単位で指定します。バケットにオブジェクトを配置すると、Amazon S3 は、オブジェクトバージョンの作成タイムスタンプに指定された期間を追加してオブジェクトバージョンの**保持期日を算出します。これにより、オブジェクトバージョンは、オブジェクトバージョンにその保持期間のロックを明示的に配置した場合と同様に保護されます。

**注記**  
個別の保存モードと期間が明示的に設定されているオブジェクトバージョンをバケット内に `PUT` すると、オブジェクトバージョンの個々のオブジェクトロック設定が、バケットプロパティの保存設定よりも優先されます。

他のすべての オブジェクトロック設定と同様に、保持期間は個々のオブジェクトバージョンに適用されます。単一のオブジェクトのバージョンが異なれば、リテンションモードや期間も異なる可能性があります。

たとえば、30 日間の保持期間に 15 日のオブジェクトがあり、同じ名前と 60 日間の保持期間を持つオブジェクトを Amazon S3 に `PUT` するとします。この場合、`PUT` は正常に実行され、Amazon S3 は保持期間が 60 日の新しいバージョンを作成します。古いバージョンは元の保持期間を維持し、15 日後に削除可能になります。

保持設定をオブジェクトバージョンに適用した後、保持期間を延長することができます。これを行うには、現在設定されているオブジェクトバージョンよりも後の**保持期間を持つオブジェクトバージョンの新しいオブジェクトロックリクエストを送信します。Amazon S3 は、既存の保持期間を新しい、より長い期間に置き換えます。オブジェクトの保持期間を設定するアクセス許可を持つユーザーは、オブジェクトバージョンの保持期間を延長できます。保持期間を設定するには、`s3:PutObjectRetention` アクセス許可が必要です。

オブジェクトまたは S3 バケットに保持期間を設定する場合、****コンプライアンスまたはガバナンスの 2 つの保持モードのいずれかを選択する必要があります。

### リテンションモード
<a name="object-lock-retention-modes"></a>

S3 オブジェクトロックでは、オブジェクトに異なるレベルの保護を適用する次の 2 つの保持モードが提供されています。
+ コンプライアンスモード
+ ガバナンスモード

*コンプライアンス*モードでは、AWS アカウント の root ユーザーを含め、ユーザーが、保護されたオブジェクトのバージョンを上書きまたは削除することはできません。コンプライアンスモードでオブジェクトをロックすると、そのリテンションモードを変更することはできず、保持期間を短縮することはできません。コンプライアンスモードでは、保持期間中にオブジェクトのバージョンを上書きまたは削除できないようにします。

**注記**  
保持期限が切れる前にコンプライアンスモードのオブジェクトを削除する唯一の方法は、関連する AWS アカウント を削除することです。

*ガバナンス*モードでは、特別なアクセス許可を持たない限り、ユーザーはオブジェクトのバージョンの上書きや削除、ロック設定を変更することはできません。ガバナンスモードでは、ほとんどのユーザーがオブジェクトを削除できないように保護できます。ただし必要に応じて、一部のユーザーに保持設定を変更したり、オブジェクトを削除したりするアクセス許可を付与することもできます。ガバナンスモードを使用して、コンプライアンスモードの保持期間を作成する前に、保持期間の設定をテストすることもできます。

ガバナンスモードのリテンション設定を上書きまたは削除するには、ユーザーは `s3:BypassGovernanceRetention` アクセス許可を持っている必要があり、また、ガバナンスモードの上書きを必要とするリクエストで、`x-amz-bypass-governance-retention:true` をリクエストヘッダーとして明示的に含める必要があります。

**注記**  
Amazon S3 コンソールにはデフォルトで、`x-amz-bypass-governance-retention:true` ヘッダーが含まれています。**ガバナンスモードで保護されているオブジェクトを削除する場合、`s3:BypassGovernanceRetention` アクセス許可があれば、そのオペレーションは正常に完了します。

### リーガルホールド
<a name="object-lock-legal-holds"></a>

オブジェクトロックを使用すると、オブジェクトバージョンに**リーガルホールドを設定することもできます。保持期間と同様に、リーガルホールドは、オブジェクトバージョンが上書きまたは削除されるのを防ぎます。ただし、リーガルホールドには関連する保持期間はなく、削除するまで有効です。リーガルホールドは、`s3:PutObjectLegalHold` アクセス許可を持つ任意のユーザーが自由に適用および解除できます。

リーガルホールドは、保持期間から独立しています。オブジェクトバージョンをリーガルホールドしても、そのオブジェクトバージョンのリテンションモードや保持期間には影響しません。

例えば、オブジェクトバージョンをリーガルホールドして、オブジェクトバージョンも保持期間で保護するとします。保持期間が終了すると、オブジェクトは WORM 保護を失いません。むしろ、リーガルホールドでは、許可されたユーザーが明示的に解除するまでオブジェクトの保護が継続されます。同様に、オブジェクトバージョンに有効な保持期間がある間にリーガルホールドを解除すると、保護期間が終了するまでオブジェクトバージョンは保護されたままになります。

### S3 Object Lock における削除の仕組み
<a name="object-lock-how-deletes-work"></a>

バケットで S3 Object Lock が有効になっていて、オブジェクトが保持期間またはリーガルホールドによって保護されている場合、オブジェクトを削除しようとすると、Amazon S3 はオブジェクトの削除方法に応じて次のいずれかのレスポンスを返します。
+ **永続的 `DELETE` なリクエスト** – 永続的な `DELETE` リクエスト (バージョン ID を指定するリクエスト) を発行した場合、オブジェクトを削除しようとすると、Amazon S3 はアクセス拒否 (`403 Forbidden`) エラーを返します。Object Lock におけるアクセス拒否エラーのトラブルシューティングの詳細については、「[S3 オブジェクトロック設定](troubleshoot-403-errors.md#troubleshoot-403-object-lock)」を参照してください。
+ **シンプルな `DELETE` リクエスト** – シンプルな `DELETE` リクエスト (バージョン ID を指定しないリクエスト) を発行した場合、Amazon S3 は `200 OK` レスポンスを返し、バケットに[削除マーカー](DeleteMarker.md)を挿入します。そのマーカーは、新しい ID を持つオブジェクトの最新バージョンになります。Object Lock による削除マーカーの管理の詳細については、「[Object Lock による削除マーカーの管理](object-lock-managing.md#object-lock-managing-delete-markers)」を参照してください。

### S3 Object Lock を使用するためのベストプラクティス
<a name="object-lock-best-practices"></a>

事前定義された保持期間中にほとんどのユーザーがオブジェクトを削除しないようにするが、同時に特別なアクセス許可を持つ一部のユーザーに保持設定を変更したり、オブジェクトを削除したりできる柔軟性を持たせたい場合は、「ガバナンスモード」の使用を検討してください。**

AWS アカウント のルートユーザーを含むユーザーが、事前定義された保持期間中にオブジェクトを削除できないようにしたい場合は、「コンプライアンスモード」の使用を検討してください。**このモードは、準拠したデータを保存する必要がある場合に使用できます。

「リーガルホールド」は、オブジェクトを変更不可能な状態に保つ期間が不明な場合に使用できます。**これを使用する理由として、データの外部監査が今後予定されていて監査が完了するまでオブジェクトを変更不可能な状態に保ちたい、といったことが考えられます。または、進行中のプロジェクトがあり、プロジェクトが完了するまで変更不可能な状態を保ちたいデータセットを使用している場合もあります。

### 必要なアクセス許可
<a name="object-lock-permissions"></a>

オブジェクトロックオペレーションにはアクセス許可が必要です。実行しようとする個別のオペレーションによっては、次の許可のいずれかが必要になる場合があります。
+ `s3:BypassGovernanceRetention`
+ `s3:GetBucketObjectLockConfiguration`
+ `s3:GetObjectLegalHold`
+ `s3:GetObjectRetention`
+ `s3:PutBucketObjectLockConfiguration`
+ `s3:PutObjectLegalHold`
+ `s3:PutObjectRetention`

Amazon S3 のアクセス許可の説明付きの完全なリストについては、「サービス認可リファレンス」の「[Amazon S3 のアクション、リソース、および条件キー](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)」を参照してください。**

S3 リソースタイプ別の S3 API オペレーションへのアクセス許可の詳細については、「[Amazon S3 API オペレーションに必要なアクセス許可](using-with-s3-policy-actions.md)」を参照してください。

アクセス許可で条件を使用する方法の詳細については、「[条件キーを使用したバケットポリシーの例](amazon-s3-policy-keys.md)」を参照してください。