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

Object Storage Service:最終アクセス時間に基づくライフサイクルルール

最終更新日:Jul 31, 2026

最終アクセス時間に基づくライフサイクルルールを使用すると、データアクセスパターンを自動的にモニタリングし、コールドデータを特定できます。その後、特定されたコールドデータを別のストレージクラスに移行できます。これにより、ホットデータとコールドデータの階層化ストレージを実装し、ストレージコストを削減できます。

利用シーン

  • マルチメディア

    ウェブサイトが動画や画像を OSS に保存している場合、時間の経過とともに、既存データは徐々にホットからコールドに移行します。長期間アクセスされていないデータを低頻度アクセスストレージクラスに移行したい場合があります。しかし、一部の古いデータは依然として人気があり、標準ストレージクラスに保持する必要があります。このシナリオでは、最終アクセス時間に基づくライフサイクルルールを使用して、ホットデータとコールドデータを自動的に特定し、階層化ストレージを実現することで、ストレージコストを削減します。

  • フォトアルバムまたはクラウドドライブ

    カスタムの移行期間を設定して、長期間アクセスされていないコールドデータを低頻度アクセスストレージクラスに自動的に移動させつつ、リアルタイムアクセスを確保できます。

  • ライフサイエンス

    遺伝子シーケンシングから生成される膨大なビジネスデータは、最終更新時間ではなく最終アクセス時間に基づいてホットまたはコールドに分類されることがよくあります。以前は、お客様はログを分析したり他の方法を使用したりして、手動でデータ階層化を管理するしかありませんでした。最終アクセス時間に基づくライフサイクルルールを使用すると、サーバーが自動的にホットデータとコールドデータを特定し、階層化ストレージを実装できます。また、同じライフサイクルルール内で最終アクセス時間と最終更新時間の両方に基づくポリシーを組み合わせて、より柔軟なデータ管理を行うこともできます。

制限事項

データ削除の不可

最終アクセス時間に基づくライフサイクルルールを使用してデータを削除することはできません。

マッチング条件

ライフサイクルルールは、プレフィックスとタグに基づくマッチングのみをサポートします。ワイルドカードマッチング、サフィックスマッチング、正規表現マッチングはサポートされていません。

パーツの有効期限切れに関する制限

オブジェクト名に重複するプレフィックスを持つオブジェクトに対して、パーツのライフサイクルポリシーを含むライフサイクルルールを 2 つ以上設定することはできません。例:

  • 例 1

    バケットに対してパーツポリシーを含むライフサイクルルールを設定した場合、そのバケット内のどのオブジェクトに対しても、パーツポリシーを含む別のライフサイクルルールを設定することはできません。

  • 例 2

    バケット内でプレフィックス dir1 を含むオブジェクトに対してパーツポリシーを含むライフサイクルルールを設定した場合、dir1/dir2 のような重複するプレフィックスを持つオブジェクトに対して、パーツポリシーを含む別のライフサイクルルールを設定することはできません。

注意事項

ルールの制限

1 つのバケットには、最大 1,000 個のライフサイクルルールを設定できます。1 つのライフサイクルルールには、最終更新時間に基づくポリシーと最終アクセス時間に基づくポリシーの両方を含めることができます。

上書きのセマンティクス

PutBucketLifecycle 操作を実行すると、バケットに既存のライフサイクルルール設定が上書きされます。たとえば、バケットに Rule1 という名前のライフサイクルルールが設定されていて、Rule2 という名前の別のライフサイクルルールを設定したい場合は、次の操作を実行します。

  • GetBucketLifecycle 操作を呼び出して Rule1 をクエリします。

  • Rule1 と Rule2 の両方をライフサイクルルール設定に追加します。

  • PutBucketLifecycle 操作を呼び出して、バケットに Rule1 と Rule2 を作成します。

有効になる時間

ライフサイクルルールが作成された後、OSS は 24 時間以内にルールをロードします。ルールがロードされた後、OSS は毎日 08:00 (UTC+8) にルールの実行を開始します。

