オブジェクト・ロック

オブジェクト・ロックは、個々のオブジェクト・バージョンが WORM (Write-Once-Read-Many)、消去不能、再書き込み不能の方法で保管されるようにすることで、電子レコードを保持し、データ保全性を維持します。 このポリシーは、指定された日付まで、または訴訟ホールドが解除されるまで適用されます。

オブジェクト・ロックを使用する理由

Object Lock は、バックアップ、災害復旧、およびサイバー・レジリエンシーのワークロードに対してデータの不変性を適用することで、お客様がデータの保存と保存の要件を管理するのを支援します。

オブジェクト・ロックは、 データが誰にも削除されないようにします。また、 オブジェクトの保存を中断する方法はありません。 保存期間を指定してオブジェクトをロックする前に、資料をよくお読みください。

オブジェクト・ロックを使用する場合、長期保存のためのデータの保存および保管に関して、お客様 (お客様の組織) が影響を受ける可能性のある規制への準拠を保証するのはお客様の責任です。

オブジェクトロックを使用する場合、データが保持期間の対象である限り、 アカウントIBM Cloud アカウントが IBM Cloud のポリシーおよびガイドラインに従い良好な状態を維持されていることを確認する責任はお客様にあります。 詳しくは、IBM Cloud サービスの用語を参照してください。

用語

オブジェクト・ロックを使用してデータを保護するには、 保存期間訴訟ホールドの 2 つの方法があります。

  • 保存期間 は、オブジェクトを変更または削除できない時間フレームを定義します。
  • また、 訴訟ホールド は、オブジェクトが変更されないようにしますが、明示的に持ち上げられるまではその場所に留まります。

これらのパラメーターを任意に組み合わせて使用することができます。オブジェクト・バージョンには、一方または両方を指定することも、どちらも指定しないこともできます。

保存期限日 (保存期間)

オブジェクト・バージョンを一定期間保護する必要がある場合は、変更できない期間を決定する 「保存期限日」 を指定する必要があります。 オブジェクト・バージョンは、この日付が経過した後に削除できます (オブジェクト・バージョンに対する訴訟ホールドがないことを前提とします)。 ガバナンスモードのオブジェクトについては、許可 bypass-governance-retention されたユーザーは保持期限前にオブジェクトバージョンを削除できます。

新規オブジェクトの保存期間は、バケットに設定されたデフォルト値から継承することも、 Retain Until Dateを指定してオブジェクトを書き込むときに明示的に定義することもできます。

バケットのデフォルト設定を使用する場合は、「保存期限日」を指定しません。 代わりに、バケットに配置されるすべてのオブジェクト・バージョンを保護する期間 (日数または年数) を指定します。 オブジェクトをバケットに入れると、オブジェクト書き込みの時刻に指定された期間を加算することによって、オブジェクト・バージョンの「保存期限日」が計算されます。

オブジェクト・バージョンをバケットに入れる要求に明示的な保存モードと Retain Until Date が含まれている場合、それらの設定は、そのオブジェクト・バージョンのバケットのデフォルト設定をオーバーライドします。

他のすべてのオブジェクト・ロック設定と同様に、Retain Until Date は個々のオブジェクト・バージョンに適用されます。 単一オブジェクトの異なるバージョンは、異なる保存モードおよび保存期間を持つことができます。

90 日の保存期間に 60 日のオブジェクトがあり、そのオブジェクトを同じ名前と 2 年の保存期間で上書きするとします。 操作は成功し、2 年の保存期間を持つオブジェクトの新規バージョンが作成されます。 一方、30 日が経過すると、元のバージョンは削除の対象になります。

保存期間の延長

オブジェクトの保存期間を延長するには、単に新しい、より長い保存期間を設定する要求を送信します。 リクエスターに cloud-object-storage.object.put_object_lock_retention アクションと cloud-object-storage.object.put_object_lock_retention_version アクションがあると想定すると、古い値は新しい値で上書きされます。

保持期間の短縮

ガバナンスモードで保護されているオブジェクトについては、権限のあるユーザーは、リクエストに x-amz-bypass-governance-retention ヘッダーを含め、かつ適切な権限(cloud-object-storage.object.bypass_governance_retentioncloud-object-storage.object.put_object_lock_retention および cloud-object-storage.object.put_object_lock_retention_version)を持っている場合に限り、保持期間をより早い日付に短縮できます。

コンプライアンスモードのオブジェクトは、保持期限が満了する前に保持期間を短縮または削除することはできません。

オブジェクトロックの始め方

開始するには、いくつかの前提条件があります。

  • バケットに対する Writer または Manager のプラットフォーム役割、または適切なアクション ( cloud-object-storage.bucket.put_object_lock_configuration など) が割り当てられたカスタム役割が必要になります。
  • オブジェクト・バージョン管理を有効にする必要があります
  • 標準料金プランを使用する必要があります。詳しくは、 料金 を参照してください。
  • オブジェクト・ロックがサポートされている領域を選択する必要があります。詳しくは、 Integrated Services を参照してください。
  • デフォルトの最大保存期間である 100 年 (または 36500 日) がサポートされます。
  • コンソールを使用する場合は、日または年に加えて、「保存期限 (Retain Until Date)」を月単位で設定することもできます。

コンプライアンスモードでは、オブジェクトの保持期間を短縮することはできません。 ガバナンスモードでは、 BypassGovernanceRetention 権限を持つ承認ユーザーは、必要に応じて保持期間を短縮または削除できます。 検証テストでは、より短いデフォルトの保持期間(例:1日)を使用し、必要に応じて調整することを推奨します。

オブジェクト・ロックで使用する新規バケットの作成とセットアップ

  1. 目的の Object Storage インスタンスにナビゲートし、 バケットのカスタマイズ・オプション を指定して 「バケットの作成 (Create Bucket)」 を使用します。
  2. ユース・ケースの要件ごとに、必要なバケット構成の詳細を入力します
  3. 「オブジェクト・バージョン管理」 セクションに移動し、 「有効」 に設定します。
  4. 「不変性」 を探し、「オブジェクト・ロック」の下で 「追加」 をクリックします。
  5. オブジェクト・ロックを 「有効」 に設定
  6. オプションで、デフォルトの保存期間を設定します。
  7. 「保存」をクリックします
  8. 残りの構成設定に進み、 「バケットの作成 (Create bucket)」 をクリックします。

既存のバケットに対するオブジェクト・ロックの有効化:

バケットは、以下のようにオブジェクト・ロック用に設定できます。

  1. バケットの 「構成」 セクションにナビゲートします。
  2. 「オブジェクト・バージョン管理」 をクリックします。
  3. 「オブジェクト・バージョン管理」 セクションで 「編集」 をクリックし、構成オプションを 「有効」 に設定して 「保存」 を選択します。
  4. 「オブジェクト・ロック」 セクションにナビゲートし、 「追加」 をクリックします。
  5. 「オブジェクト・ロック」「有効」 に設定します。
  6. オプションで、デフォルトの保存期間を設定します。
  7. 保存をクリック

オブジェクトへの Retain Until Date または Legal Hold の追加

  1. ターゲット・オブジェクトがあるバケットにナビゲートします。
  2. 「バージョンの表示」 の切り替え
  3. ターゲット・バージョンの詳細に移動します
  4. 保存期間を追加するか、訴訟ホールドをオンに切り替えるか、またはその両方を行います。

事業継続性と災害復旧のためのオブジェクト・ロックの使用

オブジェクト・ロックを使用すると、保護されたデータを変更または破棄できないため、ランサムウェア攻撃が発生した場合にサービスの継続性を提供できます。

整合性とデータ保全性

