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

Object Storage Service:保持ポリシー

最終更新日:Dec 05, 2024

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

前提条件

  • 保持ポリシーを設定するバケットは、次のいずれかのリージョンにあります。中国 (杭州) 、中国 (上海) 、中国 (福州-地方地域) 、中国 (青島) 、中国 (北京) 、中国 (張家口) 、中国 (フフホト) 、中国 (ウランカブ) 、中国 (深セン) 、中国 (河源) 、中国 (広州) 、中国 (成都) 、中国 (香港) 、米国 (シリコンバレー) 、日本、東京、韓国 (ソウル) 、シンガポール、マレーシア (クアラルンプール) 、インドネシア (ジャカルタ) 、フィリピン (マニラ) 、タイ (バンコク) 、ドイツ (フランクフルト) 、英国 (ロンドン) 、アラブ首長国連邦 (ドバイ).

  • 保持ポリシーを設定するバケットのバージョン管理は有効になっていません。 バージョン管理の詳細については、「概要」をご参照ください。

シナリオ

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

説明

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

使用上の注意

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

  • OSS-HDFSの有効化とバケットの保持ポリシーの設定を同時に行うことは推奨しません。

    たとえば、保持ポリシーが設定されているバケットでは、OSS-HDFSが有効になっています。 OSS-HDFSでサポートされているメソッドを使用して、. dlsdata /ディレクトリに移動すると、オブジェクトが削除されたことを示すメッセージが表示されます。 ただし、保存期間内に削除が発生した場合、OSSは実際にオブジェクトを保持し、保存期間の終了後にオブジェクトを認識して削除することはできません。

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

保持ポリシーの説明

  • 実装

    デフォルトでは、バケットに対してポリシーが作成された後、時間ベースの保持ポリシーは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.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.InitiateBucketWormRequest;
import com.aliyun.oss.model.InitiateBucketWormResult;

public class Demo {

    public static void main(String[] args) throws Exception {
        // In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the name of the bucket. Example: examplebucket. 
        String bucketName = "examplebucket";
        // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. 
        String region = "cn-hangzhou";

        // Create an OSSClient instance. 
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // Create an InitiateBucketWormRequest object. 
            InitiateBucketWormRequest initiateBucketWormRequest = new InitiateBucketWormRequest(bucketName);
            // Set the retention period to 1 day. 
            initiateBucketWormRequest.setRetentionPeriodInDays(1);

            // Create a retention policy. 
            InitiateBucketWormResult initiateBucketWormResult = ossClient.initiateBucketWorm(initiateBucketWormRequest);

            // Display the ID of the retention policy. 
            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
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.  
$provider = new EnvironmentVariableCredentialsProvider();
// In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint. 
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket= "<yourBucketName>";

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);

try {
    // Create a retention policy and set the retention period to 30 days. 
    $wormId = $ossClient->initiateBucketWorm($bucket, 30);

    // Query the ID of the retention policy. 
    print($wormId);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n"); 

Node.js

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

const client = new OSS({
  // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou. 
  region: 'yourregion',
  // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,  
  authorizationV4: true,
  // Specify the name of your bucket.
  bucket: 'yourBucketName',
});
// Create a retention policy. 
async function initiateBucketWorm() {
 // Specify the name of the bucket. 
  const bucket = 'yourbucketname'
  // Specify the retention period of the retention policy. 
  const days = '<Retention Days>'
    const res = await client.initiateBucketWorm(bucket, days)
  console.log(res.wormId)
}

initiateBucketWorm()

Python

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"

# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Create a retention policy and set the retention period to 1 day. 
result = bucket.init_bucket_worm(1)
# Query the ID of the retention policy. 
print(result.worm_id)

行く

package main

import (
	"log"

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

func main() {
	// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error creating credentials provider: %v", err)
	}

	// Create an OSSClient instance.
	// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. 
	// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Specify the version of the signature algorithm.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error creating OSS client: %v", err)
	}

	// Specify the name of the bucket for which you want to configure a retention policy. 
	bucketName := "<yourBucketName>"

	// Set the retention period of the retention policy to 60 days.
	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)
{
    /* Initialize information about the account that is used to access OSS. */
            
    /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
    std::string Endpoint = "yourEndpoint";
    /* Specify the name of the bucket. Example: examplebucket. */
    std::string BucketName = "examplebucket";

      /* Initialize resources, such as network resources. */
      InitializeSdk();

      ClientConfiguration conf;
      /* Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
  
      /* Create a retention policy and set the retention period to 10 days. */
      auto outcome = client.InitiateBucketWorm(InitiateBucketWormRequest(BucketName, 10));

      if (outcome.isSuccess()) {      
            std::cout << " InitiateBucketWorm success " << std::endl;
            std::cout << "WormId:" << outcome.result().WormId() << std::endl;
      }
      else {
        /* Handle exceptions. */
        std::cout << "InitiateBucketWorm fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
      }

      /* Release resources, such as network resources. */
      ShutdownSdk();
      return 0;
}

ossutilの使用

ossutilを使用して保持ポリシーを構成できます。 詳細については、「ワーム (保持ポリシーの管理) 」をご参照ください。

OSS APIの使用

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

よくある質問

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

保持ポリシーは、安全で準拠したデータストレージを提供します。 保持ポリシーの保持期間内では、データを変更または削除することはできません。 RAM (Resource Access Management) ポリシーとバケットポリシーを使用してデータを保護する場合、データを変更または削除できます。

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

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

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

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

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

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

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

いいえ、バケット内の特定のオブジェクトに対して保持ポリシーを設定することはできません。 保持ポリシーはバケットレベルでのみ設定できます。 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を使用して、保持ポリシーを作成または削除できます。