実行完了時間

  • ルールが有効になった後、中国 (杭州)、中国 (上海)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、およびシンガポールリージョンでは、最大 10 億オブジェクトに対して、オブジェクトの削除、ストレージクラスの移行、マルチパートアップロードパーツの有効期限切れなどのライフサイクル操作が通常 24 時間以内に完了します。他のリージョンでは、これらの操作は通常、最大 1 億オブジェクトに対して 24 時間以内に完了します。

  • スキャン対象のオブジェクトが多い場合、ライフサイクルルールが適用されるオブジェクトが多い場合、タグが多い場合、単一オブジェクトのバージョンが多い場合、またはライフサイクルタスクの実行中に書き込まれる新しいオブジェクトの量が多い場合は、実行に 24 時間以上、場合によっては数日または数週間かかることがあります。

    説明

    バケットでバージョン管理が有効になっている場合、オブジェクトの各バージョンに対する操作は個別の操作としてカウントされます。

課金

  • オブジェクトのモニタリングおよび管理料金

    アクセス追跡を有効にすると、オブジェクトのモニタリングおよび管理料金が発生します。ただし、現在 OSS はこれらの料金を請求していません。

  • 低頻度アクセスの最低保存期間を満たさない場合の料金

    低頻度アクセスストレージクラスのオブジェクトには、30 日間の最低保存期間があります。オブジェクトが 30 日未満で保存された場合、最低期間の残りの部分に対して課金されます。以下の例は、この課金項目がライフサイクルルールとどのように連携するかを説明しています:

    例 1:ライフサイクルルールにより、標準オブジェクトが作成から 10 日後に低頻度アクセスストレージクラスに移行されます。5 日後、そのオブジェクトは標準ストレージクラスに戻されます。この場合、低頻度アクセスの最低保存期間要件を満たすために、15 日分のストレージ料金が課金されます。

    例 2:ライフサイクルルールにより、標準オブジェクトが作成から 10 日後に低頻度アクセスストレージクラスに移行されます。オブジェクトは 15 日後に削除されます。この場合、低頻度アクセスの最低保存期間要件を満たすために、5 日分のストレージ料金が課金されます。

    詳細については、「ストレージ料金」をご参照ください。

  • 低頻度アクセスのデータ取得料金

    低頻度アクセスストレージクラスのファイルへのアクセス料金は、取得されたデータ量に基づいて計算されます。詳細については、「データ処理料金」をご参照ください。

  • リクエスト料金

    ライフサイクルルールがオブジェクトのストレージクラスを移行する際に、リクエスト料金が発生します。詳細については、「リクエスト料金」をご参照ください。