IBM Cloud Object Storage はすべてのデータIO操作に対して強力な一貫性を提供するが、バケット構成は最終的に一貫性を失う。 バケットのデフォルト保存期間を有効化、変更、または削除した後、構成がシステム全体に伝搬するまでにしばらく時間がかかる場合があります。 オブジェクトに対する操作 (訴訟ホールドの追加など) は、即時に整合性が保たれます。

使用量とアカウンティング

ロックされたオブジェクト (およびそのバージョン) は、他のデータと同様に使用量を提供します。オブジェクトが保存期間でロックされている間は、 使用コスト について責任を負います。

インタラクション

オブジェクト・ロックは、ユース・ケースの要件に応じて、いくつかのオブジェクト・ストレージ機能と組み合わせて使用できます。

バージョン管理

バージョン管理の有効化 は、オブジェクト・ロックを有効にするための前提条件です。 x-amz-bucket-object-lock-enabled ヘッダーを使用してバケットを作成すると、バージョン管理が自動的に有効になります。

バージョン付きオブジェクトを削除すると、 _削除マーカー_が作成されます。 オブジェクトは削除されたように見えるかもしれませんが、オブジェクトが保護されている場合、コンプライアンスモードでは保護されたバージョンを削除することは不可能です。 削除マーカー自体は保護されません。 ただし、ガバナンスモードでロックされたオブジェクトについては、法的保持が有効でない場合に限り、権限 bypass-governance-retention を持つ承認済みユーザーは保持期間が満了する前にオブジェクトを削除できます。

複製する

オブジェクト・ロック は、複製のためにソース・バケット では使用できません。宛先でのみ使用できます。 オブジェクトにはデフォルトの保存期間が割り当てられます。

鍵管理システム

保護オブジェクトは、バケットのルート鍵を使用して暗号化されます。 バケットでオブジェクト・ロックが有効になっている場合、 Key Protect または Hyper Protect Crypto Services によってホストされているルート鍵は、関連付けられているバケットでオブジェクト・ロックが有効になっている限り、削除から保護されます。 これにより、保護オブジェクトの暗号断片化が防止されます。

ライフサイクル構成

ロックされたオブジェクトをアーカイブ するライフサイクル・ポリシーを有効にすることはできますが、保存またはリーガル・ホールドの下で オブジェクトを有効期限切れ にするライフサイクル・ポリシーを有効にすることはできません (バケット内の無保護オブジェクトは引き続き有効期限切れにすることができます)。

Immutable Object Storage

オブジェクト・ロックは、Immutable Object Storageの使用時に使用可能な保存ポリシーに代わるものです。 オブジェクト・ロックではバージョン管理を有効にする必要があり、Immutable Object Storage はバージョン管理と互換性がないため、同じバケットで両方の WORM ソリューションを有効にすることはできません。 1 つのサービス・インスタンス内で、それぞれが Immutable Object Storage または Object Lock を使用するバケットを混在させることができます。

オブジェクトのタグ付け

保護オブジェクトのタグの追加または変更に関する制約事項はありません。

その他の相互作用

オブジェクト・ロックを他の Object Storage 機能 (CORS ポリシーの設定、IP ファイアウォールまたは条件ベースの制限の設定、バケット割り当て量、 Code Engineなど) と一緒に使用する場合は、悪影響を及ぼさないようにする必要があります。

IAM アクション

オブジェクト・ロックに関連付けられた新しい IAM アクションがあります。

IAM アクション
IAM アクション 役割
cloud-object-storage.bucket.get_object_lock_configuration 管理者、ライター、リーダー
cloud-object-storage.bucket.put_object_lock_configuration 管理者、ライター
cloud-object-storage.object.get_object_lock_retention 管理者、ライター、リーダー
cloud-object-storage.object.put_object_lock_retention 管理者、ライター
cloud-object-storage.object.get_object_lock_retention_version 管理者、ライター、リーダー
cloud-object-storage.object.put_object_lock_retention_version 管理者、ライター
cloud-object-storage.object.get_object_lock_legal_hold 管理者、ライター、リーダー
cloud-object-storage.object.put_object_lock_legal_hold 管理者、ライター
cloud-object-storage.object.get_object_lock_legal_hold_version 管理者、ライター、リーダー
cloud-object-storage.object.put_object_lock_legal_hold_version 管理者、ライター
cloud-object-storage.object.bypass_governance_retention 管理者、ライター

ライター役割を持つユーザーは、オブジェクトを何年も削除できないようにすることができます (場合によっては 1000 年)。 ほとんどのユーザーに Retain Until Date の設定を許可しないカスタム・ロールを作成することを検討してください。

Activity Tracker イベント

オブジェクト・ロックは追加のイベントを生成します。

  • cloud-object-storage.bucket-object-lock.create
  • cloud-object-storage.bucket-object-lock.read
  • cloud-object-storage.object-object-lock-legal-hold.create
  • cloud-object-storage.object-object-lock-legal-hold.read
  • cloud-object-storage.object-object-lock-retention.create
  • cloud-object-storage.object-object-lock-retention.read

cloud-object-storage.bucket-object-lock.create イベントの場合、以下のフィールドに追加情報が示されます。

フィールド 説明
requestData.object_lock_configuration.enabled バケットでオブジェクト・ロックが有効になっていることを示します
requestData.object_lock_configuration.defaultRetention.mode モード GOVERNANCE がアクティブであることを COMPLIANCE 示します。
object_lock_configuration.defaultRetention.years デフォルトの保存期間 (年)。
object_lock_configuration.defaultRetention.days デフォルトの保存期間 (日数)。

object_lock_configuration.defaultRetention.years または object_lock_configuration.defaultRetention.days のみが存在し、同時に両方が存在することはありません。

保護オブジェクトに対する操作の場合、以下のフィールドが存在する可能性があります。

フィールド 説明
requestData.object_lock_protection.legal_hold オブジェクト・バージョンに対して訴訟ホールドが有効であることを示します。
requestData.object_lock_protection.retention.mode オブジェクトバージョンでモード GOVERNANCE がアクティブであることを示します COMPLIANCE
requestData.object_lock_protection.retention.retain_until_date オブジェクト・バージョンが削除に適格となる日付を示します。 この日付を過ぎると、オブジェクトは保存日に基づいて保護された状態で削除されなくなります。

REST API の例

以下の例では、使いやすさのために cURL を使用しています。 環境変数は、 $BUCKET$TOKEN、および $REGION などのユーザー固有のエレメントを表すために使用されます。 $REGION にはネットワーク・タイプの指定も含まれるため、プライベート・ネットワークを使用して us-south のバケットに要求を送信するには、この変数を private.us-south に設定する必要があることに注意してください。

バケットに対するオブジェクト・ロックを有効にする

オブジェクト・ロック構成は、要求の本体で XML として提供されます。 新規要求により、バケットに存在する既存の複製規則が上書きされます。

オブジェクト・ロック構成には 1 つのルールが含まれている必要があります。

オプションのヘッダー
ヘッダー タイプ 説明
Content-MD5 ストリング ペイロードの base64 符号化128ビット MD5 ハッシュ値。これは、転送中にペイロードが改変されていないことを保証するための完全性チェックとして使用される。
x-amz-checksum-crc32 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの32ビット CRC32 チェックサムである。
x-amz-checksum-crc32c ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの32ビット CRC32C チェックサムである。
x-amz-checksum-crc64nvme ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの64ビット CRC64NVME チェックサムである。 CRC64NVME チェックサムは常にフルオブジェクトチェックサムである。
x-amz-checksum-sha1 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの160ビット SHA1 ダイジェストである。
x-amz-checksum-sha256 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの256ビット SHA256 ダイジェストである。
x-amz-sdk-checksum-algorithm ストリング SDKを使用する際に、オブジェクトのチェックサムを作成するために使用されるアルゴリズムを示します。
x-amz-bypass-governance-retention ストリング このヘッダーにより、権限のあるユーザーはガバナンスモードの保持設定を上書きし、保持期限前にオブジェクトを削除または変更できます。

