IBM Cloud Docs
オブジェクト・ロック

オブジェクト・ロック

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

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

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

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

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

Object Lock を使用する場合、お客様の IBM Cloud アカウントが、 IBM Cloud のポリシーおよびガイドラインに従って、データ保持期間の対象となる限り、良好な状態で保持されるようにする責任を負うものとします。 詳しくは、IBM Cloud サービスの用語を参照してください。

用語

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

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

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

保存期限日 (保存期間)

オブジェクト・バージョンを一定期間保護する必要がある場合は、変更できない期間を決定する 「保存期限日」 を指定する必要があります。 オブジェクト・バージョンは、この日付が経過した後に削除できます (オブジェクト・バージョンに対する訴訟ホールドがないことを前提とします)。

新規オブジェクトの保存期間は、バケットに設定されたデフォルト値から継承することも、 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 アクションがあると想定すると、古い値は新しい値で上書きされます。

オブジェクトロックを始める

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

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

オブジェクトの保存期間を 減らすことはできません。 検証テストにデフォルト保存を使用している場合は、デフォルト保存としてより短い期間 (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 ヘッダーを使用してバケットを作成すると、バージョン管理が自動的に有効になります。

バージョン付きオブジェクトを削除すると、 _削除マーカー_が作成されます。 オブジェクトは削除されたように見える可能性がありますが、オブジェクトが保護されている場合、保護されているバージョンを削除することはできません。 削除マーカー自体は保護されません。

複製する

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

鍵管理システム

保護オブジェクトは、バケットのルート鍵を使用して暗号化されます。 バケットでオブジェクト・ロックが有効になっている場合、 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 管理者、ライター

ライター役割を持つユーザーは、オブジェクトを何年も削除できないようにすることができます (場合によっては 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 COMPLIANCE モードがアクティブ- GOVERNANCE モードはまだサポートされていません。
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 オブジェクト・バージョンで COMPLIANCE モードがアクティブであることを示します。 GOVERNANCE モードはまだサポートされていません。
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 ハッシュ。ペイロードが転送中に変更されなかったことを確認するための保全性検査として使用されます。

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

エレメント タイプ 上位 制約
ObjectLockConfiguration コンテナー ObjectLockEnabled, Rule なし 必須 限度 1。
ObjectLockEnabled ストリング なし ObjectLockConfiguration 必須 有効な値は Enabled (大/小文字の区別あり) のみです。
Rule コンテナー DefaultRetention ObjectLockConfiguration 限度 1
DefaultRetention コンテナー Days, Mode, Years Rule 限度 1。
Days 整数 なし DefaultRetention デフォルトの保存期間に指定する日数です。 Years と組み合わせることはできません。
Mode ストリング なし DefaultRetention 現時点では COMPLIANCE のみがサポートされている(大文字と小文字は区別される)。
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 が現行値よりも先であれば、新しい要求によって、オブジェクトに存在する既存の複製規則が上書きされます。

ヘッダー タイプ 説明
Content-MD5 ストリング 必須: base64 でエンコードされた、ペイロードの 128 ビット MD5 ハッシュ。ペイロードが転送中に変更されなかったことを確認するための保全性検査として使用されます。

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

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

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

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

エレメント タイプ 上位 制約
Retention コンテナー Mode, RetainUntilDate なし 必須 限度 1。
Mode ストリング なし Retention 現時点では、 必須 のみ COMPLIANCE がサポートされます (大/小文字が区別されます)。
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 で失敗します。

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

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

ヘッダー タイプ 説明
Content-MD5 ストリング 必須: base64 でエンコードされた、ペイロードの 128 ビット MD5 ハッシュ。ペイロードが転送中に変更されなかったことを確認するための保全性検査として使用されます。

要求の本体には、以下のスキーマの 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 for Python、 Node.js、および 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 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 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_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)

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.test.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.
       upload_object(new_bucket_name,new_text_file_name,new_text_file_contents) # Upload an object to cos bucket.
       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_legal-hold(new_bucket_name,new_text_file_name)  # Put objectlock legal-hold on the object and get the legal-hold status.

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 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 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 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 putObjectLocklegal-hold(bucketName,keyName) {
    console.log(`Putting Objectlock legal-hold status ON for  : ${keyName}`);
     // Putting objectlock legal-hold status
    return cos.putObjectlegal-hold({
        Bucket: bucketName,
        Key: keyName,
        legal-hold: {Status: 'ON'}
    }).promise()
    .then(() => {
        console.log(`Object lock legal-hold added!!`);
        logDone();
    })
    .catch(logError);
}

function getObjectLocklegal-hold(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);
}

// 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(() => getObjectLockConfigurationonBucket(newBucketName)) // Read objectlock configuration on COS bucket.
        .then(() => createTextFile(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(() => getObjectLockRetention(newBucketName, newTextFileName)) // Get the configured retention.
        .then(() => putObjectLocklegal-hold(newBucketName,newTextFileName)) // Put objectlock legal-hold on the object.
        .then(() => getObjectLocklegal-hold(newBucketName,newTextFileName)); // Get the legal-hold status.
    }
    catch(ex) {
        logError(ex);
    }
}

main();

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 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 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 objectLocklegal-hold(bucketName string, client *s3.S3, keyName string) {

	// Setting the objectlock legal-hold status to ON.
	putObjectlegal-holdInput := &s3.PutObjectlegal-holdInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(keyName),
		legal-hold: &s3.ObjectLocklegal-hold{
			Status: aws.String("ON"),
		},
	}
	_, e := client.PutObjectlegal-hold(putObjectlegal-holdInput)
	// Get objectlock retention of the above object.
	getObjectlegal-holdInput := new(s3.GetObjectlegal-holdInput)
	getObjectlegal-holdInput.Bucket = aws.String(bucketName)
	getObjectlegal-holdInput.Key = aws.String(keyName)
	response, e := client.GetObjectlegal-hold(getObjectlegal-holdInput)
	if e != nil {
		fmt.Println(e)
	} else {
		fmt.Println("Object Lock legal-hold =>", response.legal-hold)
	}
}

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.
	uploadObject(bucketName, client, textFileName, textFileContents) // Upload an object to cos bucket.
	objectLockRetention(bucketName, client, textFileName)            // Put objectlock retention(i.e. retain until date) on the object and get the configured retention.
	objectLocklegal-hold(bucketName, client, textFileName)            // Put objectlock legal-hold on the object and get the legal-hold status.

}

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
}