すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:保持ポリシー

最終更新日:Jul 29, 2025

Object Storage Service (OSS) の保持ポリシーの Write Once Read Many (WORM) 機能を使用すると、ユーザーがデータを変更または削除できないようにすることができます。 リソース所有者を含む誰もが、特定の期間内にバケット内のオブジェクトを変更または削除できないようにするには、バケットの保持ポリシーを設定できます。 指定された保持期間が終了するまでは、バケットへのオブジェクトのアップロードまたはバケットからのオブジェクトの読み取りのみが可能です。 オブジェクトの変更または削除は、保持期間が終了した後でのみ可能です。

前提条件

バージョン管理は、保持ポリシーを設定するバケットでは有効になっていません。

シナリオ

OSS の保持ポリシーによって提供される WORM 機能は、企業が米国証券取引委員会 (SEC) および金融取引業規制機構 (FINRA) の規制およびコンプライアンス要件を満たすのに役立ちます。 この機能は、金融、保険、ヘルスケア、証券などのセクター、および多層防御スキーム (MLPS) ログデータの監査などのシナリオに適しています。

説明

OSS は Cohasset Associates によって認定および監査されており、電子記録の保持に関する厳格な要件を満たしています。 保持ポリシーが設定された OSS バケットは、SEC Rule 17a-4(f)、CFTC Rule 1.31(c)-(d)、FINRA Rule 4511(c) などの規制規則に準拠しています。 詳細については、「OSS Cohasset Assessment Report」をご参照ください。

注意事項

  • 保持ポリシーは、OSS のバケットに対してのみ設定できます。

  • バケットで OSS-HDFS を有効にし、保持ポリシーを同時に設定することはできません。

  • 保持期間中、ライフサイクルルールを設定して、バケット内のオブジェクトのストレージタイプを変更できます。 この方法で、コストを削減し、コンプライアンスを確保できます。 詳細については、「最終更新時刻に基づくライフサイクルルール」をご参照ください。

保持ポリシーの説明

  • 実装

    デフォルトでは、時間ベースの保持ポリシーは、バケットに対してポリシーが作成された後、IN_PROGRESS 状態になります。 保持ポリシーは 24 時間 IN_PROGRESS 状態のままです。 保持ポリシーは、ポリシーが作成されてから 24 時間以内に、バケット内の指定されたリソースを保護します。

    • 保持ポリシーが作成されてから 24 時間以内

      • 保持ポリシーがロックされていない場合、バケット所有者と承認されたユーザーはポリシーを削除できます。

      • 保持ポリシーがロックされている場合、ポリシーの保持期間を短縮したり、ポリシーを削除したりすることはできません。 ただし、保持期間を延長することはできます。

      • 保持ポリシーがロックされている場合、バケット内のデータは保持ポリシーによって保護されます。 バケット内のデータを削除または変更しようとすると、409 FileImmutable エラーが返されます。

    • 保持ポリシーが作成されてから 24 時間後

      保持ポリシーが作成されてから 24 時間以内に保持ポリシーがロックされていない場合、ポリシーは無効になります。 ポリシーを削除できます。

  • 削除

    • 時間ベースの保持ポリシーは、バケットのメタデータ属性です。 バケットが削除されると、バケットの保持ポリシーも削除されます。

    • 保持ポリシーが作成されてから 24 時間以内にロックされていない場合、バケット所有者と承認されたユーザーはポリシーを削除できます。

    • バケットに保持期間内に保護されているオブジェクトが含まれている場合、バケットまたは保持ポリシーを削除することはできません。

  • たとえば、2022 年 6 月 1 日にバケットに対して保持期間が 30 日の保持ポリシーを作成し、すぐにポリシーをロックしたとします。 file1.txt、file2.txt、file3.txt オブジェクトを異なる時点でバケットにアップロードしました。 次の表は、オブジェクトのアップロード日と有効期限を示しています。

    オブジェクト

    アップロード日

    有効期限

    file1.txt

    2022 年 4 月 1 日

    2022 年 4 月 30 日

    file2.txt

    2022 年 6 月 1 日

    2022 年 6 月 30 日

    file3.txt

    2022 年 9 月 1 日

    2022 年 9 月 30 日

メソッド