ペイロードの完全性チェックとして、 Content-MD5 ヘッダーまたは checksum ヘッダー( x-amz-checksum-crc32x-amz-checksum-crc32cx-amz-checksum-crc64nvmex-amz-checksum-sha1、または x-amz-checksum-sha256 を含む)が必要である。

要求の本体には、以下のスキーマの XML ブロックが含まれている必要があります。

エレメント タイプ 上位 制約
ObjectLockConfiguration コンテナー ObjectLockEnabled, Rule なし 必須 限度 1。
ObjectLockEnabled ストリング なし ObjectLockConfiguration 必須 有効な値は Enabled (大/小文字の区別あり) のみです。
Rule コンテナー DefaultRetention ObjectLockConfiguration 限度 1
DefaultRetention コンテナー Days, Mode, Years Rule 限度 1。
Days 整数 なし DefaultRetention デフォルトの保存期間に指定する日数です。 Years と組み合わせることはできません。
Mode ストリング なし DefaultRetention COMPLIANCE または GOVERNANCE (大文字小文字を区別する)。
Years 整数 なし DefaultRetention デフォルトの保存期間として指定したい年数。 Days と組み合わせることはできません。

この例では、新規オブジェクトは少なくとも 30 日間保持されます。

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?object-lock" \
     -H 'Authorization: bearer $TOKEN' \
     -H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
            <ObjectLockEnabled>Enabled</ObjectLockEnabled>
            <Rule>
                <DefaultRetention>
                  <Days>30</Days>
                  <Mode>COMPLIANCE</Mode>
                </DefaultRetention>
            </Rule>
          </ObjectLockConfiguration>'

要求が成功すると、 200 応答が返されます。

バケットのオブジェクトロック設定を表示する

curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?object-lock" \
     -H 'Authorization: bearer $TOKEN'

これにより、適切なスキーマを持つ XML 応答本体が返されます。

<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <ObjectLockEnabled>string</ObjectLockEnabled>
  <Rule>
      <DefaultRetention>
        <Days>30</Days>
        <Mode>COMPLIANCE</Mode>
      </DefaultRetention>
  </Rule>
</ObjectLockConfiguration>

オブジェクトの保存期間の追加または延長

オブジェクト・ロック構成は、要求の本体で XML として提供されます。 新しいリクエストは、オブジェクトに存在する既存のレプリケーションルールを上書きします。ただし、リクエストの RetainUntilDate が現在の値よりも将来の日時である場合、またはオブジェクトがガバナンスモードでロックされており、リクエスト送信者が 権限 bypass-governance-retention を持っている場合に限ります。

オプション・ヘッダー
ヘッダー タイプ 説明
Content-MD5 ストリング ペイロードの base64 符号化128ビット MD5 ハッシュ値。これは、転送中にペイロードが改変されていないことを保証するための完全性チェックとして使用される。
x-amz-checksum-crc32 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの32ビット CRC32 チェックサムである。
x-amz-checksum-crc32c ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの32ビット CRC32C チェックサムである。
x-amz-checksum-crc64nvme ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの64ビット CRC64NVME チェックサムである。 CRC64NVME チェックサムは常にフルオブジェクトチェックサムである。
x-amz-checksum-sha1 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの160ビット SHA1 ダイジェストである。
x-amz-checksum-sha256 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの256ビット SHA256 ダイジェストである。
x-amz-sdk-checksum-algorithm ストリング SDKを使用する際に、オブジェクトのチェックサムを作成するために使用されるアルゴリズムを示します。
x-amz-bypass-governance-retention ストリング このヘッダーにより、権限のあるユーザーはガバナンスモードの保持設定を上書きし、保持期限前にオブジェクトを削除または変更できます。

ペイロードの完全性チェックとして、 Content-MD5 ヘッダーまたは checksum ヘッダー( x-amz-checksum-crc32x-amz-checksum-crc32cx-amz-checksum-crc64nvmex-amz-checksum-sha1、または x-amz-checksum-sha256 を含む)が必要である。

オプションで、 RetainUntilDate を適用するバージョンを指定できます。

オプションの照会パラメーター

パラメーター 必須かどうか タイプ 説明
versionID オプション ストリング バージョン ID。

要求の本体には、以下のスキーマの XML ブロックが含まれている必要があります。

エレメント タイプ 上位 制約
Retention コンテナー Mode, RetainUntilDate なし 必須 限度 1。
Mode ストリング なし Retention **必須 **COMPLIANCE または GOVERNANCE (大文字小文字を区別します)。
RetainUntilDate ストリング なし Retention 必須 オブジェクトが削除に適格となる日付 ( ISO8601 日時形式)。

この例では、少なくとも 2023 年 3 月 12 日まで新規オブジェクトを保持します。

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?retention" \
     -H 'Authorization: Bearer $TOKEN' \
     -H 'Content-MD5: fT0hYstki6zUvEh7abhcTA==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<Retention>
            <Mode>COMPLIANCE</Mode>
            <RetainUntilDate>2023-03-12T23:01:00.000Z</RetainUntilDate>
          </Retention>'

要求が成功すると、 200 応答が返されます。

RetainUntilDate 値が既存の値を超えていない場合、操作は 403 Access Denied で失敗します。

この例は、GOVERNANCEモードで保護されている既存オブジェクトバージョンの保持期間を短縮します。 リクエスト者は、バイパス・ガバナンス・保持権限を保有している必要があります。

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/$OBJECT?retention" \
     -H "Authorization: Bearer $TOKEN" \
     -H "Content-MD5: fT0hYstki6zUvEh7abhcTA==" \
     -H "Content-Type: text/plain; charset=utf-8" \
     -H "x-amz-bypass-governance-retention: true" \
     -d $'<Retention>
            <Mode>GOVERNANCE</Mode>
            <RetainUntilDate>2023-02-10T23:01:00.000Z</RetainUntilDate>
          </Retention>'

成功したリクエストは200 OKレスポンスを返します。 リクエスト送信者に bypass-governance-retention 権限がない場合、またはヘッダーが省略されている場合、操作は403アクセス拒否エラーで失敗します。

オブジェクトの訴訟ホールドの追加または削除

オブジェクト・ロック構成は、要求の本体で XML として提供されます。 RetainUntilDate が現行値よりも先であれば、新しい要求によって、オブジェクトに存在する既存の複製規則が上書きされます。

オプション・ヘッダー
ヘッダー タイプ 説明
Content-MD5 ストリング ペイロードの base64 符号化128ビット MD5 ハッシュ値。これは、転送中にペイロードが改変されていないことを保証するための完全性チェックとして使用される。
x-amz-checksum-crc32 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの32ビット CRC32 チェックサムである。
x-amz-checksum-crc32c ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの32ビット CRC32C チェックサムである。
x-amz-checksum-crc64nvme ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの64ビット CRC64NVME チェックサムである。 CRC64NVME チェックサムは常にフルオブジェクトチェックサムである。
x-amz-checksum-sha1 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの160ビット SHA1 ダイジェストである。
x-amz-checksum-sha256 ストリング このヘッダーは、 Base64 エンコードされた、オブジェクトの256ビット SHA256 ダイジェストである。
x-amz-sdk-checksum-algorithm ストリング SDKを使用する際に、オブジェクトのチェックサムを作成するために使用されるアルゴリズムを示します。

