最終アクセス時間に基づくライフサイクルルールを使用して、アクセス パターンを監視し、コールド データを費用対効果の高いストレージ クラスに自動的に移動することで、Object Storage Service (OSS) でのデータ ストレージの全体的なストレージ コストを削減できます。
シナリオ
メディア Web サイトの管理者として、コールド データ(アクセス頻度の低いデータ)とホット データ(アクセス頻度の高いデータ)を識別する必要があります。 従来の方法では、通常、手動によるログ分析が必要でした。 しかし、最終アクセス時間に基づくライフサイクルルールを適用することで、アクセス パターンの認識を自動化し、階層型ストレージを容易にすることができます。
たとえば、examplebucket バケット内の異なるディレクトリに異なるアクセス パターンのオブジェクトを保存し、一定期間後にオブジェクトを費用対効果の高いストレージ クラスに移動できます。
ディレクトリ | データ ストレージ | ライフサイクルルール | 効果 |
data/ | アップロード後 2 か月間はアクセスされる可能性がありますが、その後はほとんどアクセスされない WMV ライブストリーミング録画が含まれています。 | 最終アクセスから 200 日後にオブジェクトのストレージ クラスを低頻度アクセス (IA) に変更し、再度アクセスされた後もオブジェクトを IA に保持します。 | ライフサイクルルールの基準を満たすオブジェクトは、指定された期間後に指定されたストレージ クラスに移動されます。 基準を満たさないオブジェクトは、標準ストレージ クラスのままになります。 |
アップロード後 6 か月間は頻繁にアクセスされると予想される MP4 ムービーが含まれています。 | |||
log/ | 多数のログが含まれており、そのうちいくつかはアップロード後 3 か月間はアクセスされると予想されます。 ディレクトリ内のすべてのログは、アップロード後 6 か月でほとんどアクセスされなくなると予想されます。 |
|
最終アクセス時間に基づくライフサイクルルールを設定すると、OSS はコールド データとホット データを自動的に区別し、階層型ストレージを実装します。 たとえば、data/ ディレクトリにある頻繁にアクセスされる MP4 ビデオは標準ストレージ クラスを維持し、アップロード後 200 日間アクセスされなかったビデオは IA ストレージ クラスに移動されます。 最終更新時間に基づくライフサイクルルールを設定して data/ ディレクトリ内のオブジェクトのストレージ クラスを変更したり、オブジェクトを削除したりすると、アクセス パターンに基づいて自動ストレージ階層化を実装することはできません。
このシナリオ例でのライフサイクル構成は、デモ用です。 実際のビジネス要件に基づいてライフサイクルルールを設定する必要があります。
前提条件
オブジェクトのストレージ クラスを標準または IA からアーカイブ、コールドアーカイブ、またはディープコールドアーカイブに変換するには、提交工单 権限を申請する必要があります。
申請が承認された後、最終アクセス時間に基づくライフサイクルルールを使用してオブジェクトを標準または IA からアーカイブ、コールドアーカイブ、またはディープコールドアーカイブに移動する場合、アーカイブ、コールドアーカイブ、またはディープコールドアーカイブ オブジェクトの最終アクセス時間は、バケットのアクセス追跡が有効になった時間です。
手順
OSS コンソールを使用する
アクセス追跡を有効にします。
OSS コンソール にログインします。
左側のナビゲーション ウィンドウで、バケット をクリックします。「バケットリスト」ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、データ管理 > ライフサイクル を選択します。
ライフサイクル ページで、アクセス追跡の有効化 をオンにします。
説明デフォルトでは、OSS はアクセス追跡を有効にした時間をバケット内のすべてのオブジェクトの最終アクセス時間として使用します。
ライフサイクルルールを設定します。
ライフサイクル ページで、ルールの作成 をクリックします。
[ルールの作成] パネルで、名前にプレフィックス data/ と log/ がそれぞれ含まれるオブジェクトに適用されるライフサイクルルールを設定します。
data/ ディレクトリ内のオブジェクトのライフサイクルルール
次の表に示すパラメータを設定し、その他のパラメータについてはデフォルト設定を保持します。
パラメータ
説明
ステータス
[有効] を選択します。
ポリシー
[指定されたプレフィックスを持つオブジェクト] を選択します。
接頭辞
data/
と入力します。オブジェクトのライフサイクル
[有効期間 (日数)] を選択します。
ライフサイクルベースのルール
最初のドロップダウンリストから [アクセス時間] を選択し、テキストボックスに 200 と入力し、2 番目のドロップダウンリストから [IA (アクセス後変換なし)] を選択します。
log/ ディレクトリ内のオブジェクトのライフサイクルルール
次の表に示すパラメータを設定し、その他のパラメータについてはデフォルト設定を保持します。
パラメータ
説明
ステータス
[有効] を選択します。
ポリシー
[指定されたプレフィックスを持つオブジェクト] を選択します。
接頭辞
log/
と入力します。オブジェクトのライフサイクル
[有効期間 (日数)] を選択します。
ライフサイクルベースのルール
最初のドロップダウンリストから [アクセス時間] を選択し、テキストボックスに 120 と入力し、2 番目のドロップダウンリストから [IA (アクセス後変換なし)] を選択します。
最初のドロップダウンリストから [アクセス時間] を選択し、テキストボックスに 250 と入力し、2 番目のドロップダウンリストから [アーカイブ] を選択します。
[OK] をクリックします。
OSS SDK を使用する
最終アクセス時間に基づくライフサイクルルールは、Java、Python、Go の 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.AccessMonitor; 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()); } 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
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # エンドポイントにマッピングされるリージョンの ID を指定します。 例: cn-hangzhou。 このパラメータは、署名アルゴリズム V4 を使用する場合は必須です。 region = "cn-hangzhou" # バケットの名前を指定します。 bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region) # バケットのアクセス追跡を有効にします。 バケットのアクセス追跡を有効にした後、アクセス追跡ステータスを「無効」に変更する場合は、最終アクセス時間に基づいて設定されたライフサイクルルールがバケットにないことを確認してください。 bucket.put_bucket_access_monitor("Enabled")
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(®ion, "region", "", "バケットが配置されているリージョン。") flag.StringVar(&bucketName, "bucket", "", "バケットの名前。") } // バケットのアクセス追跡を有効にするために使用される main 関数。 func main() { // コマンドライン パラメータを解析します。 flag.Parse() // バケットの名前が指定されているかどうかを確認します。 if len(bucketName) == 0 { flag.PrintDefaults() log.Fatalf("無効なパラメータ、バケット名が必要です") } // リージョンが指定されているかどうかを確認します。 if len(region) == 0 { flag.PrintDefaults() log.Fatalf("無効なパラメータ、リージョンが必要です") } // デフォルト設定を読み込み、認証情報プロバイダとリージョンを指定します。 cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). WithRegion(region) // OSS クライアントを作成します。 client := oss.NewClient(cfg) // バケットのアクセス追跡を有効にするリクエストを作成します。 request := &oss.PutBucketAccessMonitorRequest{ Bucket: oss.Ptr(bucketName), AccessMonitorConfiguration: &oss.AccessMonitorConfiguration{ Status: oss.AccessMonitorStatusEnabled, // アクセス追跡を有効にします。 }, } // アクセス追跡を有効にします。 putResult, err := client.PutBucketAccessMonitor(context.TODO(), request) if err != nil { log.Fatalf("バケット アクセス モニターの設定に失敗しました %v", err) } // 結果を表示します。 log.Printf("バケット アクセス モニターの設定結果: %#v\n", putResult) }
名前に
data/
とlog/
プレフィックスがそれぞれ含まれるオブジェクトの最終アクセス時間に基づくライフサイクルルールを設定します。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.*; import java.util.ArrayList; import java.util.List; public class Lifecycle { 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"; // OSSClient インスタンスを作成します。 // OSSClient が不要になったら、shutdown メソッドを呼び出してリソースを解放します。 OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { String ruleId1 = "rule1"; String ruleId2 = "rule2"; // data/ プレフィックスを指定します。 String matchPrefix = "data/"; // log/ プレフィックスを指定します。 String matchPrefix2 = "log/"; SetBucketLifecycleRequest request = new SetBucketLifecycleRequest(bucketName); // rule1 を設定して、名前に data/ プレフィックスが含まれるオブジェクトのストレージ クラスを、最終アクセスから 200 日後に IA に変更します。 オブジェクトが再度アクセスされたときに IA ストレージ クラスに留まるように指定します。 List<LifecycleRule.StorageTransition> storageTransitions = new ArrayList<LifecycleRule.StorageTransition>(); LifecycleRule.StorageTransition storageTransition = new LifecycleRule.StorageTransition(); storageTransition.setStorageClass(StorageClass.IA); storageTransition.setExpirationDays(200); storageTransition.setIsAccessTime(true); storageTransition.setReturnToStdWhenVisit(false); storageTransitions.add(storageTransition); LifecycleRule rule = new LifecycleRule(ruleId1, matchPrefix, LifecycleRule.RuleStatus.Enabled); rule.setStorageTransition(storageTransitions); request.AddLifecycleRule(rule); // rule2 を設定して、名前に log/ プレフィックスが含まれるオブジェクトのストレージ クラスを、最終アクセスから 120 日後に IA に変更します。 オブジェクトが再度アクセスされたときに IA ストレージ クラスに留まるように指定します。 List<LifecycleRule.StorageTransition> storageTransitions2 = new ArrayList<LifecycleRule.StorageTransition>(); LifecycleRule.StorageTransition storageTransition2 = new LifecycleRule.StorageTransition(); storageTransition2.setStorageClass(StorageClass.IA); storageTransition2.setExpirationDays(120); storageTransition2.setIsAccessTime(true); storageTransition2.setReturnToStdWhenVisit(false); storageTransitions2.add(storageTransition2); // rule2 を設定して、名前に log/ プレフィックスが含まれるオブジェクトのストレージ クラスを、最終アクセスから 250 日後にアーカイブに変更します。 LifecycleRule.StorageTransition storageTransition3 = new LifecycleRule.StorageTransition(); storageTransition3.setStorageClass(StorageClass.Archive); storageTransition3.setExpirationDays(250); storageTransition3.setIsAccessTime(true); storageTransition3.setReturnToStdWhenVisit(false); storageTransitions2.add(storageTransition3); LifecycleRule rule2 = new LifecycleRule(ruleId2, matchPrefix2, LifecycleRule.RuleStatus.Enabled); rule2.setStorageTransition(storageTransitions2); request.AddLifecycleRule(rule2); VoidResult result = ossClient.setBucketLifecycle(request); System.out.println("Returned status code: "+result.getResponse().getStatusCode()+" set lifecycle succeed"); } 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
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider from oss2.models import LifecycleRule, BucketLifecycle, StorageTransition # 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 # バケットの名前を指定します。 例: examplebucket。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # rule1 を設定して、名前に data/ プレフィックスが含まれるオブジェクトのストレージ クラスを、最終アクセスから 200 日後に IA に変更します。 オブジェクトが再度アクセスされたときに IA ストレージ クラスに留まるように指定します。 rule1 = LifecycleRule('rule1', 'data/', status=LifecycleRule.ENABLED) rule1.storage_transitions = [StorageTransition(days=200, storage_class=oss2.BUCKET_STORAGE_CLASS_IA, is_access_time=True, return_to_std_when_visit=False)] # rule2 を設定して、名前に log/ プレフィックスが含まれるオブジェクトのストレージ クラスを、最終アクセスから 120 日後に IA に変更します。 オブジェクトが再度アクセスされたときに IA ストレージ クラスに留まるように指定します。 # 名前に log/ プレフィックスが含まれるオブジェクトのストレージ クラスを、最終アクセスから 250 日後にアーカイブに変更します。 rule2 = LifecycleRule('rule2', 'log/', status=LifecycleRule.ENABLED) rule2.storage_transitions = [StorageTransition(days=120, storage_class=oss2.BUCKET_STORAGE_CLASS_IA, is_access_time=True, return_to_std_when_visit=False), StorageTransition(days=250, storage_class=oss2.BUCKET_STORAGE_CLASS_ARCHIVE, is_access_time=True, return_to_std_when_visit=False)] lifecycle = BucketLifecycle([rule1, rule2]) # ライフサイクルルールを作成します。 result = bucket.put_bucket_lifecycle(lifecycle) print('ライフサイクルルールが設定されました。 ステータス: ' + str(result.status))
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(®ion, "region", "", "バケットが配置されているリージョン。") flag.StringVar(&bucketName, "bucket", "", "バケットの名前。") } func main() { // コマンドライン パラメータを解析します。 flag.Parse() // バケットの名前が指定されているかどうかを確認します。 if len(bucketName) == 0 { flag.PrintDefaults() log.Fatalf("無効なパラメータ、バケット名が必要です") } // リージョンが指定されているかどうかを確認します。 if len(region) == 0 { flag.PrintDefaults() log.Fatalf("無効なパラメータ、リージョンが必要です") } // デフォルト設定を読み込み、認証情報プロバイダとリージョンを指定します。 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 ストレージ クラスに留まるように指定します。 // 名前に log/ プレフィックスが含まれるオブジェクトのストレージ クラスを、最終アクセスから 250 日後にアーカイブに変更します。 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), }, { Days: oss.Ptr(int32(250)), StorageClass: oss.StorageClassArchive, IsAccessTime: oss.Ptr(true), ReturnToStdWhenVisit: oss.Ptr(false), }, }, }, }, }, } // バケットのライフサイクルルールを設定します。 result, err := client.PutBucketLifecycle(context.TODO(), request) if err != nil { log.Fatalf("バケット ライフサイクルの設定に失敗しました %v", err) } // 結果を表示します。 log.Printf("バケット ライフサイクルの設定結果:%#v\n", result) }
ossutil を使用する
アクセス追跡を有効にします。
ローカルの config1.xml ファイルにアクセス追跡ステータス設定を作成します。
<?xml version="1.0" encoding="UTF-8"?> <AccessMonitorConfiguration> <Status>Enabled</Status> </AccessMonitorConfiguration>
バケットのアクセス追跡を有効にします。
ossutil access-monitor --method put oss://examplebucket/ config.xml
data/ ディレクトリと log/ ディレクトリにあるオブジェクトの最終アクセス時間に基づくライフサイクルルールを設定します。
ローカルの config2.xml ファイルに次のライフサイクルルールを設定します。
<?xml version="1.0" encoding="UTF-8"?> <LifecycleConfiguration> <Rule> <ID>rule1</ID> <Prefix>data/</Prefix> <Status>Enabled</Status> <Transition> <Days>200</Days> <StorageClass>IA</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> </Rule> <Rule> <ID>rule2</ID> <Prefix>log/</Prefix> <Status>Enabled</Status> <Transition> <Days>120</Days> <StorageClass>IA</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> <Transition> <Days>250</Days> <StorageClass>Archive</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> </Rule> </LifecycleConfiguration>
ライフサイクルルールをバケットに適用します。
ossutil lifecycle --method put oss://examplebucket config2.xml
OSS API を使用する
高度なカスタマイズが必要な場合は、OSS RESTful API を直接呼び出すことができます。 API を直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「PutBucketAccessMonitor」および「PutBucketLifecycle」をご参照ください。