OSS コンソールを使用する

  1. 保持ポリシーを作成します。

    1. OSS コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、バケット をクリックします。 [バケット] ページで、保持ポリシーを作成するバケットの名前をクリックします。

    3. 左側のナビゲーションツリーで、コンテンツセキュリティ > 保持ポリシー を選択します。

    4. 保持ポリシー ページで、ポリシーの作成 をクリックします。

    5. ポリシーの作成 ダイアログボックスで、保持期間 フィールドに保持期間を指定します。

      説明

      保持期間は日単位で測定されます。 有効な値: 1 ~ 25550。

    6. OK をクリックします。

      説明

      保持ポリシーは IN_PROGRESS 状態です。 保持ポリシーは 24 時間 IN_PROGRESS 状態のままです。 保持ポリシーは、ポリシーが作成されてから 24 時間以内にバケット内のリソースを保護します。 保持ポリシーが不要な場合は、作成後 24 時間以内にポリシーを削除できます。

  2. 保持ポリシーをロックします。

    1. [保持ポリシー] ページで、ロック をクリックします。

    2. 表示されるメッセージで、OK をクリックします。

      重要

      時間ベースの保持ポリシーがロックされると、保持期間を短縮したり、保持ポリシーを削除したりすることはできません。 保持期間中は、バケット内のデータを変更または削除することはできません。

  3. (オプション) 保持ポリシーの保持期間を変更します。

    1. [保持ポリシー] ページで、編集 をクリックします。

    2. [編集] ダイアログボックスで、保持期間を変更します。

      重要

      保持期間を延長することはできますが、短縮することはできません。

OSS SDK を使用する

次のサンプルコードは、一般的なプログラミング言語の OSS SDK を使用して保持ポリシーを設定する方法の例を示しています。 その他のプログラミング言語の OSS SDK を使用して保持ポリシーを設定するためのサンプルコードの詳細については、「概要」をご参照ください。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.InitiateBucketWormRequest;
import com.aliyun.oss.model.InitiateBucketWormResult;

public class Demo {

    public static void main(String[] args) throws Exception {
        // この例では、中国 (杭州) リージョンのエンドポイントが使用されています。 実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。 例: examplebucket。
        String bucketName = "examplebucket";
        // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient が不要になったら、shutdown メソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // InitiateBucketWormRequest オブジェクトを作成します。
            InitiateBucketWormRequest initiateBucketWormRequest = new InitiateBucketWormRequest(bucketName);
            // 保持期間を 1 日に設定します。
            initiateBucketWormRequest.setRetentionPeriodInDays(1);

            // 保持ポリシーを作成します。
            InitiateBucketWormResult initiateBucketWormResult = ossClient.initiateBucketWorm(initiateBucketWormRequest);

            // 保持ポリシーの ID を表示します。
            String wormId = initiateBucketWormResult.getWormId();
            System.out.println(wormId);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

PHP

<?php

// 依存ライブラリを読み込むために autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// コマンドラインパラメータの説明を指定します。
$optsdesc = [
    "region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
];

// コマンドラインパラメータを解析するために、長いオプションリストを生成します。
$longopts = \array_map(function ($key) {
    return "$key:"; // 各パラメータの末尾にコロン (:) を追加して、値が必要であることを示します。
}, array_keys($optsdesc));

// コマンドラインパラメータを解析します。
$options = getopt("", $longopts); 

// 必要なパラメータが設定されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // 必要なパラメータが設定されていないことを指定します。
        exit(1); 
    }
}

// コマンドラインパラメータの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。

// 環境変数を使用して AccessKey ID と AccessKey シークレットを読み込みます。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト設定を使用します。
$cfg = Oss\Config::loadDefault();

// 認証プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);

// リージョンを指定します。
$cfg->setRegion($region);

// エンドポイントが提供されている場合は、エンドポイントを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// InitiateBucketWormRequest オブジェクトを作成して、バケットの保持ポリシーを作成し、保持ポリシーの保持期間を 3 日に設定します。
$request = new Oss\Models\InitiateBucketWormRequest(
    bucket: $bucket, 
    initiateWormConfiguration: new Oss\Models\InitiateWormConfiguration(
        retentionPeriodInDays: 3 // 保持期間を 3 日に設定します。
));

// initiateBucketWorm メソッドを使用して、バケットの保持ポリシーを作成します。
$result = $client->initiateBucketWorm($request);