ペイロードの完全性チェックとして、 Content-MD5 ヘッダーまたは checksum ヘッダー( x-amz-checksum-crc32x-amz-checksum-crc32cx-amz-checksum-crc64nvmex-amz-checksum-sha1、または x-amz-checksum-sha256 を含む)が必要である。

要求の本体には、以下のスキーマの XML ブロックが含まれている必要があります。

エレメント タイプ 上位 制約
legal-hold コンテナー Status なし 限度 1。
Status ストリング なし legal-hold サポートされる値は、 ON または OFF (大/小文字の区別あり) です。

この例では、少なくとも 2023 年 3 月 12 日まで新規オブジェクトを保持します。

curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?legal-hold&versionId=$VERSION_ID" \
     -H 'Authorization: Bearer $TOKEN' \
     -H 'Content-MD5: FMh6GxizXUBRaiDuB0vtgQ==' \
     -H 'Content-Type: text/plain; charset=utf-8' \
     -d $'<legal-hold>
            <Status>ON</Status>
          </legal-hold>'

要求が成功すると、 200 応答が返されます。

SDK の例

以下の例では、 IBM のCOS SDK( Python、 Node.js、 Java、Go用)とTerraformスクリプトを使用していますが、オブジェクトのバージョン管理の実装は、カスタムエンドポイントの設定を可能にする S3-compatible のライブラリやツールと完全に互換性があるはずです。 サードパーティ製ツールを使用するには、 AWS V4 の署名を計算するための HMAC 認証情報 が必要です。

Python

IBM COS SDK for Python を使用したオブジェクト・ロックの有効化は、 低レベル・クライアント 構文を使用して行うことができます。

クライアントの使用:

import ibm_boto3
from ibm_botocore.client import Config
from ibm_botocore.exceptions import ClientError
from datetime import datetime, timedelta
import time

# Create new bucket with Object Lock enabled.
def create_bucket_with_objectlock(bucket_name):
        cos_cli.create_bucket(
            Bucket=bucket_name,
            ObjectLockEnabledForBucket=True,
        )
        print("Bucket: {0} created with objectlock enabled".format(bucket_name))

def objectlock_configuration_on_bucket(bucket_name):

    # Putting default retenion on the COS bucket.
    default_retention_rule = {'DefaultRetention': {'Mode': 'COMPLIANCE', 'Years': 1}}
    object_lock_config = {'ObjectLockEnabled': 'Enabled', 'Rule': default_retention_rule}
    cos_cli.put_object_lock_configuration(Bucket=bucket_name, ObjectLockConfiguration=object_lock_config)
    # Reading the objectlock configuration set on the bucket.
    response = cos_cli.get_object_lock_configuration(Bucket=bucket_name)
    print("Objectlock Configuration for {0} =>".format(bucket_name))
    print(response.ObjectLockConfiguration)

def objectlock_configuration_with_governance_mode_on_bucket(bucket_name):

    # Putting default retenion on the COS bucket with governance mode.
    default_retention_rule = {'DefaultRetention': {'Mode': 'GOVERNANCE', 'Years': 1}}
    object_lock_config = {'ObjectLockEnabled': 'Enabled', 'Rule': default_retention_rule}
    cos_cli.put_object_lock_configuration(Bucket=bucket_name, ObjectLockConfiguration=object_lock_config)
    # Reading the objectlock configuration set on the bucket.
    response = cos_cli.get_object_lock_configuration(Bucket=bucket_name)
    print("Objectlock Configuration for {0} =>".format(bucket_name))
    print(response.ObjectLockConfiguration)

def upload_object(bucket_name,object_name,object_content):
        cos_cli.put_object(
            Bucket=bucket_name,
            Key=object_name,
            Body=object_content
        )
        print("Object: {0} uploaded!".format(object_name))

def upload_object_with_governance_mode(bucket_name,object_name,object_content):
        cos_cli.put_object(
            Bucket=bucket_name,
            Key=object_name,
            Body=object_content,
            ObjectLockMode='GOVERNANCE',
            ObjectLockRetainUntilDate=datetime(2025, 11, 15)
        )
        print("Object: {0} uploaded!".format(object_name))

def objectlock_retention(bucket_name,object_name):
        # Put objectlock retenion on the  object uploaded to the bucket.
        date = datetime.now()+timedelta(seconds=5)
        retention_rule = {'Mode': 'COMPLIANCE', 'RetainUntilDate': date}
        cos_cli.put_object_retention(Bucket=bucket_name, Key=object_name, Retention=retention_rule)

        # Get objectlock retention of the above object.
        response = cos_cli.get_object_retention(Bucket=bucket_name, Key=object_name)
        print("Objectlock Retention for {0}=>".format(object_name))
        print(response.Retention)

def objectlock_retention_with_governance_mode(bucket_name,object_name):
        # Put objectlock retenion with governance mode on the  object uploaded to the bucket.
        date = datetime.now()+timedelta(seconds=5)
        retention_rule = {'Mode': 'GOVERNANCE', 'RetainUntilDate': date}
        cos_cli.put_object_retention(Bucket=bucket_name, Key=object_name, Retention=retention_rule)

        # Get objectlock retention of the above object.
        response = cos_cli.get_object_retention(Bucket=bucket_name, Key=object_name)
        print("Objectlock Retention for {0}=>".format(object_name))
        print(response.Retention)

def objectlock_legal_hold(bucket_name,object_name):
        # Setting the objectlock legal-hold status to ON.
        cos_cli.put_object_legal_hold(Bucket=bucket_name, Key=object_name, legal_hold={'Status': 'ON'})
        # Get objectlock retention of the above object.
        response = cos_cli.get_object_legal_hold(Bucket=bucket_name, Key=object_name)
        print("Objectlock legal-hold for {0}=>".format(object_name))
        print(response.legal_hold)

def delete_object_with_bypass_governance(bucket_name,object_name):
        # Deleting an object with retention using bypass governance
        cos_cli.delete_object(Bucket=bucket_name, Key=object_name, BypassGovernanceRetention=True)

COS_ENDPOINT = "" #Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints -> Ex:https://s3.us-south.cloud-object-storage.appdomain.cloud
COS_API_KEY_ID = "" #API Key of the cos instance created Ex: W00YixxxxxxxxxxMB-odB-2ySfTrFBIQQWanc--P3byk
COS_RESOURCE_INSTANCE_CRN = "" #API key of cos instance example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4

# Create client connection
cos_cli = ibm_boto3.client("s3",
    ibm_api_key_id=COS_API_KEY_ID,
    config=Config(signature_version="oauth"),
    endpoint_url=COS_ENDPOINT,
    ibm_service_instance_id=COS_RESOURCE_INSTANCE_CRN,
    ibm_auth_endpoint="https://iam.cloud.ibm.com/identity/token"
)
new_bucket_name = "create-example-python12345" # bucket name should be unique gloablly, or else it will throw an error.
new_text_file_name = "cos_object.txt"
new_text_file_contents = "This is a test file from Python code sample!!!"