その他の考慮事項

  • 最終アクセス時間の更新ポリシー:

    アクセス追跡を有効にすると、OSS は以下のルールに基づいてオブジェクトの LastAccessTime を更新します:

    1. 初期化:アクセス追跡が有効になると、OSS はバケット内のすべてのオブジェクトの LastAccessTime を、アクセス追跡が有効になった時刻に設定します。

    2. 更新ルール:初期化後、オブジェクトのダウンロードや上書きなどの操作により、オブジェクトの LastAccessTime が更新されます。どの操作がオブジェクトの LastAccessTime を更新するかについての詳細は、「一般的な操作がオブジェクトの最終アクセス時間に与える影響」をご参照ください。

    3. 更新メカニズム:

      • LastAccessTime は非同期で更新されます。更新は通常 24 時間以内に完了します。

      • 同じオブジェクトが 24 時間以内に複数回アクセスされた場合、OSS は最初のアクセスの時刻をオブジェクトの LastAccessTime として記録します。24 時間以内のその後のアクセスでは更新はトリガーされません。

  • 移行先のオブジェクトストレージクラス:

    • 最終アクセス時間に基づくライフサイクルルールは、オブジェクトを標準ストレージクラスから低頻度アクセスストレージクラスへの移行をサポートします。また、アクセス時にオブジェクトを自動的に標準ストレージクラスに戻すかどうかも選択できます。

    • 最終アクセス時間に基づくライフサイクルルールは、標準または低頻度アクセスストレージクラスから、アーカイブ、コールドアーカイブ、またはディープコールドアーカイブストレージクラスへのオブジェクトの移行をサポートします。また、アーカイブストレージクラスからコールドアーカイブまたはディープコールドアーカイブストレージクラスにオブジェクトを移行することもできます。標準または低頻度アクセスストレージクラスからアーカイブ、コールドアーカイブ、またはディープコールドアーカイブストレージクラスにオブジェクトを移行する場合は、チケットを送信して権限をリクエストしてください。リクエストが承認された後、トランジションの送信先ストレージクラスを指定する必要があります。

      重要

      チケットが承認された後、最終アクセス時間に基づくポリシーを使用してオブジェクトを標準または低頻度アクセスストレージクラスからアーカイブ、コールドアーカイブ、またはディープコールドアーカイブストレージクラスに移行する場合、移行先ストレージクラスのオブジェクトの最終アクセス時間は、バケットのアクセス追跡が有効になった時刻にデフォルトで設定されます。

  • OSS-HDFS が有効なバケットでのライフサイクルルールの設定:

    OSS-HDFS が有効なバケット内のすべてのオブジェクトに一致するように最終アクセス時間に基づくライフサイクルルールを設定または変更するには、NOT 要素を使用して .dlsdata/ ディレクトリに保存されているオブジェクトを除外します。これにより、ライフサイクルルールによってトリガーされるオブジェクトの削除またはストレージクラスの変換アクションが OSS-HDFS データに適用され、結果として OSS-HDFS データの読み取りおよび書き込み操作に影響が及ぶのを防ぎます。

操作手順

