最終変更時刻が特定の期間内の Object Storage Service (OSS) オブジェクトをフィルタリングする場合、データインデックス機能を使用できます。オブジェクトの最終変更時刻の開始日と終了日をインデックス条件として指定して、オブジェクトクエリの効率を向上させることができます。この機能は、監査証跡、データ同期、定期バックアップ、コスト分析、またはその他のビジネスシナリオにおける時間依存オブジェクトの正確な取得に適しています。
シナリオ
監査とコンプライアンスの要件
企業または組織は、コンプライアンスを確保するためにデータ活動を定期的にレビューする必要があります。特定の期間内にアップロードされたオブジェクトをクエリすると、データライフサイクルの管理、データの生成と変更履歴の追跡、およびデータの監査に役立ちます。
データのバックアップと復元
バックアップポリシーを指定してバックアップまたはリカバリ操作を実行する場合、指定された時間範囲内に新しく追加または更新されたオブジェクトをクエリすると、バックアップターゲットを特定するのに役立ち、ストレージの使用量と転送コストを削減できます。
データ分析とレポート生成
ビッグデータ分析、ログ処理、またはビジネスレポート作成を含むアプリケーションの場合、特定の期間内に生成された新しいデータを毎日、毎週、または毎月など、定期的に処理する必要があります。特定の期間内に生成されたオブジェクトをクエリすると、分析するデータセットをすばやく特定し、データ抽出プロセスを簡素化できます。
コンテンツ管理システムによって実行されるデータ同期
コンテンツ管理システムは、アップロードまたは更新されたオブジェクトを定期的に同期して、Web サイトコンテンツの適時性と整合性を維持する必要があります。
コストの最適化とリソースの削除
企業は、不要になったオブジェクトを定期的にレビューして削除する必要があります。特定の期間内に更新されていないオブジェクトをクエリすると、不要になったオブジェクトを特定するのに役立ちます。これにより、リソースの効率的な使用が保証されます。
トラブルシューティングと問題の追跡
システム障害、データ損失、または異常な動作が発生した場合、特定の期間内にアップロードされたオブジェクトをクエリすると、エンジニアは問題の原因となっている可能性のあるオブジェクトまたは操作をすばやく特定できます。
コラボレーションとバージョン管理
マルチユーザーコラボレーション環境では、特定の期間内にアップロードされたオブジェクトをクエリすると、履歴バージョンを特定の時点まで参照、比較、または復元できます。
手順
OSS コンソールを使用する
OSS コンソール にログインします。
左側のナビゲーションウィンドウで、バケット をクリックします。[バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、オブジェクト管理 > データのインデックス作成 を選択します。
データのインデックス作成 ページで、メタデータ管理 をオンにします。
メタデータ管理が有効になるまでの時間は、バケット内のオブジェクトの数によって異なります。
[OSS メタデータ条件] セクションで、[最終変更日時] の右側に開始日と終了日を指定します。開始日と終了日の値は秒単位まで正確です。他のパラメーターについては、デフォルト設定を保持します。
オブジェクトのソート順 セクションで、[並べ替え順序] を [昇順] に、[並べ替え基準] を [オブジェクト名] に設定します。
クエリ をクリックします。
OSS SDK を使用する
データインデックス機能を使用して特定の条件を満たすオブジェクトをクエリできるのは、OSS SDK for Java、OSS SDK for Python、および OSS SDK for Go のみです。データインデックス機能を使用してバケット内のオブジェクトをクエリする前に、バケットのメタデータ管理機能を有効にする必要があります。
Java
package com.aliyun.sts.sample;
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.*;
public class Demo {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
private static String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// エンドポイントにマップするリージョンの ID を指定します。例: cn-hangzhou。
private static String region = "cn-hangzhou";
// バケットの名前を指定します。例: examplebucket。
private static String bucketName = "examplebucket";
public static void main(String[] args) throws Exception {
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// OSSClient インスタンスを作成します。
// OSSClient が不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// V4 署名アルゴリズムの使用を明示的に宣言します。
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 返すオブジェクトの最大数を 100 に設定します。
int maxResults = 100;
// クエリするオブジェクトの最終変更時刻の開始日と終了日を指定します。この例では、開始日は 2023 年 12 月 1 日、終了日は 2024 年 3 月 31 日に設定されています。
String query = "{\n" +
" \"SubQueries\":[\n" +
" {\n" +
" \"Field\":\"FileModifiedTime\",\n" +
" \"Value\": \"2023-12-01T00:00:00.000+08:00\",\n" +
" \"Operation\":\"gt\"\n" +
" }, \n" +
" {\n" +
" \"Field\":\"FileModifiedTime\",\n" +
" \"Value\": \"2024-03-31T23:59:59.000+08:00\",\n" +
" \"Operation\":\"lt\"\n" +
" }\n" +
" ],\n" +
" \"Operation\":\"and\"\n" +
"}";
// 返される結果がオブジェクト名で昇順にソートされるように指定します。
String sort = "Filename";
DoMetaQueryRequest doMetaQueryRequest = new DoMetaQueryRequest(bucketName, maxResults, query, sort);
doMetaQueryRequest.setOrder(SortOrder.ASC);
DoMetaQueryResult doMetaQueryResult = ossClient.doMetaQuery(doMetaQueryRequest);
if (doMetaQueryResult.getFiles() != null) {
for (ObjectFile file : doMetaQueryResult.getFiles().getFile()) {
System.out.println("Filename: " + file.getFilename());
// オブジェクトのコンテンツを識別するために使用される ETag 値をクエリします。
System.out.println("ETag: " + file.getETag());
// オブジェクトのアクセス制御リスト (ACL) をクエリします。
System.out.println("ObjectACL: " + file.getObjectACL());
// オブジェクトのタイプをクエリします。
System.out.println("OssObjectType: " + file.getOssObjectType());
// オブジェクトのストレージクラスをクエリします。
System.out.println("OssStorageClass: " + file.getOssStorageClass());
// オブジェクトのタグの数をクエリします。
System.out.println("TaggingCount: " + file.getOssTaggingCount());
if (file.getOssTagging() != null) {
for (Tagging tag : file.getOssTagging().getTagging()) {
System.out.println("Key: " + tag.getKey());
System.out.println("Value: " + tag.getValue());
}
}
if (file.getOssUserMeta() != null) {
for (UserMeta meta : file.getOssUserMeta().getUserMeta()) {
System.out.println("Key: " + meta.getKey());
System.out.println("Value: " + meta.getValue());
}
}
}
}
} catch (OSSException oe) {
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("Error Message: " + ce.getMessage());
} finally {
// OSSClient インスタンスをシャットダウンします。
ossClient.shutdown();
}
}
}Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import MetaQuery, AggregationsRequest
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
# バケットの名前を指定します。例: examplebucket。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'examplebucket0703')
# クエリするオブジェクトの最終変更時刻の開始日と終了日を指定します。この例では、開始日は 2023 年 12 月 1 日、終了日は 2024 年 3 月 31 日に設定されています。
do_meta_query_request = MetaQuery(max_results=100, query='{"SubQueries":[{"Field":"FileModifiedTime","Value": "2023-12-01T00:00:00.000+08:00","Operation":"gt"}, {"Field":"FileModifiedTime","Value": "2024-03-31T23:59:59.000+08:00","Operation":"lt"}],"Operation":"and"}', sort='Filename', order='asc')
result = bucket.do_bucket_meta_query(do_meta_query_request)
for s in result.files:
print(s.file_name)
print(s.etag)
print(s.oss_object_type)
print(s.oss_storage_class)
print(s.oss_crc64)
print(s.object_acl)Go
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID と OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClient インスタンスを作成します。
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。実際のエンドポイントを指定してください。
client, err := oss.New("oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// クエリするオブジェクトの最終変更時刻の開始日と終了日を指定します。この例では、開始日は 2023 年 12 月 1 日、終了日は 2024 年 3 月 31 日に設定されています。
query := oss.MetaQuery{
NextToken: "",
MaxResults: 100,
Query: `{
"SubQueries":[
{
"Field":"FileModifiedTime",
"Value": "2023-12-01T00:00:00.000+08:00",
"Operation":"gt"
},
{
"Field":"FileModifiedTime",
"Value": "2024-03-31T23:59:59.000+08:00",
"Operation":"lt"
}
],
"Operation":"and"
}`,
// 返される結果がオブジェクト名で昇順にソートされるように指定します。
Sort: "Filename",
Order: "asc",
}
// 特定の条件に一致するオブジェクトをクエリし、特定のフィールドとソート方法に基づいてオブジェクト情報を一覧表示します。
result, err := client.DoMetaQuery("examplebucket", query)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("NextToken:%s\n", result.NextToken)
for _, file := range result.Files {
fmt.Printf("File name: %s\n", file.Filename)
fmt.Printf("size: %d\n", file.Size)
fmt.Printf("File Modified Time:%s\n", file.FileModifiedTime)
fmt.Printf("Oss Object Type:%s\n", file.OssObjectType)
fmt.Printf("Oss Storage Class:%s\n", file.OssStorageClass)
fmt.Printf("Object ACL:%s\n", file.ObjectACL)
fmt.Printf("ETag:%s\n", file.ETag)
fmt.Printf("Oss CRC64:%s\n", file.OssCRC64)
fmt.Printf("Oss Tagging Count:%d\n", file.OssTaggingCount)
for _, tagging := range file.OssTagging {
fmt.Printf("Oss Tagging Key:%s\n", tagging.Key)
fmt.Printf("Oss Tagging Value:%s\n", tagging.Value)
}
for _, userMeta := range file.OssUserMeta {
fmt.Printf("Oss User Meta Key:%s\n", userMeta.Key)
fmt.Printf("Oss User Meta Key Value:%s\n", userMeta.Value)
}
}
}
RESTful API を使用する
ビジネスで高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。API を直接呼び出すには、コードに署名計算を含める必要があります。詳細については、「DoMetaQuery」をご参照ください。
参考資料
データインデックス機能は、ストレージクラス、ACL、オブジェクトサイズなど、複数のフィルタリング条件をサポートしており、特定の条件を満たすオブジェクトを効率的にフィルタリングできます。たとえば、バケット内で ACL が 公開読み取り であるオブジェクト、またはサイズが 64 KB 未満のオブジェクトをクエリできます。詳細については、「データインデックス」をご参照ください。