# *** Main Program ***
def main():
       create_bucket_with_objectlock(new_bucket_name) # Create a new cos bucket with object lock enabled.
       objectlock_configuration_on_bucket(new_bucket_name) # Put objectlock configuration(i.e. default retention) on COS bucket and get the configuration.
       objectlock_configuration_with_governance_mode_on_bucket(new_bucket_name) # Put objectlock configuration(i.e. default retention)with governance mode on COS bucket and get the configuration.
       upload_object(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket.
       upload_object_with_governance_mode(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket with governance mode.
       objectlock_retention(new_bucket_name,new_text_file_name) # Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
       objectlock_retention_with_governance_mode(new_bucket_name,new_text_file_name) # Put objectlock retention(i.e. retain until date) with governance mode on the object and get the configured retention.
       objectlock_legal_hold(new_bucket_name,new_text_file_name)  # Put objectlock legal-hold on the object and get the legal-hold status.
       delete_object_with_bypass_governance(new_bucket_name,new_text_file_name) # Deleting an object with retention with governance mode using bypass governance.
if __name__ == "__main__":
    main()

Node.js

IBM COS SDK for Node.js を使用したバージョン管理の有効化:

'use strict';

// Required libraries
const ibm = require('ibm-cos-sdk');
const fs = require('fs');
const crypto = require('crypto');

function logError(e) {
    console.log(`ERROR: ${e.code} - ${e.message}\n`);
}

function logDone() {
    console.log('DONE!\n');
}

const COS_ENDPOINT = "";   //Choose endpoint from https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints. Ex: https://s3.us-south.cloud-object-storage.appdomain.cloud
const COS_API_KEY_ID = "";  // API key of cos instance example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
const COS_AUTH_ENDPOINT = "";
const COS_RESOURCE_INSTANCE_CRN = ""; // example: crn:v1:bluemix:public:cloud-object-storage:global:a <CREDENTIAL_ID_AS_GENERATED>:<SERVICE_ID_AS_GENERATED>::

// Client Creation.
var config = {
    endpoint: COS_ENDPOINT,
    apiKeyId: COS_API_KEY_ID,
    ibmAuthEndpoint: COS_AUTH_ENDPOINT,
    serviceInstanceId: COS_RESOURCE_INSTANCE_CRN,
    signatureVersion: 'iam'
};

var cos = new ibm.S3(config);

// Create new bucket with objectlock enabled.
function createBucket(bucketName) {
    console.log(`Creating new bucket: ${bucketName}`);
    return cos.createBucket({
        Bucket: bucketName,
        ObjectLockEnabledForBucket: true,
        CreateBucketConfiguration: {
            LocationConstraint: ''
          },
    }).promise()
    .then((() => {
        console.log(`Bucket: ${bucketName} created!`);
    }))
    .catch((e) => {
        console.error(`ERROR: ${e.code} - ${e.message}\n`);
    });
}

// Create new text file and upload the object to COS bucket.
function createTextFile(bucketName, itemName, fileText) {
    console.log(`Creating new item: ${itemName}`);
    return cos.putObject({
        Bucket: bucketName,
        Key: itemName,
        Body: fileText
    }).promise()
    .then(() => {
        console.log(`Item: ${itemName} created!`);
        logDone();
    })
    .catch(logError);
}

function uploadFileWithGovernanceMode(bucketName, itemName, fileText) {
    var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
    console.log(`Creating new item: ${itemName}`);
    return cos.putObject({
        Bucket: bucketName,
        Key: itemName,
        Body: fileText,
        ObjectLockMode: "GOVERNANCE",
        ObjectLockRetainUntilDate: inFiveSecond,

    }).promise()
    .then(() => {
        console.log(`Item: ${itemName} created!`);
        logDone();
    })
    .catch(logError);
}

function putObjectLockConfigurationOnBucket(bucketName) {
    console.log(`Putting Objectlock Configuration on : ${bucketName}`);
    // Putting objectlock configuration
    var defaultRetention = {Mode: 'COMPLIANCE', Days: 1}
    var objectLockRule = {DefaultRetention : defaultRetention}
    var param = {ObjectLockEnabled: 'Enabled', Rule: objectLockRule}
    return cos.putObjectLockConfiguration({
        Bucket: bucketName,
        ObjectLockConfiguration: param
    }).promise()
    .then(() => {
        console.log(`Object lock Configurtion added!!`);
        logDone();
    })
    .catch(logError);
}

function putObjectLockConfigurationWithGovernanceModeOnBucket(bucketName) {
    console.log(`Putting Objectlock Configuration on : ${bucketName}`);
    // Putting objectlock configuration
    var defaultRetention = {Mode: 'GOVERNANCE', Days: 1}
    var objectLockRule = {DefaultRetention : defaultRetention}
    var param = {ObjectLockEnabled: 'Enabled', Rule: objectLockRule}
    return cos.putObjectLockConfiguration({
        Bucket: bucketName,
        ObjectLockConfiguration: param
    }).promise()
    .then(() => {
        console.log(`Object lock Configurtion with Governance mode added!!`);
        logDone();
    })
    .catch(logError);
}

function getObjectLockConfigurationonBucket(bucketName) {
    console.log(`Getting Objectlock Configuration for : ${bucketName}`);
    // Getting objectlock configuration
    return cos.getObjectLockConfiguration({
        Bucket: bucketName,
    }).promise()
    .then((data) => {
        console.log(`objectlock configuration`);
        console.log( JSON.stringify(data.ObjectLockConfiguration, null, "    ") );
        logDone();
    })
    .catch(logError);
}

function putObjectLockRetention(bucketName,keyName) {
    console.log(`Putting Objectlock Retention on : ${keyName}`);
    var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
    var rule = {Mode: 'COMPLIANCE', RetainUntilDate: inFiveSecond}
     // Putting objectlock retention
    return cos.putObjectRetention({
        Bucket: bucketName,
        Key: keyName,
        Retention: rule
    }).promise()
    .then(() => {
        console.log(`Object lock Retention added!!`);
        logDone();
    })
    .catch(logError);
}

function putObjectLockRetentionWithGovernanceMode(bucketName,keyName) {
    console.log(`Putting Objectlock Retention on : ${keyName}`);
    var inFiveSecond = (new Date(Date.now() + (1000 * 5)))
    var rule = {Mode: 'GOVERNANCE', RetainUntilDate: inFiveSecond}
     // Putting objectlock retention
    return cos.putObjectRetention({
        Bucket: bucketName,
        Key: keyName,
        Retention: rule
    }).promise()
    .then(() => {
        console.log(`Object lock Retention with governance mode added!!`);
        logDone();
    })
    .catch(logError);
}

function getObjectLockRetention(bucketName,keyName) {
    console.log(`Getting Objectlock Retention for : ${keyName}`);
    // Getting objectlock retention
    return cos.getObjectRetention({
        Bucket: bucketName,
        Key: keyName
    }).promise()
    .then((data) => {
        console.log(`Objectlock retention for : ${keyName} `);
        console.log( JSON.stringify(data.Retention, null, "    ") );
        logDone();
    })
    .catch(logError);
}

function putObjectLocklegalHold(bucketName,keyName) {
    console.log(`Putting Objectlock legal-hold status ON for  : ${keyName}`);
     // Putting objectlock legal-hold status
    return cos.putObjectlegalHold({
        Bucket: bucketName,
        Key: keyName,
        LegalHold: {Status: 'ON'}
    }).promise()
    .then(() => {
        console.log(`Object lock legal-hold added!!`);
        logDone();
    })
    .catch(logError);
}

function getObjectLocklegalHold(bucketName,keyName) {
    console.log(`Getting Objectlock legal-hold for : ${keyName}`);
    // Getting objectlock legal-hold
    return cos.getObjectlegal-hold({
        Bucket: bucketName,
        Key: keyName
    }).promise()
    .then((data) => {
        console.log(`Objectlock legal-hold for : ${keyName} `);
        console.log( JSON.stringify(data.legal-hold, null, "    ") );
        logDone();
    })
    .catch(logError);
}
function createBucket(bucketName,objectName) {
    console.log(`Deleting Object t: ${objectName}`);
    return cos.deleteObject({
  Bucket: bucketName,
  Key: objectName,
  BypassGovernanceRetention: true,
}).promise()
.then(() => {
    console.log("Object deleted");
})
.catch(err => {
    console.error("Error deleting object:", err);
});

}
// Main app
function main() {
    try {
        var newBucketName = "jscosbucket350";
        var newTextFileName = "js_cos_bucket_file.txt";
        var newTextFileContents = "This is a test file from Node.js code sample!!!";

        createBucket(newBucketName) // Create a new cos bucket with object lock enabled.
        .then(() => putObjectLockConfigurationOnBucket(newBucketName)) // Put objectlock configuration(i.e. default retention) on COS bucket.
        .then(() => putObjectLockConfigurationWithGovernanceModeOnBucket(newBucketName)) // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
        .then(() => getObjectLockConfigurationonBucket(newBucketName)) // Read objectlock configuration on COS bucket.
        .then(() => createTextFile(newBucketName, newTextFileName, newTextFileContents)) // Upload an object with governance mode to cos bucket.
        .then(() => uploadFileWithGovernanceMode(newBucketName, newTextFileName, newTextFileContents)) // Upload an object to cos bucket.
        .then(() => putObjectLockRetention(newBucketName, newTextFileName)) // Put objectlock retention(i.e. retain until date) on the object.
        .then(() => putObjectLockRetentionWithGovernanceMode(newBucketName, newTextFileName)) // Put objectlock retention(i.e. retain until date) with governance mode on the object.
        .then(() => getObjectLockRetention(newBucketName, newTextFileName)) // Get the configured retention.
        .then(() => putObjectLocklegalHold(newBucketName,newTextFileName)) // Put objectlock legal-hold on the object.
        .then(() => getObjectLocklegalHold(newBucketName,newTextFileName))// Get the legal-hold status.
        .then(() => deleteObjectWithGovernanceMode(newBucketName,newTextFileName)); // Deleting an object with retention using bypass governance
    }
    catch(ex) {
        logError(ex);
    }
}

main();
```### Java
{: #ol-sdks-java}

```java {: codeblock}
mport com.ibm.cloud.objectstorage.ClientConfiguration;
import com.ibm.cloud.objectstorage.SDKGlobalConfiguration;
import com.ibm.cloud.objectstorage.auth.AWSCredentials;
import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder;
import com.ibm.cloud.objectstorage.oauth.BasicIBMOAuthCredentials;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
import com.ibm.cloud.objectstorage.services.s3.model.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.time.LocalDate;
import java.util.List;
import java.util.UUID;

public class JavaExampleSDK {
    private static AmazonS3 _cosClient;
    private static String api_key;
    private static String service_instance_id;
    private static String endpoint_url;
    private static String location;
    private static String auth_endpoint;

    public static void main(String[] args) throws IOException
    {

        // Constants for IBM COS values
        auth_endpoint = ""; // auth endpoint
        api_key = "";// example: xxxd12V2QHXbjaM99G9tWyYDgF_0gYdlQ8aWALIQxXx4
        service_instance_id = ""; // example: crn:v1:bluemix:public:cloud-object-storage:global:a/xx999cd94a0dda86fd8eff3191349999:9999b05b-x999-4917-xxxx-9d5b326a1111::
        endpoint_url = ""; // example: https://s3.us-south.cloud-object-storage.appdomain.cloud
        location =  "";// example: us-south-standard

        // Create client connection details
        // _cosClient = createClient(api_key, service_instance_id, endpoint_url, location);

        // String bucketName = "java.bucket" + UUID.randomUUID().toString().replace("-","");
        // String itemName = UUID.randomUUID().toString().replace("-","") + "_java_file.txt";
        // String fileText = "This is a test file from the Java code sample!!!";

        // // create a new bucket
        // createBucket(bucketName, _cosClient);

        // // Put objectlock configuration(i.e. default retention) on COS bucket.
        // putObjectLockConfiguration(bucketName , _cosClient);

        // // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
        // putObjectLockConfigurationWithGovernanceMode(bucketName , _cosClient);

        // // create a new text file & upload
        // createTextFileAndUpload(bucketName, itemName, fileText);
        // //  Upload an object with governance mode to cos bucket.
        // uploadFileWithGovernanceMode(bucketName, itemName, fileText);

        // //  Put objectlock retention(i.e. retain until date) on the object.
        // putObjectLockRetention(bucketName, itemName, _cosClient);
        // //  Put objectlock retention(i.e. retain until date) with governance mode on the object.
        // putObjectLockRetentionWithGovernanceMode(bucketName, itemName, _cosClient);

        // // remove the object with bypass governance
        // deleteObjectWithBypassGovernance(bucketName);
    }

    // Create client connection
    public static AmazonS3 createClient(String api_key, String service_instance_id, String endpoint_url, String location)
    {
        AWSCredentials credentials;
        credentials = new BasicIBMOAuthCredentials(api_key, service_instance_id);

        ClientConfiguration clientConfig = new ClientConfiguration().withRequestTimeout(5000);
        clientConfig.setUseTcpKeepAlive(true);

        AmazonS3 cosClient = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint_url, location)).withPathStyleAccessEnabled(true)
                .withClientConfiguration(clientConfig).build();
        return cosClient;
    }

    // Create a new bucket
    public static void createBucket(String bucketName, AmazonS3 _cosClient)
    {
        _cosClient.createBucket(bucketName);
        System.out.printf("Bucket: %s created!\n", bucketName);
    }

    // Put objectlock configuration(i.e. default retention) on COS bucket.
    public static void putObjectLockConfiguration(String bucketName, AmazonS3 _cosClient)
    {
        DefaultRetention defRet = new DefaultRetention()
                .withMode(ObjectLockRetentionMode.COMPLIANCE)
                .withDays(1);
        ObjectLockRule objRule = new ObjectLockRule()
                        .withDefaultRetention(defRet);
        ObjectLockConfiguration objConfig = new ObjectLockConfiguration()
                        .withObjectLockEnabled(ObjectLockEnabled.ENABLED)
                        .withRule(objRule);
        SetObjectLockConfigurationRequest objSet = new SetObjectLockConfigurationRequest()
                        .withBucketName(BUCKET_NAME)
                        .withObjectLockConfiguration(objConfig);
        _cosClient.setObjectLockConfiguration(objSet);
        System.out.printf("Successfully added object lock cofiguration on : %s\n", bucketName);
        GetObjectLockConfigurationRequest objReq = new GetObjectLockConfigurationRequest().withBucketName(BUCKET_NAME);
        GetObjectLockConfigurationResult objRes = _cosClient.getObjectLockConfiguration(objReq);
        ObjectLockConfiguration objLckConfig = objRes.getObjectLockConfiguration();
        ObjectLockRule objGetRule = objLckConfig.getRule();
        System.out.printf("ObjectLock Configuration : %s\n", objGetRule);
    }

    // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket.
    public static void putObjectLockConfigurationWithGovernanceMode(String bucketName, AmazonS3 _cosClient)
    {
        DefaultRetention defRet = new DefaultRetention()
                .withMode(ObjectLockRetentionMode.GOVERNANCE)
                .withDays(1);
        ObjectLockRule objRule = new ObjectLockRule()
                        .withDefaultRetention(defRet);
        ObjectLockConfiguration objConfig = new ObjectLockConfiguration()
                        .withObjectLockEnabled(ObjectLockEnabled.ENABLED)
                        .withRule(objRule);
        SetObjectLockConfigurationRequest objSet = new SetObjectLockConfigurationRequest()
                        .withBucketName(BUCKET_NAME)
                        .withObjectLockConfiguration(objConfig);
        _cosClient.setObjectLockConfiguration(objSet);
        System.out.printf("Successfully added object lock cofiguration on : %s\n", bucketName);
        GetObjectLockConfigurationRequest objReq = new GetObjectLockConfigurationRequest().withBucketName(BUCKET_NAME);
        GetObjectLockConfigurationResult objRes = _cosClient.getObjectLockConfiguration(objReq);
        ObjectLockConfiguration objLckConfig = objRes.getObjectLockConfiguration();
        ObjectLockRule objGetRule = objLckConfig.getRule();
        System.out.printf("ObjectLock Configuration : %s\n", objGetRule);

    }

    // Create file and upload to new bucket
    public static void createTextFileAndUpload(String bucketName, String itemName, String fileText) {
        System.out.printf("Creating new item: %s\n", itemName);

        InputStream newStream = new ByteArrayInputStream(fileText.getBytes(Charset.forName("UTF-8")));
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(fileText.length());
        PutObjectRequest req = new PutObjectRequest(bucketName, itemName, newStream, metadata);
        _cosClient.putObject(req);
        System.out.printf("Item: %s created!\n", itemName);
    }

    //  Upload an object with governance mode to cos bucket.
    public static void uploadFileWithGovernanceMode(String bucketName, String itemName, String fileText) {
        System.out.printf("Creating new item: %s\n", itemName);
        LocalDate date = LocalDate.of(2025, 11, 11);
        InputStream newStream = new ByteArrayInputStream(fileText.getBytes(Charset.forName("UTF-8")));
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(fileText.length());
        PutObjectRequest req = new PutObjectRequest(bucketName, itemName, newStream, metadata)
                            .withObjectLockMode("GOVERNANCE")
                            .withObjectLockRetainUntilDate(date);
        _cosClient.putObject(req);
        System.out.printf("Item: %s created!\n", itemName);
    }

    //  Put objectlock retention(i.e. retain until date) on the object.
    public static void putObjectLockRetention(String bucketName,String itemName, AmazonS3 _cosClient)
    {
        LocalDate date = LocalDate.of(2025, 11, 11);
        ObjectLockRetention objRet = new ObjectLockRetention()
                    .withMode("COMPLIANCE")
                    .withRetainUntilDate(date);
        SetObjectRetentionRequest objSet = new SetObjectRetentionRequest()
                    .withBucketName(BUCKET_NAME)
                    .withitemName(itemName)
                    .withRetention(objRet);
                    .withBypassGovernanceRetention(true);
        _cosClient.setObjectRetention(objSet);
        System.out.printf("Successfully added object retention on : %s\n", itemName);
        GetObjectRetentionRequest objReq = new GetObjectRetentionRequest()
            .withBucketName(BUCKET_NAME)
            .withitemName(itemName);
        GetObjectRetentionResult objRes1 = _cosClient.getObjectRetention(objReq);
        ObjectLockRetention objRet1 = objRes1.getRetention();
        System.out.printf("Retention : %s\n", objRet1);
    }

    //  Put objectlock retention(i.e. retain until date) with governance mode on the object.
    public static void putObjectLockRetentionWithGovernanceMode(String bucketName,String itemName, AmazonS3 _cosClient)
    {
        LocalDate date = LocalDate.of(2025, 11, 11);
        ObjectLockRetention objRet = new ObjectLockRetention()
                    .withMode("GOVERNANCE")
                    .withRetainUntilDate(date);
        SetObjectRetentionRequest objSet = new SetObjectRetentionRequest()
                    .withBucketName(BUCKET_NAME)
                    .withitemName(itemName)
                    .withRetention(objRet);
                    .withBypassGovernanceRetention(true);
        _cosClient.setObjectRetention(objSet);
        System.out.printf("Successfully added object retention on : %s\n", itemName);
        GetObjectRetentionRequest objReq = new GetObjectRetentionRequest()
            .withBucketName(BUCKET_NAME)
            .withitemName(itemName);
        GetObjectRetentionResult objRes1 = _cosClient.getObjectRetention(objReq);
        ObjectLockRetention objRet1 = objRes1.getRetention();
        System.out.printf("Retention : %s\n", objRet1);
    }

    // Delete object
    public static void deleteObjectWithBypassGovernance(String bucketName, String itemName) {
        System.out.printf("Deleting item: %s\n", itemName);
        DeleteObjectRequest deleteRequest = new DeleteObjectRequest(BUCKET_NAME, Key)
            .withBypassGovernanceRetention(true);
        _cosClient.deleteObject(deleteRequest);
        System.out.printf("Item: %s deleted!\n", itemName);
    }

}