OSS コンソール

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

  2. 左側のナビゲーションウィンドウで バケット をクリックします。表示されたページで、対象のバケット名をクリックします。

  3. 左側のナビゲーションウィンドウで、データ管理 > ライフサイクル を選択します。

  4. ライフサイクル ページで、[アクセス追跡の有効化] スイッチをオンにし、ルールの作成 をクリックします。

  5. [ライフサイクルルールの作成] パネルで、以下の説明に基づいてライフサイクルルールを設定します。

    • バケットのバージョン管理が無効になっている場合

      セクション

      パラメーター

      説明

      基本設定

      ステータス

      ライフサイクルルールのステータスを設定します。[有効] または [無効] を選択できます。

      • ライフサイクルルールを有効にすると、OSS はルールに基づいてデータのストレージクラスを移行します。

      • ライフサイクルルールを無効にすると、ライフサイクルタスクは一時停止されます。

      ポリシー

      ライフサイクルルールを適用するオブジェクトを選択します。[指定されたプレフィックスを持つオブジェクト] または バケット全体に適用 を選択できます。

      重複するプレフィックスを許可

      デフォルトでは、OSS はライフサイクルルールのプレフィックスが重複しているかどうかをチェックします。たとえば、重複するプレフィックスを持つ次の 2 つのライフサイクルルールを設定したとします:

      • ルール 1

        バケット内のプレフィックス dir1/ を持つすべてのオブジェクトを、最終アクセス時間から 180 日後に低頻度アクセスストレージクラスに移行します。

      • ルール 2

        バケット内のプレフィックス dir1/dir2/ を持つすべてのオブジェクトを、最終アクセス時間から 30 日後にアーカイブストレージクラスに移行します。

      このオプションが選択されていない場合、dir1/dir2/ ディレクトリ内のオブジェクトが両方の移行ルールに一致するため、OSS はこの設定を拒否します。

      このオプションが選択されている場合、dir1/dir2/ ディレクトリ内のオブジェクトは 30 日後にアーカイブストレージクラスに移行されます。dir1/ ディレクトリ内の他のオブジェクトは 180 日後に低頻度アクセスストレージクラスに移行されます。

      接頭辞

      ルールが一致するオブジェクトのプレフィックスを入力します。

      • プレフィックスを img に設定すると、ルールは imgtest.png や img/example.jpg など、名前が img で始まるすべてのオブジェクトに一致します。

      • プレフィックスを img/ に設定すると、ルールは img/example.jpg や img/test.jpg など、名前が img/ で始まるすべてのオブジェクトに一致します。

      タグ

      ライフサイクルルールは、指定されたタグを持つオブジェクトにのみ適用されます。たとえば、[指定されたプレフィックスを持つオブジェクト] を選択し、プレフィックスを img に、タグキーを a、値を 1 に設定すると、ルールは名前が img で始まり、タグ a=1 を持つすべてのオブジェクトに一致します。オブジェクトタグの詳細については、「オブジェクトのタグ付け」をご参照ください。

      [NOT]

      NOT オプションを使用して、指定されたプレフィックスとタグを持つオブジェクトをライフサイクルルールから除外します。

      重要
      • NOT オプションが有効な場合、少なくともプレフィックスまたはタグを指定する必要があります。

      • NOT 条件で定義されたタグのキーは、タグ パラメーターで定義されたキーと同じにすることはできません。

      • NOT オプションが有効な場合、パーツの有効期限ポリシーを設定することはできません。

      ファイルサイズ

      ライフサイクルルールが適用されるオブジェクトサイズを指定します。

      • 最小サイズ:ライフサイクルルールは、この値より大きいオブジェクトに適用されます。値は 0 B より大きく、5 TB 未満である必要があります。

      • 最大サイズ:ライフサイクルルールは、この値より小さいオブジェクトに適用されます。値は 0 B より大きく、5 TB 以下である必要があります。

      重要

      同じライフサイクルルールで最小サイズと最大サイズの両方を設定する場合は、次の点に注意してください:

      • 最大サイズの値が最小サイズの値より大きいことを確認してください。

      • パーツの有効期限ポリシーを設定することはできません。

      • 削除マーカーをクリアするポリシーを設定することはできません。

      オブジェクトに対するポリシー

      オブジェクトのライフサイクル

      オブジェクトの有効期限ポリシーを選択します。[有効期間 (日数)][有効期限日]、または 有効になっていません を選択できます。有効になっていません を選択した場合、オブジェクトの有効期限ポリシーは有効になりません。

      ライフサイクルベースのルール

      オブジェクトのストレージクラスを移行するルールを設定します。データは次のストレージクラスに移行できます:

      • [IA (アクセス後も IA にデータを保持)]

      • [IA (アクセス後に標準に変換)]

      • アーカイブ

      • コールドアーカイブ

      • [ディープコールドアーカイブ]

      たとえば、[アクセス時間] ポリシーを選択し、[有効期間 (日数)] を 30 に設定し、指定された期間後にデータが自動的に [IA (アクセス後も IA にデータを保持)] に移行されるように指定した場合、2021 年 9 月 1 日に最後にアクセスされたオブジェクトは 2021 年 10 月 1 日にそのストレージクラスに移行されます。

      フラグメントに対するポリシー

      フラグメント期限切れポリシー

      期限切れのパーツに対して実行するアクションを設定します。タグ を指定している場合、このパラメーターは設定できません。パーツの有効期限ポリシーとして [有効期間 (日数)] または [有効期限日] を選択するか、有効になっていません を選択できます。有効になっていません を選択した場合、パーツの有効期限ポリシーは有効になりません。

      重要

      ライフサイクルルールには、少なくともオブジェクトの有効期限ポリシーまたはパーツの有効期限ポリシーのいずれかを含める必要があります。

      フラグメントに対するルール

      パーツの有効期限ポリシーで選択した有効期間または有効期限日に基づいて、パーツがいつ期限切れになるかを指定します。期限切れのパーツは自動的に削除され、回復することはできません。

    • バケットはバージョン管理が有効になっています。

      バージョン管理を有効にした後、基本設定 および フラグメントに対するポリシー セクションの設定項目は、バージョン管理が無効な場合と同じように設定されます。以下の表では、バージョン管理が有効な場合の設定の違いのみを説明します。

      セクション

      パラメーター

      説明

      現在のバージョンのポリシー

      [削除マーカーをクリア]

      バージョン管理を有効にすると、クリーンアップポリシーに [削除マーカーをクリア] オプションが追加されます。その他のオプションは、バージョン管理が無効な場合と同じです。

      このオプションを選択し、オブジェクトの現在のバージョンが唯一のバージョンであり、かつ削除マーカーである場合、OSS は期限切れのオブジェクトの削除マーカーを削除します。オブジェクトに複数のバージョンがあり、最新バージョンが削除マーカーである場合、OSS は削除マーカーを保持します。削除マーカーの詳細については、「削除マーカー」をご参照ください。

      以前のバージョンに対するポリシー

      オブジェクトのライフサイクル

      オブジェクトの非現行バージョンの有効期限ポリシーを設定します。[有効期間 (日数)] または 有効になっていません を選択できます。有効になっていません を選択した場合、オブジェクトの有効期限ポリシーは有効になりません。

      ライフサイクルベースのルール

      N 日間の期間を設定します。オブジェクトの非現行バージョンがアクセスされた後、N 日後に別のストレージクラスに移行されます。たとえば、期間を 30 日に設定した場合、2021 年 9 月 1 日にアクセスされた非現行バージョンは、2021 年 10 月 1 日に指定されたストレージクラスに移行されます。

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

    ルールを保存すると、ポリシーリストに表示されます。