// 返された結果を表示します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // 返された HTTP ステータスコード。
    'request id:' . $result->requestId . PHP_EOL . // リクエストの ID。リクエストの一意の識別子です。
    'worm id:' . $result->wormId // 保持ポリシーの ID。
);

Node.js

const OSS = require('ali-oss');

const client = new OSS({
  // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
  region: 'yourregion',
  // 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,  
  authorizationV4: true,
  // バケットの名前を指定します。
  bucket: 'yourBucketName',
});
// 保持ポリシーを作成します。
async function initiateBucketWorm() {
 // バケットの名前を指定します。
  const bucket = 'yourbucketname'
  // 保持ポリシーの保持期間を指定します。
  const days = '<Retention Days>'
    const res = await client.initiateBucketWorm(bucket, days)
  console.log(res.wormId)
}

initiateBucketWorm()

Python

import argparse
import alibabacloud_oss_v2 as oss

# コマンドラインパラメータパーサーを作成し、スクリプトの目的を説明します。 この例では、Write Once Read Many (WORM) 機能を使用してバケットの保持ポリシーを作成する方法について説明します。
parser = argparse.ArgumentParser(description="initiate bucket worm sample")

# --region パラメータを指定します。これは、バケットが配置されているリージョンを指定します。 このコマンドラインパラメータは必須です。
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
# --bucket パラメータを指定します。これは、バケットの名前を指定します。 このコマンドラインパラメータは必須です。
parser.add_argument('--bucket', help='バケットの名前。', required=True)
# --endpoint パラメータを指定します。これは、バケットが配置されているリージョンのエンドポイントを指定します。 このコマンドラインパラメータはオプションです。
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
# --retention_period_in_days パラメータを指定します。これは、オブジェクトを保持できる日数を指定します。 このコマンドラインパラメータは必須です。
parser.add_argument('--retention_period_in_days', help='オブジェクトを保持できる日数。', required=True)

def main():
    # コマンドラインパラメータを解析して、ユーザーが指定した値を取得します。
    args = parser.parse_args()

    # OSS にアクセスするために必要な認証情報を環境変数から読み込みます。
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # SDK のデフォルト設定を使用して設定オブジェクトを作成し、認証プロバイダーを指定します。
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

    # カスタムエンドポイントが提供されている場合は、設定オブジェクトの endpoint パラメータを変更します。
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # 前述の設定を使用して OSSClient インスタンスを初期化し、インスタンスが OSS と対話できるようにします。
    client = oss.Client(cfg)

    # バケットの保持ポリシーを作成するリクエストを送信します。
    result = client.initiate_bucket_worm(oss.InitiateBucketWormRequest(
        bucket=args.bucket, # バケットの名前。
        initiate_worm_configuration=oss.InitiateWormConfiguration(
            retention_period_in_days=int(args.retention_period_in_days), # オブジェクトを保持できる日数。 値を整数に設定します。
        ),
    ))

    # 操作の HTTP ステータスコード、リクエスト ID、および保持ポリシー ID を表示して、リクエストステータスを確認します。
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' worm id: {result.worm_id}'
    )

# スクリプトが直接実行されたときに main 関数を呼び出して処理ロジックを開始します。
if __name__ == "__main__":
    main() # スクリプトの関数のエントリポイントを指定します。 制御プログラムフローはここから開始されます。

Go

package main

import (
	"log"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error creating credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 実際のエンドポイントを指定してください。
	// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 実際のリージョンを指定してください。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 署名アルゴリズムのバージョンを指定します。
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error creating OSS client: %v", err)
	}

	// 保持ポリシーを設定するバケットの名前を指定します。
	bucketName := "<yourBucketName>"

	// 保持ポリシーの保持期間を 60 日に設定します。
	result, err := client.InitiateBucketWorm(bucketName, 60)
	if err != nil {
		log.Fatalf("Error initiating bucket WORM: %v", err)
	}

	log.Println("WORM policy initiated successfully:", result)
}