Go

package main

import (
    "bytes"
    "fmt"
    "time"

    "github.com/IBM/ibm-cos-sdk-go/aws"
    "github.com/IBM/ibm-cos-sdk-go/aws/credentials/ibmiam"
    "github.com/IBM/ibm-cos-sdk-go/aws/session"
    "github.com/IBM/ibm-cos-sdk-go/service/s3"
)

const (
    apiKey            = "<apiKey>"
    serviceInstanceID = "<serviceInstanceID>"
    authEndpoint      = "https://iam.cloud.ibm.com/identity/token"
    serviceEndpoint   = "https://<endpoint>.appdomain.cloud"
)

// Create new bucket with objectlock enabled.
func createBucket(bucketName string, client *s3.S3) {
    createBucketInput := new(s3.CreateBucketInput)
    createBucketInput.Bucket = aws.String(bucketName)
    createBucketInput.ObjectLockEnabledForBucket = aws.Bool(true)
    _, e := client.CreateBucket(createBucketInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Bucket Created !!! ")
    }
}

func uploadObject(bucketName string, client *s3.S3, fileName string, fileContent string) {
    putInput := &s3.PutObjectInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(fileName),
        Body:   bytes.NewReader([]byte(fileContent)),
    }

    _, e := client.PutObject(putInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Uploaded!!! ")
    }
}