SDK

Java、Go、Python、PHP 用の OSS SDK は、最終アクセス時間に基づくライフサイクルルールの作成をサポートしています。最終アクセス時間に基づくライフサイクルルールを作成する前に、指定されたバケットのアクセス追跡を有効にする必要があります。サンプルコードについては、「SDK の概要」をご参照ください。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.util.ArrayList;
import java.util.List;

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 {
            ossClient.putBucketAccessMonitor(bucketName, AccessMonitor.AccessMonitorStatus.Enabled.toString());
            // ライフサイクルルールを作成し、ID を rule1 に設定します。名前が logs プレフィックスを含み、サイズが 64 KB 以下のオブジェクトのストレージクラスを、オブジェクトが最後にアクセスされてから 30 日後に IA に変更するように指定します。さらに、名前が logs プレフィックスを含むオブジェクトが再度アクセスされた場合でも、IA オブジェクトとして保存されるように指定します。
            LifecycleRule lifecycleRule = new LifecycleRule("rule1", "logs", LifecycleRule.RuleStatus.Enabled);
            List<LifecycleRule> lifecycleRuleList = new ArrayList<LifecycleRule>();
            SetBucketLifecycleRequest setBucketLifecycleRequest = new SetBucketLifecycleRequest(bucketName);

            LifecycleRule.StorageTransition storageTransition = new LifecycleRule.StorageTransition();
            storageTransition.setStorageClass(StorageClass.IA);
            storageTransition.setExpirationDays(30);
            storageTransition.setIsAccessTime(true);
            storageTransition.setReturnToStdWhenVisit(false);
            storageTransition.setAllowSmallFile(true);
            List<LifecycleRule.StorageTransition> storageTransitionList = new ArrayList<LifecycleRule.StorageTransition>();
            storageTransitionList.add(storageTransition);
            lifecycleRule.setStorageTransition(storageTransitionList);
            lifecycleRuleList.add(lifecycleRule);
            
            // ライフサイクルルールを作成し、ID を rule2 に設定します。名前が dir プレフィックスを含み、サイズが 64 KB を超えるオブジェクトの以前のバージョンを、オブジェクトが最後にアクセスされてから 10 日後に IA に変更するように指定します。さらに、名前が dir プレフィックスを含むオブジェクトのストレージクラスが、オブジェクトが再度アクセスされた場合に標準に変更されるように指定します。
            LifecycleRule lifecycleRule2 = new LifecycleRule("rule2", "dir", LifecycleRule.RuleStatus.Enabled);
            LifecycleRule.NoncurrentVersionStorageTransition noncurrentVersionStorageTransition = new LifecycleRule.NoncurrentVersionStorageTransition();
            noncurrentVersionStorageTransition.setStorageClass(StorageClass.IA);
            noncurrentVersionStorageTransition.setNoncurrentDays(10);
            noncurrentVersionStorageTransition.setIsAccessTime(true);
            noncurrentVersionStorageTransition.setReturnToStdWhenVisit(true);
            noncurrentVersionStorageTransition.setAllowSmallFile(false);

            List<LifecycleRule.NoncurrentVersionStorageTransition> noncurrentVersionStorageTransitionList = new ArrayList<LifecycleRule.NoncurrentVersionStorageTransition>();
            noncurrentVersionStorageTransitionList.add(noncurrentVersionStorageTransition);
            lifecycleRule2.setNoncurrentVersionStorageTransitions(noncurrentVersionStorageTransitionList);
            lifecycleRuleList.add(lifecycleRule2);

            setBucketLifecycleRequest.setLifecycleRules(lifecycleRuleList);

            // ライフサイクルルールを設定します。
            ossClient.setBucketLifecycle(setBucketLifecycleRequest);
        } 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();
            }
        }
    }
}