C++

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS にアクセスするために使用するアカウントに関する情報を初期化します。 */
            
    /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
    std::string Endpoint = "yourEndpoint";
    /* バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 */
    std::string Region = "yourRegion";
    /* バケットの名前を指定します。 例: examplebucket。 */
    std::string BucketName = "examplebucket";

      /* ネットワークリソースなどのリソースを初期化します。 */
      InitializeSdk();

      ClientConfiguration conf;
      conf.signatureVersion = SignatureVersionType::V4;
      /* 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);
  
      /* 保持ポリシーを作成し、保持期間を 1 日に設定します。 */
      auto outcome = client.InitiateBucketWorm(InitiateBucketWormRequest(BucketName, 1));

      if (outcome.isSuccess()) {      
            std::cout << " InitiateBucketWorm success " << std::endl;
            std::cout << "WormId:" << outcome.result().WormId() << std::endl;
      }
      else {
        /* 例外を処理します。 */
        std::cout << "InitiateBucketWorm fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
      }

      /* ネットワークリソースなどのリソースを解放します。 */
      ShutdownSdk();
      return 0;
}

ossutil を使用する

ossutil を使用して WORM ポリシーを設定できます。 ossutil のインストール方法の詳細については、「ossutil のインストール」をご参照ください。

次のサンプルコードは、examplebucket の WORM ポリシーを設定し、保持期間を 365 日に設定する方法を示しています。

ossutil api initiate-bucket-worm --bucket examplebucket --initiate-worm-configuration "{\"RetentionPeriodInDays\":\"365\"}"

詳細については、「initiate-bucket-worm」をご参照ください。

関連 API 操作

上記の操作は基本的に RESTful API に基づいて実装されており、ビジネスで高度なカスタマイズが必要な場合は、API を直接呼び出すことができます。 API を直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「InitiateBucketWorm」をご参照ください。

よくある質問

保持ポリシーのメリットは何ですか?

保持ポリシーは、安全でコンプライアンスに準拠したデータストレージを提供します。 保持ポリシーの保持期間中は、データを変更または削除することはできません。 Resource Access Management (RAM) ポリシーとバケットポリシーを使用してデータを保護する場合でも、データは変更または削除される可能性があります。

どのようなシナリオで保持ポリシーが必要ですか?

医療記録、技術文書、契約などの重要なデータをバケットに長期間保存し、データの変更や削除を禁止したい場合は、バケットの保持ポリシーを設定できます。

保持ポリシーを削除できますか?

保持ポリシーのステータスによって異なります。

  • 保持ポリシーがロックされていない場合は、バケットオーナーまたは承認済みユーザーとしてポリシーを削除できます。

  • 保持ポリシーがロックされている場合、ポリシーは削除できません。

バケット内の特定のオブジェクトに保持ポリシーを設定できますか?

いいえ、バケット内の特定のオブジェクトに保持ポリシーを設定することはできません。保持ポリシーはバケット レベルでのみ設定できます。 OSS は、ディレクトリ レベルまたはオブジェクト レベルの保持ポリシーをサポートしていません。

保持ポリシーで保護されているオブジェクトの有効期限を計算するにはどうすればよいですか?

保持ポリシーで保護されているオブジェクトの有効期限を計算するには、保持ポリシーで指定された保持期間をオブジェクトが最後に変更された日付に加算します。たとえば、バケットの保持期間が 10 日で、バケット内のオブジェクトが最後に変更されたのが 2022 年 2 月 15 日の場合、オブジェクトの有効期限は 2022 年 2 月 25 日です。

保持ポリシーで保護されているバケットを削除するにはどうすればよいですか?

  • バケットにオブジェクトが含まれていない場合は、バケットを直接削除できます。

  • バケットにオブジェクトが含まれていて、保持期間が経過している場合は、バケット内のすべてのオブジェクトを削除した後にバケットを削除できます。 バケット内のオブジェクトを削除せずにバケットを削除すると、削除エラーが表示されます。

  • 保持期間内に保護されているオブジェクトがバケットに含まれている場合は、バケットを削除できません。

Alibaba Cloud アカウントの OSS の支払いが遅延している場合、保持ポリシーの保持期間内に保護されているオブジェクトは保持されますか?

Alibaba Cloud アカウントの支払いが遅延している場合、アクティブな保持ポリシーに関係なく、支払い遅延によるサービス停止に関するポリシーに従って Alibaba Cloud はオブジェクトを削除することにご注意ください。

承認された RAM ユーザーは保持ポリシーを設定できますか?

はい、承認された RAM ユーザーは保持ポリシーを設定できます。保持ポリシーに関連する API 操作を使用できます。これらの API 操作は RAM ポリシーをサポートしています。関連する RAM ポリシーがアタッチされている RAM ユーザーは、OSS コンソールで、または OSS API 操作もしくは OSS SDK を使用して、保持ポリシーを作成または削除できます。