func uploadObjectWithGovernanceMode(bucketName string, client *s3.S3, fileName string, fileContent string) {
    retention_date := time.Now().Local().Add(time.Second * 5)
    putInput := &s3.PutObjectInput{
        Bucket:                    aws.String(bucketName),
        Key:                       aws.String(fileName),
        Body:                      bytes.NewReader([]byte(fileContent)),
        ObjectLockMode:            aws.String("GOVERNANCE"),
        ObjectLockRetainUntilDate: aws.Time(retention_date),
    }

    _, e := client.PutObject(putInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Uploaded!!! ")
    }
}

func objectLockConfiguration(bucketName string, client *s3.S3) {
    // Putting default retenion on the COS bucket.
    putObjectLockConfigurationInput := &s3.PutObjectLockConfigurationInput{
        Bucket: aws.String(bucketName),
        ObjectLockConfiguration: &s3.ObjectLockConfiguration{
            ObjectLockEnabled: aws.String(s3.ObjectLockEnabledEnabled),
            Rule: &s3.ObjectLockRule{
                DefaultRetention: &s3.DefaultRetention{
                    Mode: aws.String("COMPLIANCE"),
                    Days: aws.Int64(1),
                },
            },
        },
    }
    _, e := client.PutObjectLockConfiguration(putObjectLockConfigurationInput)

    // Reading the objectlock configuration set on the bucket.
    getObjectLockConfigurationInput := new(s3.GetObjectLockConfigurationInput)
    getObjectLockConfigurationInput.Bucket = aws.String(bucketName)
    response, e := client.GetObjectLockConfiguration(getObjectLockConfigurationInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock Configuration =>", response.ObjectLockConfiguration)
    }
}