Python

import argparse
import datetime
import alibabacloud_oss_v2 as oss

parser = argparse.ArgumentParser(description="put bucket lifecycle sample")
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
parser.add_argument('--bucket', help='バケットの名前。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')

def main():
  args = parser.parse_args()
  credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
  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)

  result = client.put_bucket_lifecycle(oss.PutBucketLifecycleRequest(
    bucket=args.bucket,
    lifecycle_configuration=oss.LifecycleConfiguration(
      rules=[
        oss.LifecycleRule(
          id='rule1',
          status='Enabled',
          prefix='data/',
          transitions=[oss.LifecycleRuleTransition(
            days=200,
            storage_class=oss.StorageClassType.IA,
            is_access_time=True,
            return_to_std_when_visit=False
          )]
        ),
        oss.LifecycleRule(
          id='rule2',
          status='Enabled',
          prefix='log/',
          transitions=[
            oss.LifecycleRuleTransition(
              days=120,
              storage_class=oss.StorageClassType.IA,
              is_access_time=True,
              return_to_std_when_visit=False
            ),
            oss.LifecycleRuleTransition(
              days=250,
              storage_class=oss.StorageClassType.ARCHIVE
              # is_access_time が設定されていない場合、ルールはデフォルトで最終更新時間に基づきます。
            )
          ]
        )
      ]
    )
  ))

  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 // バケットの名前。
)

