オブジェクトレベル保持ポリシー (ObjectWorm) は、オブジェクト単位で WORM (Write Once, Read Many) コンプライアンス保持を実現します。バケットレベル保持ポリシー (BucketWorm) がバケット内のすべてのオブジェクトに一様なポリシーを適用するのに対し、ObjectWorm では各オブジェクトごとに固有の保持モードと保持期限日を設定できます。この機能は、金融や医療など、細分化されたコンプライアンスストレージ要件を満たすのに最適です。
この機能は現在、招待者のみが利用可能です。アクセスをリクエストするには、テクニカルサポートまでお問い合わせください。
概要
バケットで ObjectWorm を有効化すると、新規オブジェクトにデフォルトの保持ポリシーを自動的に適用するか、既存の個別オブジェクトに別の保持ポリシーを設定できます。オブジェクトレベルのポリシーは、バケットのデフォルトポリシーよりも優先されます。
現在、コンプライアンスモードのみがサポートされています。コンプライアンスモードでは、ルートユーザーを含むいかなるユーザーも、保持期間中に保護対象のオブジェクトバージョンを削除または上書きできません。保持期限日は延長のみ可能で、短縮はできません。
BucketWorm と ObjectWorm の比較
項目 | BucketWorm | ObjectWorm |
保護範囲 | バケット内のすべてのオブジェクト。 | 個々のオブジェクト。 |
設定方法 | バケット内のすべてのオブジェクト (既存および新規) に一様に適用されるバケットレベルのスイッチ。 | 新規オブジェクトはデフォルトポリシーを継承しますが、個々のオブジェクトに別途、より優先度の高いポリシーを設定できます。 |
保持期間 | オブジェクトの最終更新時刻に加算される相対的な日数。 | 秒単位で正確な絶対的な保持期限日。 |
相互排他 | BucketWorm と ObjectWorm は相互排他です。 | |
前提条件
バージョン管理がバケットで有効になっている必要があります。ObjectWorm を有効化した後は、バージョン管理を無効化できません。
バケットレベル保持ポリシー (BucketWorm) がバケットで有効になっていてはなりません。ObjectWorm と BucketWorm は相互排他です。
ObjectWorm の有効化と保持ポリシーの設定
バケットでオブジェクトレベル保持ポリシーを有効化し、特定のオブジェクトが指定された期間中に削除または上書きされないようにします。この機能を有効化した後は、各新規または既存オブジェクトに個別の保持ポリシーを設定でき、柔軟性が向上します。
この操作は取り消せません。ObjectWorm を有効化すると、そのバケットで ObjectWorm やバージョン管理を無効化できなくなります。慎重に進めてください。
コンソール
OSS コンソールにログインします。
左側のナビゲーションウィンドウで、バケット をクリックし、対象バケットの名前をクリックします。
左側のナビゲーションウィンドウで、Data Protection > オブジェクトレベル保持ポリシー を選択します。
有効化 をクリックします。
デフォルト保持ポリシー設定で、必要に応じて以下のパラメーターを設定します。
設定しない: デフォルト保持ポリシーは適用されません。バケットにアップロードされたオブジェクトは自動的に保護されません。
コンプライアンスモード (Compliance Mode): コンプライアンスモードでは、保持期間中に、ルートユーザーを含むいかなるユーザーも保護対象のオブジェクトを削除または上書きできません。
Retention Period: 保持期間を入力し、単位として 日 または 年 を選択します。
設定 をクリックし、ダイアログボックスに確認メッセージを入力して処理を完了します。
ossutil
バケット examplebucket に対してオブジェクトレベル保持ポリシーを有効化し、コンプライアンスモードで 1 日間のデフォルト保持ポリシーを設定します。
以下の内容を持つ object-worm-configuration.xml という名前の XML 設定ファイルを使用します。
<?xml version="1.0" encoding="UTF-8"?>
<ObjectWormConfiguration>
<ObjectWormEnabled>Enabled</ObjectWormEnabled>
<Rule>
<DefaultRetention>
<Mode>COMPLIANCE</Mode>
<Days>1</Days>
</DefaultRetention>
</Rule>
</ObjectWormConfiguration>コマンド例:
ossutil api put-bucket-object-worm-configuration --bucket examplebucket --object-worm-configuration file://object-worm-configuration.xmlSDK
以下のコード例は、SDK を使用して ObjectWorm を有効化し、デフォルト保持ポリシーを設定する方法を示しています。
Python
import argparse
import alibabacloud_oss_v2 as oss
parser = argparse.ArgumentParser(description="put bucket object worm configuration sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The OSS endpoint. If not specified, the SDK determines the endpoint based on the region.')
parser.add_argument('--mode', help='The retention mode. Valid values: GOVERNANCE, COMPLIANCE', default='GOVERNANCE')
parser.add_argument('--days', help='Object-level retention policy days (max 36500)', type=int)
parser.add_argument('--years', help='Bucket object level retention policy years (max 100)', type=int)
def main():
args = parser.parse_args()
# Loading credentials from the environment variables
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Using the SDK's default configuration
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss.Client(cfg)
# Create a default retention rule
default_retention = oss.ObjectWormConfigurationRuleDefaultRetention(
mode=args.mode,
days=args.days,
# Specify either days or years, but not both.
# years=args.years,
)
# Create the rule
rule = oss.ObjectWormConfigurationRule(
default_retention=default_retention,
)
# Create the WORM configuration
config = oss.ObjectWormConfiguration(
object_worm_enabled='Enabled',
rule=rule,
)
result = client.put_bucket_object_worm_configuration(oss.PutBucketObjectWormConfigurationRequest(
bucket=args.bucket,
object_worm_configuration=config,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
if __name__ == "__main__":
main()Go
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string
bucketName string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
flag.Parse()
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg)
request := &oss.PutBucketObjectWormConfigurationRequest{
Bucket: oss.Ptr(bucketName),
ObjectWormConfiguration: &oss.ObjectWormConfiguration{
ObjectWormEnabled: oss.Ptr("Enabled"),
Rule: &oss.ObjectWormRule{
DefaultRetention: &oss.ObjectWormDefaultRetention{
Mode: oss.Ptr("COMPLIANCE"),
Days: oss.Ptr(int32(1)),
},
},
},
}
result, err := client.PutBucketObjectWormConfiguration(context.TODO(), request)
if err != nil {
log.Fatalf("Failed to put bucket Object WORM configuration: %v", err)
}
log.Printf("Put bucket Object WORM configuration result: %#v\n", result)
}Java
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.OSSClientBuilder;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.*;
public class PutBucketObjectWormConfigurationDemo {
public static void main(String[] args) {
CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();
OSSClient client = OSSClient.newBuilder()
.credentialsProvider(provider)
.region("cn-hangzhou")
.build();
try {
ObjectWormConfigurationDefaultRetention defaultRetention = ObjectWormConfigurationDefaultRetention.newBuilder()
.mode("COMPLIANCE")
.days(1)
.build();
ObjectWormConfigurationRule rule = ObjectWormConfigurationRule.newBuilder()
.defaultRetention(defaultRetention)
.build();
ObjectWormConfiguration objectWormConfiguration = ObjectWormConfiguration.newBuilder()
.objectWormEnabled("Enabled")
.rule(rule)
.build();
PutBucketObjectWormConfigurationRequest request = PutBucketObjectWormConfigurationRequest.newBuilder()
.bucket("examplebucket")
.objectWormConfiguration(objectWormConfiguration)
.build();
PutBucketObjectWormConfigurationResult result = client.putBucketObjectWormConfiguration(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
} catch (Exception e) {
System.out.printf("error: %s%n", e);
} finally {
client.close();
}
}
}API
PutBucketObjectWormConfiguration 操作を呼び出して ObjectWorm を有効化します。以下のリクエストボディ例では、バケットに対して ObjectWorm を有効化し、デフォルト保持ポリシーをコンプライアンスモードで保持期間 1 日に設定しています。
PUT /?objectWorm HTTP/1.1
Date: Thu, 17 Mar 2026 11:18:32 GMT
Content-Length: 188
Content-Type: application/xml
Content-MD5: B2M2Y8AsgTpgAmY7PhC****
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20260317/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=content-length,Signature=a7c3554c729d****
<?xml version="1.0" encoding="UTF-8"?>
<ObjectWormConfiguration>
<ObjectWormEnabled>Enabled</ObjectWormEnabled>
<Rule>
<DefaultRetention>
<Mode>COMPLIANCE</Mode>
<Days>1</Days>
</DefaultRetention>
</Rule>
</ObjectWormConfiguration>オブジェクト保持ポリシーの設定
特定のオブジェクトバージョンに対して、保持モードおよび保持期限日を含む個別の保持ポリシーを設定します。オブジェクトレベルのポリシーは、バケットのデフォルト保持ポリシーよりも優先されます。
コンソール
ファイルリストまたはファイル詳細ページから、既存のオブジェクトに対して保持ポリシーを設定できます。
OSS コンソールにログインします。
左側のナビゲーションウィンドウで、バケット をクリックし、対象バケットの名前をクリックします。
左側のナビゲーションウィンドウで、オブジェクト管理 をクリックし、対象オブジェクトを見つけます。
対象オブジェクトの右側で、 を選択します。
表示される設定パネルで、デフォルトの保持モード および 保持期間 を設定し、OK をクリックします。
コンプライアンスモードでは、すでに保持ポリシーが設定されているオブジェクトの保持期間を延長することしかできません。短縮はできません。
ossutil
バケット examplebucket 内のオブジェクト exampleobject に対して、保持期限日を 2026-12-31T00:00:00.000Z とするコンプライアンスモードの保持ポリシーを設定します。
以下の内容を持つ retention.xml という名前の XML 設定ファイルを使用します。
<?xml version="1.0" encoding="UTF-8"?>
<Retention>
<Mode>COMPLIANCE</Mode>
<RetainUntilDate>2026-12-31T00:00:00.000Z</RetainUntilDate>
</Retention>コマンド例:
ossutil api put-object-retention --bucket examplebucket --key exampleobject --retention file://retention.xmlSDK
以下のコード例は、SDK を使用してオブジェクトの保持ポリシーを設定する方法を示しています。
Python
import argparse
import alibabacloud_oss_v2 as oss
from datetime import datetime, timedelta, timezone
parser = argparse.ArgumentParser(description="put object retention sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The OSS endpoint. If not specified, the SDK determines the endpoint based on the region.')
parser.add_argument('--key', help='The object key.', required=True)
def main():
args = parser.parse_args()
# Loading credentials from the environment variables
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Using the SDK's default configuration
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss.Client(cfg)
# Calculate retain until date (1 day from now) in ISO 8601 format
# Use UTC time (recommended for OSS)
retain_until_date = datetime.now(timezone.utc) + timedelta(days=1)
retain_until_iso = retain_until_date.strftime('%Y-%m-%dT%H:%M:%S.000Z')
# Create retention configuration
retention_config = oss.Retention(
mode=oss.ObjectRetentionModeType.COMPLIANCE,
retain_until_date=retain_until_iso,
)
# Set object retention
result = client.put_object_retention(oss.PutObjectRetentionRequest(
bucket=args.bucket,
key=args.key,
retention=retention_config,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id}')
if __name__ == "__main__":
main()Go
package main
import (
"context"
"flag"
"log"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string
bucketName string
objectName string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg)
date := time.Now().UTC().Add(5 * time.Hour).Format("2006-01-02T15:04:05.000Z")
putRequest := &oss.PutObjectRetentionRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
Retention: &oss.ObjectWormRetention{
Mode: oss.Ptr("COMPLIANCE"),
RetainUntilDate: oss.Ptr(date),
},
}
putResult, err := client.PutObjectRetention(context.TODO(), putRequest)
if err != nil {
log.Fatalf("Failed to put object retention policy: %v", err)
}
log.Printf("Put object retention policy result: %#v\n", putResult)
}Java
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.OSSClientBuilder;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.*;
public class PutObjectRetentionDemo {
public static void main(String[] args) {
CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();
OSSClient client = OSSClient.newBuilder()
.credentialsProvider(provider)
.region("cn-hangzhou")
.build();
try {
Retention retention = Retention.newBuilder()
.mode("COMPLIANCE")
.retainUntilDate("2026-12-31T00:00:00.000Z")
.build();
PutObjectRetentionRequest request = PutObjectRetentionRequest.newBuilder()
.bucket("examplebucket")
.key("exampleobject")
.retention(retention)
.build();
PutObjectRetentionResult result = client.putObjectRetention(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
} catch (Exception e) {
System.out.printf("error: %s%n", e);
} finally {
client.close();
}
}
}API
PutObjectRetention 操作を呼び出して、オブジェクトの保持ポリシーを設定します。以下のコードは、リクエストのサンプルを示しています。
PUT /exampleobject?retention&versionId=CAEQNhiBgMDJgZCA0BYiIDc4MGZj**** HTTP/1.1
Date: Thu, 17 Mar 2026 11:18:32 GMT
Content-MD5: B2M2Y8AsgTpgAmY7PhC****
Content-Type: application/xml
Content-Length: 162
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20260317/cn-hangzhou/oss/aliyun_v4_request,Signature=****
<Retention>
<Mode>COMPLIANCE</Mode>
<RetainUntilDate>2026-10-11T00:00:00.000Z</RetainUntilDate>
</Retention>アップロード時の保持ポリシー設定
オブジェクトをアップロードする際に、リクエストヘッダー内で直接保持ポリシーを設定できます。これにより、PutObjectRetention 操作を別途呼び出す必要がなくなります。この機能は、PutObject、CopyObject、および InitiateMultipartUpload 操作でサポートされています。
コンソール
OSS コンソールにログインし、対象バケットの オブジェクト管理 ページに移動します。
アップロード をクリックします。
アップロードパネルで、詳細設定 を展開し、デフォルトの保持ポリシー 設定を見つけます。
{policyType} を選択し、保持モード および 保持期間 を設定して、ファイルをアップロードします。
説明{policyType} を選択すると、アップロードされたオブジェクトは自動的にバケットのデフォルト保持ポリシーを継承します。
ossutil
ossutil の put-object API レベルコマンドを使用してファイルをアップロードする際は、--object-worm-mode および --object-worm-retain-until-date パラメーターを使用して保持ポリシーを指定します。
ossutil api put-object --bucket examplebucket --key exampleobject --body file://localfile.txt --object-worm-mode COMPLIANCE --object-worm-retain-until-date 2026-10-11T00:00:00.000ZSDK
以下のコード例は、PutObject 操作を呼び出してオブジェクトをアップロードする際に、保持ポリシーを設定する方法を示しています。
import alibabacloud_oss_v2 as oss
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = 'cn-hangzhou'
client = oss.Client(cfg)
# Upload the object and set a retention policy: compliance mode, retain until October 11, 2026.
result = client.put_object(oss.PutObjectRequest(
bucket='examplebucket',
key='exampleobject',
body='Hello OSS',
object_worm_mode='COMPLIANCE',
object_worm_retain_until_date='2026-10-11T00:00:00.000Z',
))
print(f'status code: {result.status_code}')import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.*;
import com.aliyun.sdk.service.oss2.transport.BinaryData;
public class UploadWithRetention {
public static void main(String[] args) {
OSSClient client = OSSClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region("cn-hangzhou")
.build();
try {
// Upload the object and set a retention policy: compliance mode, retain until October 11, 2026.
PutObjectResult result = client.putObject(PutObjectRequest.newBuilder()
.bucket("examplebucket")
.key("exampleobject")
.body(BinaryData.fromString("Hello OSS"))
.header("x-oss-object-worm-mode", "COMPLIANCE")
.header("x-oss-object-worm-retain-until-date", "2026-10-11T00:00:00.000Z")
.build());
System.out.printf("status code: %d%n", result.statusCode());
} finally {
client.close();
}
}
}package main
import (
"context"
"fmt"
"strings"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion("cn-hangzhou")
client := oss.NewClient(cfg)
// Upload the object and set a retention policy: compliance mode, retain until October 11, 2026.
request := &oss.PutObjectRequest{
Bucket: oss.Ptr("examplebucket"),
Key: oss.Ptr("exampleobject"),
Body: strings.NewReader("Hello OSS"),
RequestCommon: oss.RequestCommon{
Headers: map[string]string{
"x-oss-object-worm-mode": "COMPLIANCE",
"x-oss-object-worm-retain-until-date": "2026-10-11T00:00:00.000Z",
},
},
}
_, err := client.PutObject(context.TODO(), request)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Object uploaded with retention successfully")
}API
PutObject 操作を呼び出してオブジェクトをアップロードし、リクエストヘッダー内でその保持ポリシーを設定します。
PUT /exampleobject HTTP/1.1
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
x-oss-object-worm-mode: COMPLIANCE
x-oss-object-worm-retain-until-date: 2026-10-11T00:00:00.000Z
Content-MD5: B2M2Y8AsgTpgAmY7PhC****
Authorization: SignatureValue
[Object Content]注意事項
ヘッダー制限: バケットで ObjectWorm が有効になっていない場合、API リクエストに以下のヘッダーを含んではなりません:
x-oss-bypass-governance-retentionまたはx-amz-bypass-governance-retention。取り消し不可の機能: バケットで ObjectWorm を有効化すると、無効化できなくなります。この機能を有効化する前に、ビジネス要件を慎重に評価してください。
デフォルトポリシーの適用範囲: デフォルト保持ポリシーは、バケットにアップロードされた新規オブジェクトにのみ適用され、既存のオブジェクトには適用されません。既存のオブジェクトに保持ポリシーを設定するには、PutObjectRetention 操作を呼び出して個別に設定する必要があります。
オブジェクトポリシーの優先度: オブジェクトに独自の保持ポリシーが設定されている場合、そのポリシーはバケットのデフォルト保持ポリシーよりも優先されます。
保持期間の延長: コンプライアンスモードでは、既存の保持期限日を延長することしかできません。短縮はできません。
オブジェクトの削除: 保持期間中の保護対象オブジェクトは削除できません。
削除マーカー: ObjectWorm は削除マーカーを保護しないため、通常どおり作成およびクリアできます。ただし、保持期間中のオブジェクトバージョンは削除できません。
フラグメント: ObjectWorm はマルチパートアップロードで生成されたフラグメントを保護しません。
データレプリケーション: レプリケーションでは、オブジェクトの ObjectWorm 設定はコピーされません。送信先オブジェクトは、送信先バケットの ObjectWorm 設定に従い、別途設定する必要があります。
ライフサイクル管理: ObjectWorm が有効な場合でも、ライフサイクル管理ルールによってオブジェクトを他のストレージクラスにトランジションできます。ただし、保持期間中のオブジェクトは、有効期限ルールによって自動的に削除されません。
ログ転送: ObjectWorm が有効なバケットにログファイルを転送しないでください。古いログファイルが保持ポリシーによってロックされ、自動的に削除できなくなるため、ストレージコストが増加する可能性があります。
Append Object: Append Object 操作は、デフォルトのオブジェクトレベル保持ポリシーが設定されたバケットでは使用できません。この操作は ObjectWorm 設定をサポートしていないためです。
オブジェクト ACL: ObjectWorm 保持期間中のオブジェクトに対してオブジェクト ACL を設定することはできません。