func objectLockConfigurationwithGovernanceMode(bucketName string, client *s3.S3) {
    // Putting default retenion on the COS bucket.
    putObjectLockConfigurationInput := &s3.PutObjectLockConfigurationInput{
        Bucket: aws.String(bucketName),
        ObjectLockConfiguration: &s3.ObjectLockConfiguration{
            ObjectLockEnabled: aws.String(s3.ObjectLockEnabledEnabled),
            Rule: &s3.ObjectLockRule{
                DefaultRetention: &s3.DefaultRetention{
                    Mode: aws.String("GOVERNANCE"),
                    Days: aws.Int64(1),
                },
            },
        },
    }
    _, e := client.PutObjectLockConfiguration(putObjectLockConfigurationInput)

    // Reading the objectlock configuration set on the bucket.
    getObjectLockConfigurationInput := new(s3.GetObjectLockConfigurationInput)
    getObjectLockConfigurationInput.Bucket = aws.String(bucketName)
    response, e := client.GetObjectLockConfiguration(getObjectLockConfigurationInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock Configuration =>", response.ObjectLockConfiguration)
    }
}
func objectLockRetention(bucketName string, client *s3.S3, keyName string) {

    // Put objectlock retenion on the  object uploaded to the bucket.
    retention_date := time.Now().Local().Add(time.Second * 5)
    putObjectRetentionInput := &s3.PutObjectRetentionInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(keyName),
        Retention: &s3.ObjectLockRetention{
            Mode:            aws.String("COMPLIANCE"),
            RetainUntilDate: aws.Time(retention_date),
        },
    }
    _, e := client.PutObjectRetention(putObjectRetentionInput)

    // Get objectlock retention of the above object.
    getObjectRetentionInput := new(s3.GetObjectRetentionInput)
    getObjectRetentionInput.Bucket = aws.String(bucketName)
    getObjectRetentionInput.Key = aws.String(keyName)
    response, e := client.GetObjectRetention(getObjectRetentionInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock Retention =>", response.Retention)
    }
}

func objectLockRetentionWithGovernanceMode(bucketName string, client *s3.S3, keyName string) {

    // Put objectlock retenion on the  object uploaded to the bucket.
    retention_date := time.Now().Local().Add(time.Second * 5)
    putObjectRetentionInput := &s3.PutObjectRetentionInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(keyName),
        Retention: &s3.ObjectLockRetention{
            Mode:            aws.String("GOVERNANCE"),
            RetainUntilDate: aws.Time(retention_date),
        },
    }
    _, e := client.PutObjectRetention(putObjectRetentionInput)

    // Get objectlock retention of the above object.
    getObjectRetentionInput := new(s3.GetObjectRetentionInput)
    getObjectRetentionInput.Bucket = aws.String(bucketName)
    getObjectRetentionInput.Key = aws.String(keyName)
    response, e := client.GetObjectRetention(getObjectRetentionInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock Retention =>", response.Retention)
    }
}

func objectLocklegalHold(bucketName string, client *s3.S3, keyName string) {

    // Setting the objectlock legal-hold status to ON.
    putObjectlegalHoldInput := &s3.PutObjectlegalHoldInput{
        Bucket: aws.String(bucketName),
        Key:    aws.String(keyName),
        legalHold: &s3.ObjectLocklegalHold{
            Status: aws.String("ON"),
        },
    }
    _, e := client.PutObjectlegalHold(putObjectlegalHoldInput)
    // Get objectlock retention of the above object.
    getObjectlegalHoldInput := new(s3.GetObjectlegalHoldInput)
    getObjectlegalHoldInput.Bucket = aws.String(bucketName)
    getObjectlegalHoldInput.Key = aws.String(keyName)
    response, e := client.GetObjectlegalHold(getObjectlegalHoldInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Lock legal-hold =>", response.legalHold)
    }
}

func deleteObjectWithBypassGovernance(bucketName string, client *s3.S3, fileName string) {
    deleteObjectInput := new(s3.DeleteObjectInput)
    deleteObjectInput.Bucket = aws.String(bucketName)
    deleteObjectInput.Key = aws.String("foo")
    deleteObjectInput.BypassGovernanceRetention = aws.Bool(true)
    _, e := client.DeleteObject(deleteObjectInput)
    if e != nil {
        fmt.Println(e)
    } else {
        fmt.Println("Object Deleted")
    }

}

func main() {

    bucketName := "gocosbucket353"
    textFileName := "go_cos_bucket_file.txt"
    textFileContents := "This is a test file from Node.js code sample!!!"
    conf := aws.NewConfig().
        WithEndpoint(serviceEndpoint).
        WithCredentials(ibmiam.NewStaticCredentials(aws.NewConfig(),
            authEndpoint, apiKey, serviceInstanceID)).
        WithS3ForcePathStyle(true)

    sess := session.Must(session.NewSession())
    client := s3.New(sess, conf)
    createBucket(bucketName, client)                                                   // Create a new cos bucket with object lock enabled.
    objectLockConfiguration(bucketName, client)                                        // Put objectlock configuration(i.e. default retention) on COS bucket and get the configuration.
    objectLockConfigurationwithGovernanceMode(bucketName, client)                      // Put objectlock configuration(i.e. default retention) with governance mode on COS bucket and get the configuration.
    uploadObject(bucketName, client, textFileName, textFileContents)                   // Upload an object to cos bucket.
    uploadObjectWithGovernanceMode(bucketName, client, textFileName, textFileContents) // Upload an object with governance mode to cos bucket.
    objectLockRetention(bucketName, client, textFileName)                              // Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
    objectLockRetentionWithGovernanceMode(bucketName, client, textFileName)            // Put objectlock retention(i.e. retain until date) with governance mode on the object and get the configured retention.
    objectLocklegalHold(bucketName, client, textFileName)                              // Put objectlock legal-hold on the object and get the legal-hold status.
    deleteObjectWithBypassGovernance(bucketName, client, textFileName)                 // Delete object using governace bypass header
}

Terraform

// Create COS instance.
resource "ibm_resource_instance" "cos_instance" {
  name              = "cos-instance"
  resource_group_id = data.ibm_resource_group.cos_group.id
  service           = "cloud-object-storage"
  plan              = "standard"
  location          = "global"
}

// Create a new bucket with objectlock and object versioning enabled.
resource "ibm_cos_bucket" "bucket" {
  bucket_name           = var.bucket_name
  resource_instance_id  = ibm_resource_instance.cos_instance.id
  region_location  = var.regional_loc
  storage_class          = var.standard_storage_class
  object_versioning {
    enable  = true
  }
  object_lock = true
}

// Set object lock configuration on the bucket by providing the crn of the new COS bucket.
resource ibm_cos_bucket_objectlock_configuration "objectlock" {
 bucket_crn      = ibm_cos_bucket.bucket.crn
 bucket_location = var.regional_loc
 object_lock_configuration{
   objectlockenabled = "Enabled"
   objectlockrule{
     defaultretention{
        mode = "COMPLIANCE"
        days = 6
      }
    }
  }
}

// Upload an object to the COS bucket with objectlock retention and objectlock legal-hold.
resource "ibm_cos_bucket_object" "object_object_lock" {
  bucket_crn      = ibm_cos_bucket.bucket.crn
  bucket_location = ibm_cos_bucket.bucket.region_location
  content         = "Hello World 2"
  key             = "plaintext5.txt"
  object_lock_mode              = "COMPLIANCE"
  object_lock_retain_until_date = "2023-02-15T18:00:00Z"
  object_lock_legal_hold_status = "ON"
  force_delete = true
}