// init 関数はコマンドライン引数を初期化します。
func init() {
	flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
	flag.StringVar(&bucketName, "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)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// バケットのライフサイクルルールを設定するリクエストを作成します。
	request := &oss.PutBucketLifecycleRequest{
		Bucket: oss.Ptr(bucketName), // バケットの名前。
		LifecycleConfiguration: &oss.LifecycleConfiguration{
			Rules: []oss.LifecycleRule{
				{
					// ライフサイクルルール "rule1" では、プレフィックス "data/" を持つすべてのオブジェクトを
					// 最終アクセスから 200 日後に低頻度アクセス (IA) ストレージクラスに移行します。
					// これらのオブジェクトが再度アクセスされても、IA ストレージクラスに留まります。
					ID:     oss.Ptr("rule1"),
					Status: oss.Ptr("Enabled"),
					Prefix: oss.Ptr("data/"),
					Transitions: []oss.LifecycleRuleTransition{
						{
							Days:                 oss.Ptr(int32(200)),
							StorageClass:         oss.StorageClassIA,
							IsAccessTime:         oss.Ptr(true), // 最終アクセス時間に基づくルールの場合は true に設定します。
							ReturnToStdWhenVisit: oss.Ptr(false),
						},
					},
				},
				{
					// ライフサイクルルール "rule2" では、プレフィックス "log/" を持つすべてのオブジェクトを
					// 最終アクセスから 120 日後に低頻度アクセス (IA) ストレージクラスに移行します。
					// これらのオブジェクトが再度アクセスされても、IA ストレージクラスに留まります。
					// 1 つのルールに IsAccessTime=true の Transition を複数含めることはできません。
					// 250 日のアーカイブ移行は、以下の別のルール (rule3) で設定されます。
					ID:     oss.Ptr("rule2"),
					Status: oss.Ptr("Enabled"),
					Prefix: oss.Ptr("log/"),
					Transitions: []oss.LifecycleRuleTransition{
						{
							Days:                 oss.Ptr(int32(120)),
							StorageClass:         oss.StorageClassIA,
							IsAccessTime:         oss.Ptr(true), // 最終アクセス時間に基づくルールの場合は true に設定します。
							ReturnToStdWhenVisit: oss.Ptr(false),
						},
					},
				},
				{
					// ライフサイクルルール "rule3" では、プレフィックス "log/" を持つすべてのオブジェクトを
					// 最終アクセスから 250 日後にアーカイブストレージクラスに移行します。
					// これらのオブジェクトが再度アクセスされても、アーカイブストレージクラスに留まります。
					// 1 つのルールに IsAccessTime=true の Transition を複数含めることはできないため、
					// このルールは rule2 とは別に設定されます。
					ID:     oss.Ptr("rule3"),
					Status: oss.Ptr("Enabled"),
					Prefix: oss.Ptr("log/"),
					Transitions: []oss.LifecycleRuleTransition{
						{
							Days:                 oss.Ptr(int32(250)),
							StorageClass:         oss.StorageClassArchive,
							IsAccessTime:         oss.Ptr(true), // 最終アクセス時間に基づくルールの場合は true に設定します。
							ReturnToStdWhenVisit: oss.Ptr(false),
						},
					},
				},
			},
		},
	}

	// バケットのライフサイクルルールを設定します。
	result, err := client.PutBucketLifecycle(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to put bucket lifecycle %v", err)
	}

	// ライフサイクルルールの設定結果を出力します。
	log.Printf("put bucket lifecycle result:%#v\n", result)
}

PHP

<?php

// 依存関係をロードするために autoload ファイルをインクルードします。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;
use AlibabaCloud\Oss\V2\Models\LifecycleConfiguration;

// コマンドラインパラメーターを記述します。
$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 Secret をロードします。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

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

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

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

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

// OSS クライアントインスタンスを作成します。
$client = new Oss\Client($cfg);

{}
$lifecycleRule = new Oss\Models\LifecycleRule(
    prefix: 'log/', // オブジェクト名のプレフィックス。
    transitions: array(
        new Oss\Models\LifecycleRuleTransition(
            days: 30, // 日数を指定します。
            storageClass: 'IA', // IA に変更します。
            isAccessTime: 'true', // 最終アクセス時間に基づいて変更をトリガーします。
            returnToStdWhenVisit: 'true' // アクセス後に標準ストレージクラスに戻します。
        )
    ),
    id: 'rule', // ルール ID。
    status: 'Enabled' // ルールを有効にします。
);

// ライフサイクル設定を作成し、ライフサイクルルールを設定に追加します。
$lifecycleConfiguration = new LifecycleConfiguration(
    rules: array($lifecycleRule)
);

// ライフサイクル設定を設定するリクエストを作成し、ライフサイクル設定を渡します。
$request = new Oss\Models\PutBucketLifecycleRequest(
    bucket: $bucket,
    lifecycleConfiguration: $lifecycleConfiguration
);

// putBucketLifecycle メソッドを呼び出してライフサイクルルールを設定します。
$result = $client->putBucketLifecycle($request);

// 結果を表示します。
printf(
    'status code:' . $result->statusCode . PHP_EOL . // HTTP 応答ステータスコード。
    'request id:' . $result->requestId . PHP_EOL // リクエスト ID。
);

ossutil

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

次の例は、examplebucket バケットのライフサイクルルールを設定する方法を示しています:

ossutil api put-bucket-lifecycle --bucket examplebucket--lifecycle-configuration "{\"Rule\":{\"ID\":\"rule1\",\"Prefix\":\"tmp/\",\"Status\":\"Enabled\",\"Expiration\":{\"Days\":\"10\"},\"Transition\":{\"Days\":\"5\",\"StorageClass\":\"IA\",\"IsAccessTime\":true,\"ReturnToStdWhenVisit\":true},\"AbortMultipartUpload\":{\"Days\":\"10\"}}}"

このコマンドの詳細については、「put-bucket-lifecycle」をご参照ください。

API リファレンス

上記の手順は API 呼び出しに基づいています。高度なカスタマイズが必要な場合は、REST API リクエストを直接送信できます。これには、署名を計算するための独自のコードを記述する必要があります。詳細については、「PutBucketLifecycle」をご参照ください。

よくある質問

バケット内の同じプレフィックスを持つオブジェクトに対して、一方が最終更新時間に基づき、もう一方が最終アクセス時間に基づく 2 つのライフサイクルルールを作成した場合、どうなりますか?

たとえば、examplebucket という名前の宛先バケットに対して 2 つのライフサイクルルールを作成します。ルール 1 は、doc プレフィックスを持つすべてのオブジェクトを最終更新時間から 30 日後に削除するように指定します。ルール 2 は、doc プレフィックスを持つすべてのオブジェクトを最終アクセス時間から 30 日後に低頻度アクセスストレージクラスに移行するように指定します。

OSS は、ユーザーのコストを最小化する原則に基づいてライフサイクルルールを実行します。したがって、ルール 1 のみが有効になります。これは、ルール 1 が一致するオブジェクトを 30 日後に削除し、その後は料金が発生しないように指定しているためです。対照的に、ルール 2 はオブジェクトを低頻度アクセスストレージクラスに移行するため、依然としてストレージ料金とデータ取得料金が発生します。

設定済みのライフサイクルルールへの変更はいつ有効になり、元のルールに一致したデータはどのように処理されますか?

たとえば、プレフィックス er を持つオブジェクトに対して、最終アクセスから 30 日後に低頻度アクセスストレージクラスに移行し、さらに 30 日後にアクセスされた場合は標準ストレージクラスに戻すというライフサイクルルールを設定したとします。しかし、最終アクセスから 35 日後に、ライフサイクルルールのプレフィックスを er から re に変更した場合、元のオブジェクトは低頻度アクセスストレージクラスに移行するだけです。その後の標準ストレージクラスへの移行は行われません。新しいルールに一致するオブジェクトの最終アクセス時間も、バケットのアクセス追跡が有効になった時点からカウントされます。

バージョン管理が有効なバケットでインテリジェント階層化が有効になっている場合、ストレージ階層はオブジェクトの異なるバージョンにどのように適用されますか?

バージョン管理が有効なバケット内の各オブジェクトには一意のバージョン ID があり、異なるバージョン ID を持つオブジェクトは互いに独立しています。したがって、オブジェクトの非現行バージョンが低頻度アクセスストレージクラスにある一方で、現行バージョンが標準ストレージクラスにある可能性があります。

アクセス追跡を無効にできますか?

はい、バケット内に最終アクセス時間に基づくライフサイクルルールが存在しない場合に限り可能です。アクセス追跡を無効にすると、システムはオブジェクトの最終アクセス時間の追跡を停止します。次回アクセス追跡を有効にすると、システムはすべてのオブジェクトの最終アクセス時間を更新します。

関連ドキュメント

最終アクセス時間 (LastAccessTime) はオブジェクトの重要な属性であり、課金やライフサイクルルールなどのシナリオで使用されます。バケットのアクセス追跡を有効にすると、オブジェクトに対する一部の操作によって LastAccessTime が更新される場合があります。詳細については、「一般的な操作がオブジェクトの最終アクセス時間に与える影響」をご参照ください。