バケットインベントリ機能は、定期的にバケットをスキャンし、サイズやストレージクラスなどのオブジェクトメタデータを含む CSV ファイルを生成します。ListObjects API を使用してオブジェクトを 1 つずつ一覧表示すると、時間やコストがかかりすぎる場合に使用します。
制限
-
バケットインベントリは、特定のリージョンにあるバケットでのみ利用できます。
-
増分インベントリ機能を使用するには、テクニカルサポート にお任せください。
ユースケース
OSS は、フルインベントリと増分インベントリを提供します。フルインベントリは、特定の時点ですべてのオブジェクトのスナップショットを作成します。一方、増分インベントリは、タイムウィンドウ内に追加または変更されたオブジェクトを取得します。フルインベントリは日次または週次で生成され、増分インベントリは 約 10 分ごとに生成されます。ユースケースには、以下のようなものがあります。
-
1 回限りのデータ分析:フルインベントリ ルールを設定して、オフライン分析用の完全なメタデータスナップショットを生成します。
-
継続的なデータ分析:フルインベントリと増分インベントリを組み合わせて、統一されたメタデータテーブルを構築します。オブジェクトメタデータを独自のテーブルに書き込み、Spark クラスターまたは分析エンジンでクエリを実行します。
仕組み
-
フルインベントリ:バケット内のすべてのオブジェクトの完全なスナップショットを日次または週次で生成します。
-
権限の取得:OSS は、事前に承認された RAM ロールを引き受けて、ソースバケットをスキャンし、デスティネーションバケットにレポートを書き込みます。
-
オブジェクトのスキャン:OSS は、インベントリ ルールのフィルター条件 (プレフィックス、バージョンステータス、作成時刻、またはサイズ) に基づいて、一致するすべてのオブジェクトをスキャンします。
-
インベントリレポートの生成:OSS は、スキャン結果を集約し、Gzip で圧縮された CSV ファイルをデスティネーションバケットに書き込みます。
-
-
増分インベントリ:約10分ごとに生成され、オブジェクトの変更イベント (作成、メタデータの更新、削除) を取得します。
-
権限の取得:OSS は、事前に承認された RAM ロールを引き受けて、ソースバケットのログをスキャンし、デスティネーションバケットにレポートを書き込みます。
-
増分ログのスキャン:OSS は、インベントリ ルールのフィルター条件 (プレフィックス) に基づいて、増分ログをスキャンします。
-
インベントリレポートの生成:OSS は、スキャン結果をバックエンドパーティションごとに集約し、CSV ファイルをデスティネーションバケットに書き込みます。
-
インベントリの生成は非同期で実行されるため、通常のバケットアクセスには影響しません。
サービスロールの作成
OSS インベントリは、RAM ロールを使用してソースバケットから読み取り、送信先バケットに書き込みます。最小権限の原則に従って、専用のサービスロールを作成します。
コンソールからインベントリを設定する場合、システムは自動的にAliyunOSSRoleという名前のロールを作成します。このデフォルトのロールを自分で作成せずに使用することもできます。ただし、このロールはアカウント内のすべてのバケットに対する完全な管理権限を持っています。本番環境ではAliyunOSSRoleを使用しないでください。
最小権限のロールを手動で作成するには、次の手順に従ってください。
-
RAM ロールを作成する: RAM ロールの作成ページに移動します。 信頼されたエンティティタイプ で、 クラウドサービス を選択します。 信頼されたサービス で、 OSS を選択します。
-
RAM ロールに送信先バケットへの書き込み権限を付与する:
-
ポリシーの作成ページで、 スクリプトエディター タブをクリックします。次のポリシーをポリシーエディターに貼り付け、
dest-bucketを送信先バケットの名前に置き換えます。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": [ "acs:oss:*:*:dest-bucket/*" ] } ] } -
(オプション) KMS 暗号化権限を設定する:インベントリレポートを KMS キーで暗号化する必要がある場合は、RAM ロールに
AliyunKMSCryptoUserAccess権限、またはより詳細な KMS 関連の権限も付与する必要があります。 -
権限付与ページで、 権限の追加 をクリックします。 プリンシパル で、作成した RAM ロールを選択します。 許可ポリシー で、先ほど作成したポリシーを選択します。 次に、 権限付与の確認 をクリックします。
-
-
ロール ARN を記録する: ロールページで、作成した RAM ロールを見つけます。 基本情報 ページに移動し、ロールの ARN をコピーします。インベントリ ルールを作成する際にロール ARN が必要になります。 ARN の形式は
acs:ram::{AccountID}:role/{RoleName}です。
フルインベントリ
フルインベントリは、バケット内または指定されたプレフィックス配下にあるすべてのオブジェクトをスキャンします。注:
-
インベントリレポートは、スキャン開始時点のスナップショットです。スキャン中の変更は反映されない場合があります。
-
最初のレポートは直ちに生成されます。その後のレポートは、早朝のバッチ処理 (UTC+08:00) で日次または週次で生成されます。レイテンシーは、オブジェクト数とタスクキューの深さによって決まります。
インベントリ ルール
コンソール
-
OSS コンソールにログインします。
-
インベントリを生成するソースバケットに移動します。左側メニューで、[データ管理] > [バケットインベントリ] を選択します。
-
バケットインベントリ ページで、インベントリの作成 をクリックします。
-
インベントリの作成 パネルで、 次のパラメーターを設定します。
パラメーター
説明
ステータス
インベントリ設定のステータスを設定します。起動 を選択します。
[スタイル名]
インベントリ設定の一意の ID を入力します。ID には、小文字、数字、ハイフン (-) のみを使用でき、ハイフン (-) で開始または終了することはできません。
送信先バケット
インベントリの送信先を指定します。送信先バケットは、ソースバケットと同じリージョンおよび Alibaba Cloud アカウントに存在する必要があります。
-
インベントリを
examplebucketバケットのexampledir1/プレフィックスに保存するには、exampledir1/を入力します。プレフィックスが存在しない場合、Object Storage Service (OSS) が自動的に作成します。 -
このフィールドを空白のままにすると、インベントリは送信先バケットのルートディレクトリに保存されます。
重要OSS-HDFS サービスへの影響やデータ破損のリスクを防ぐため、OSS-HDFS が有効になっているバケットのインベントリを設定する場合、送信先のプレフィックスを
.dlsdata/に設定しないでください。スコープ
-
[バケット全体]:バケット内のすべてのオブジェクトをスキャンします。
-
オブジェクトプレフィックス:exampledir1/ など、特定のプレフィックスを持つオブジェクトのみをスキャンします。
[暗号化の方法]
インベントリファイルを暗号化するかどうかを選択します。
-
[なし]:インベントリは暗号化されません。
-
[AES256]:AES256 暗号化アルゴリズムを使用してインベントリを暗号化します。
-
[KMS]:Key Management Service (KMS) キーを使用してインベントリを暗号化します。OSS が管理する KMS キーを使用するか、送信先バケットと同じリージョンに KMS キーを作成することができます。
[周波数]
インベントリを生成する頻度を選択します。オプションは [週次]、[日次]、または [1 回限りのエクスポート] です。バケットに 100 億個を超えるオブジェクトが含まれている場合は、コストとスキャンの負荷を軽減するために [週次] を選択します。
[リスト内容]
インベントリに含めるオブジェクト情報を選択します。
-
システムメタデータ:[オブジェクトサイズ]、[ストレージクラス]、[最終更新日]、ETag、[TransitionTime]、[マルチパートアップロードステータス]、[暗号化ステータス]、ファイル ACL、ファイルタイプ、CRC64、[最終アクセス時刻]、[最終アクセスタイムスタンプ]。
説明[最終アクセス時刻] および [最終アクセスタイムスタンプ] フィールドをエクスポートするには、まずバケットのアクセス追跡を有効にする必要があります。有効にしていない場合、これらのフィールドの値は null になります。
-
カスタムメタデータ:[タグ数]
[高度なフィルタリング]
重要次のフィルターオプションは、中国 (青島)、中国 (フフホト)、ドイツ (フランクフルト) リージョンでのみサポートされます。
エクスポートするオブジェクトをサイズまたは最終更新日時でフィルタリングするには、高度なフィルタリング トグルをオンにします。
サポートされているフィルターオプションは次のとおりです。
-
期間:エクスポートするオブジェクトの最終更新日時の開始時刻と終了時刻を設定します。時刻は秒単位の精度です。
-
オブジェクトサイズの範囲:エクスポートするオブジェクトの最小サイズと最大サイズを設定します。
重要最小値と最大値は 0 B より大きい必要があります。最大値は 48.8 TB を超えることはできません。
-
ストレージクラス:エクスポートするストレージクラスを指定します。標準、低頻度アクセス、アーカイブ、コールドアーカイブ、ディープコールドアーカイブの各ストレージクラスからオブジェクトをエクスポートできます。
[オブジェクトバージョン]
バケットでバージョニングが有効になっている場合、[現行バージョン] または [すべてのバージョン] をエクスポートすることを選択できます。
-
-
[Alibaba Cloud OSS にバケットリソースへのアクセス権限を付与することを理解し、同意します] を選択し、OK をクリックします。
バケットに多数のオブジェクトが含まれている場合、インベントリの生成に時間がかかることがあります。インベントリが生成されたかどうかを確認する方法については、「インベントリが生成されたかどうかの確認方法」をご参照ください。
SDK
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";
// インベントリ結果を格納するバケットの名前を指定します。
String destBucketName ="yourDestinationBucketName";
// 宛先バケットが属するアカウントの ID を指定します。
String accountId ="yourDestinationBucketAccountId";
// ソースバケットからすべてのオブジェクトを読み取り、宛先バケットにファイルを書き込む権限を持つ RAM ロールを指定します。
String roleArn ="yourDestinationBucketRoleArn";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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 {
// インベントリ設定を作成します。
InventoryConfiguration inventoryConfiguration = new InventoryConfiguration();
// インベントリルール名を設定します。
String inventoryId = "testid";
inventoryConfiguration.setInventoryId(inventoryId);
// インベントリに含めるオブジェクトプロパティを設定します。
List<String> fields = new ArrayList<String>();
fields.add(InventoryOptionalFields.Size);
fields.add(InventoryOptionalFields.LastModifiedDate);
fields.add(InventoryOptionalFields.IsMultipartUploaded);
fields.add(InventoryOptionalFields.StorageClass);
fields.add(InventoryOptionalFields.ETag);
fields.add(InventoryOptionalFields.EncryptionStatus);
inventoryConfiguration.setOptionalFields(fields);
// インベントリの生成スケジュールを設定します。次の例では、スケジュールを週次に設定します。Weekly はインベントリが週に 1 回生成されることを示します。Daily はインベントリが 1 日に 1 回生成されることを示します。
inventoryConfiguration.setSchedule(new InventorySchedule().withFrequency(InventoryFrequency.Weekly));
// インベントリに含めるオブジェクトのバージョンを現在のバージョンに設定します。このパラメーターを InventoryIncludedObjectVersions.All に設定すると、バージョン管理が有効な場合、すべてのオブジェクトバージョンが含まれます。
inventoryConfiguration.setIncludedObjectVersions(InventoryIncludedObjectVersions.Current);
// インベントリ設定を有効にするかどうかを指定します。値を true に設定するとインベントリ設定が有効になり、false に設定すると無効になります。
inventoryConfiguration.setEnabled(true);
// プレフィックスでオブジェクトをフィルタリングするためのインベントリフィルター ルールを設定します。
InventoryFilter inventoryFilter = new InventoryFilter().withPrefix("obj-prefix");
inventoryConfiguration.setInventoryFilter(inventoryFilter);
// インベントリ結果を格納する宛先バケットの設定を作成します。
InventoryOSSBucketDestination ossInvDest = new InventoryOSSBucketDestination();
// インベントリ結果のストレージパスのプレフィックスを設定します。
ossInvDest.setPrefix("destination-prefix");
// インベントリフォーマットを設定します。
ossInvDest.setFormat(InventoryFormat.CSV);
// 宛先バケットのユーザー AccountId を設定します。
ossInvDest.setAccountId(accountId);
// 宛先バケットのロール ARN を設定します。
ossInvDest.setRoleArn(roleArn);
// 宛先バケットの名前を設定します。
ossInvDest.setBucket(destBucketName);
// KMS を使用してインベントリを暗号化するには、次の設定を使用します。
// InventoryEncryption inventoryEncryption = new InventoryEncryption();
// InventoryServerSideEncryptionKMS serverSideKmsEncryption = new InventoryServerSideEncryptionKMS().withKeyId("test-kms-id");
// inventoryEncryption.setServerSideKmsEncryption(serverSideKmsEncryption);
// ossInvDest.setEncryption(inventoryEncryption);
// OSS サーバ側暗号化を使用してインベントリを暗号化するには、次の設定を使用します。
// InventoryEncryption inventoryEncryption = new InventoryEncryption();
// inventoryEncryption.setServerSideOssEncryption(new InventoryServerSideEncryptionOSS());
// ossInvDest.setEncryption(inventoryEncryption);
// インベントリの宛先を設定します。
InventoryDestination destination = new InventoryDestination();
destination.setOssBucketDestination(ossInvDest);
inventoryConfiguration.setDestination(destination);
// インベントリ設定を設定します。
ossClient.setBucketInventoryConfiguration(bucketName, inventoryConfiguration);
} 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();
}
}
}
}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,
// バケットの名前。
bucket: 'yourbucketname'
});
const inventory = {
// インベントリ ID。
id: 'default',
// インベントリが有効かどうかを指定します。有効な値は true と false です。
isEnabled: false,
// (任意) オブジェクトをフィルタリングするためのプレフィックス。
prefix: 'ttt',
OSSBucketDestination: {
// インベントリの形式。
format: 'CSV',
// 送信先バケット所有者のアカウント ID。
accountId: '<Your AccountId>',
// 送信先バケットに設定されたロールの名前。
rolename: 'AliyunOSSRole',
// 送信先バケットの名前。
bucket: '<Your BucketName>',
// (任意) 送信先ストレージパスのプレフィックス。
prefix: '<Your Prefix>',
// SSE-OSS を使用してインベントリを暗号化するには、次のコードを使用します。
//encryption: {'SSE-OSS': ''},
// SSE-KMS を使用してインベントリを暗号化するには、次のコードを使用します。
/*
encryption: {
'SSE-KMS': {
keyId: 'test-kms-id',
},
*/
},
// インベントリが生成される頻度。`WEEKLY` は週に 1 回レポートを生成し、`DAILY` は 1 日に 1 回生成します。
frequency: 'Daily',
// レポートに含めるオブジェクトのバージョン。`All` はすべてのバージョンを含み、`Current` は現行バージョンのみを含みます。
includedObjectVersions: 'All',
optionalFields: {
// (任意) インベントリに含めるオプションフィールド。
field: ["Size", "LastModifiedDate", "ETag", "StorageClass", "IsMultipartUploaded", "EncryptionStatus"]
},
}
async function putInventory(){
// インベントリ設定を追加するバケットの名前。
const bucket = '<Your BucketName>';
try {
await client.putBucketInventory(bucket, inventory);
console.log('Inventory configuration added.')
} catch(err) {
console.log('Failed to add inventory configuration: ', err);
}
}
putInventory()import argparse
import alibabacloud_oss_v2 as oss
# コマンドラインパラメータパーサーを作成し、スクリプトの目的を記述します。この例では、バケットのインベントリを作成する方法について説明します。
parser = argparse.ArgumentParser(description="put bucket inventory sample")
# 必須のリージョン、バケット名、エンドポイント、ユーザー ID、RAM ロールの Alibaba Cloud Resource Name (ARN)、およびインベントリ名を含む、コマンドラインパラメータを指定します。
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
parser.add_argument('--bucket', help='バケットの名前。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
parser.add_argument('--user_id', help='ユーザーアカウント ID。', required=True)
parser.add_argument('--arn', help='ソースバケットからすべてのオブジェクトを読み取り、宛先バケットにオブジェクトを書き込む権限を持つロールの Alibaba Cloud Resource Name (ARN)。形式: `acs:ram::uid:role/rolename`。', required=True)
parser.add_argument('--inventory_id', help='インベントリの名前。', required=True)
def main():
# コマンドラインパラメータを解析して、ユーザーが指定した値を取得します。
args = parser.parse_args()
# 認証のために環境変数からアクセス認証情報を取得します。
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.put_bucket_inventory(oss.PutBucketInventoryRequest(
bucket=args.bucket, # バケットの名前。
inventory_id=args.inventory_id, # インベントリの ID。
inventory_configuration=oss.InventoryConfiguration(
included_object_versions='All', # インベントリリストにすべてのバージョンのオブジェクトを含めるように指定します。
optional_fields=oss.OptionalFields(
fields=[ # オブジェクトのサイズや最終更新日時などのオプションフィールド。
oss.InventoryOptionalFieldType.SIZE,
oss.InventoryOptionalFieldType.LAST_MODIFIED_DATE,
],
),
id=args.inventory_id, # インベントリの ID。
is_enabled=True, # バケットのインベントリ機能を有効にするかどうかを指定します。この例では、インベントリ機能は有効になっています。
destination=oss.InventoryDestination(
oss_bucket_destination=oss.InventoryOSSBucketDestination(
format=oss. InventoryFormatType.CSV, # インベントリリストの出力形式を CSV に指定します。
account_id=args.user_id, # ユーザーのアカウント ID。
role_arn=args.arn, # ソースバケット内のオブジェクトを読み取り、宛先バケットにオブジェクトを書き込む権限を持つ RAM ロールの ARN。
bucket=f'acs:oss:::{args.bucket}', # 宛先バケットの名前。
prefix='aaa', # インベントリリストに含めるオブジェクトの名前に含まれるプレフィックスを指定します。
),
),
schedule=oss.InventorySchedule(
frequency=oss. InventoryFrequencyType.DAILY, # インベントリリストを毎日または毎週生成するかどうかを指定します。この例では、インベントリリストは毎日生成されます。
),
filter=oss.InventoryFilter(
lower_size_bound=1024, # インベントリリストに含めるオブジェクトの最小サイズを指定します。単位: バイト。
upper_size_bound=1048576, # インベントリリストに含めるオブジェクトの最大サイズを指定します。単位: バイト。
storage_class='ColdArchive', # インベントリリストに含めるオブジェクトのストレージタイプを指定します。
prefix='aaa', # インベントリをフィルタリングするために使用されるプレフィックスを指定します。
last_modify_begin_time_stamp=1637883649, # オブジェクトが最後に変更された時間範囲の開始を指定します。
last_modify_end_time_stamp=1638347592, # オブジェクトが最後に変更された時間範囲の終了を指定します。
),
),
))
# 操作の HTTP ステータスコードとリクエスト ID を表示して、リクエストステータスを確認します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
# スクリプトが直接実行されたときに処理ロジックを開始するために、main 関数を呼び出します。
if __name__ == "__main__":
main() # スクリプトの関数のエントリポイントを指定します。制御プログラムフローはここから開始されます。using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントに endpoint を設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケット名を指定します。
var bucketName = "examplebucket";
// バケットの所有者によって付与された AccountId を指定します。
var accountId ="yourDestinationBucketAccountId";
// ソースバケット内のすべてのファイルを読み取り、宛先バケットにファイルを書き込む権限を持つロールの名前を指定します。
var roleArn ="yourDestinationBucketRoleArn";
// インベントリ結果が格納されるバケットの名前を指定します。
var destBucketName ="yourDestinationBucketName";
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// 署名バージョンを V4 に設定します。
conf.SignatureVersion = SignatureVersion.V4;
// OssClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// バケットインベントリを追加します。
var config = new InventoryConfiguration();
// インベントリルール名を設定します。
config.Id = "report1";
// インベントリ設定が有効かどうかを示すフラグ。 有効な値:true と false。 値を true に設定すると、インベントリ設定が有効になります。
config.IsEnabled = true;
// プレフィックスでオブジェクトをフィルタリングするようにインベントリフィルター ルールを設定します。
config.Filter = new InventoryFilter("filterPrefix");
// インベントリの宛先バケット設定を作成します。
config.Destination = new InventoryDestination();
config.Destination.OSSBucketDestination = new InventoryOSSBucketDestination();
// インベントリのフォーマットを設定します。
config.Destination.OSSBucketDestination.Format = InventoryFormat.CSV;
// インベントリ結果が格納される宛先バケットを所有するユーザーの AccountId。
config.Destination.OSSBucketDestination.AccountId = accountId;
// インベントリ結果が格納される宛先バケットの roleArn。
config.Destination.OSSBucketDestination.RoleArn = roleArn;
// インベントリ結果が格納される宛先バケットの名前。
config.Destination.OSSBucketDestination.Bucket = destBucketName;
// インベントリ結果のストレージパスのプレフィックスを設定します。
config.Destination.OSSBucketDestination.Prefix = "prefix1";
// インベントリの生成スケジュールを設定します。 次の例は、週次生成用です。 Weekly は週次生成に対応し、Daily は日次生成に対応します。
config.Schedule = new InventorySchedule(InventoryFrequency.Daily);
// インベントリに含めるオブジェクトバージョンを現在のバージョンに設定します。 これを InventoryIncludedObjectVersions.All に設定すると、すべてのオブジェクトバージョンが含まれます。 これは、バージョン管理が有効な場合にのみ有効になります。
config.IncludedObjectVersions = InventoryIncludedObjectVersions.All;
// インベントリに含めるオブジェクトプロパティを設定します。
config.OptionalFields.Add(InventoryOptionalField.Size);
config.OptionalFields.Add(InventoryOptionalField.LastModifiedDate);
config.OptionalFields.Add(InventoryOptionalField.StorageClass);
config.OptionalFields.Add(InventoryOptionalField.IsMultipartUploaded);
config.OptionalFields.Add(InventoryOptionalField.EncryptionStatus);
config.OptionalFields.Add(InventoryOptionalField.ETag);
var req = new SetBucketInventoryConfigurationRequest(bucketName, config);
client.SetBucketInventoryConfiguration(req);
Console.WriteLine("Set bucket:{0} InventoryConfiguration succeeded", bucketName);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。*/
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを 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);
InventoryConfiguration inventoryConf;
/* インベントリルールの名前を指定します。名前はバケット内でグローバルに一意である必要があります。*/
inventoryConf.setId("inventoryId");
/* インベントリ設定が有効かどうかを指定するフラグ。有効な値:true および false。*/
inventoryConf.setIsEnabled(true);
/* (オプション) オブジェクトをフィルタリングするためのプレフィックス。プレフィックスを指定すると、インベントリにはプレフィックスに一致するオブジェクトのみがリストされます。*/
inventoryConf.setFilter(InventoryFilter("objectPrefix"));
InventoryOSSBucketDestination dest;
/* エクスポートされたマニフェストファイルのファイル形式。*/
dest.setFormat(InventoryFormat::CSV);
/* バケットオーナーのアカウントの UID。*/
dest.setAccountId("10988548********");
/* ロール名を指定します。ロールには、ソースバケットからすべてのファイルを読み取り、宛先バケットにファイルを書き込む権限が必要です。形式は acs:ram::uid:role/rolename です。*/
dest.setRoleArn("acs:ram::10988548********:role/inventory-test");
/* エクスポートされたマニフェストファイルが保存されるバケット。*/
dest.setBucket("yourDstBucketName");
/* マニフェストファイルのストレージパスのプレフィックス。*/
dest.setPrefix("yourPrefix");
/* (オプション) マニフェストファイルの暗号化方式。SSE-OSS または SSE-KMS を使用してファイルを暗号化できます。*/
//dest.setEncryption(InventoryEncryption(InventorySSEOSS()));
//dest.setEncryption(InventoryEncryption(InventorySSEKMS("yourKmskeyId")));
inventoryConf.setDestination(dest);
/* マニフェストファイルのエクスポート頻度。有効な値:Daily および Weekly。*/
inventoryConf.setSchedule(InventoryFrequency::Daily);
/* インベントリにオブジェクトバージョン情報を含めるかどうかを指定します。有効な値:All および Current。*/
inventoryConf.setIncludedObjectVersions(InventoryIncludedObjectVersions::All);
/* (オプション) インベントリ結果に含める設定項目を設定します。必要に応じて設定してください。*/
InventoryOptionalFields field {
InventoryOptionalField::Size, InventoryOptionalField::LastModifiedDate,
InventoryOptionalField::ETag, InventoryOptionalField::StorageClass,
InventoryOptionalField::IsMultipartUploaded, InventoryOptionalField::EncryptionStatus
};
inventoryConf.setOptionalFields(field);
/* インベントリ設定を設定します。*/
auto outcome = client.SetBucketInventoryConfiguration(
SetBucketInventoryConfigurationRequest(BucketName, inventoryConf));
if (!outcome.isSuccess()) {
/* 例外を処理します。*/
std::cout << "Set Bucket Inventory fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークやその他のリソースを解放します。*/
ShutdownSdk();
return 0;
}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()
var (
accountId = "account id of the bucket" // 操作を実行する権限をバケット所有者から付与された Alibaba Cloud アカウントの ID を指定します。例: 109885487000****。
inventoryId = "inventory id" // インベントリの名前。名前はバケット内でグローバルに一意である必要があります。
)
// バケットの名前が指定されているかどうかを確認します。
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)
// バケットのインベントリを構成するリクエストを作成します。
putRequest := &oss.PutBucketInventoryRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
InventoryId: oss.Ptr(inventoryId), // ユーザーが指定したインベントリの名前。
InventoryConfiguration: &oss.InventoryConfiguration{
Id: oss.Ptr(inventoryId), // ユーザーが指定したインベントリの名前。
IsEnabled: oss.Ptr(true), // インベントリを有効にします。
Filter: &oss.InventoryFilter{
Prefix: oss.Ptr("filterPrefix"), // インベントリに含まれるオブジェクトをフィルタリングするために使用されるルールを指定します。
LastModifyBeginTimeStamp: oss.Ptr(int64(1637883649)), // 最終変更の開始時刻を指定するタイムスタンプ。
LastModifyEndTimeStamp: oss.Ptr(int64(1638347592)), // 最終変更の終了時刻を指定するタイムスタンプ。
LowerSizeBound: oss.Ptr(int64(1024)), // ファイルの下限サイズ (単位: バイト)。
UpperSizeBound: oss.Ptr(int64(1048576)), // ファイルの上限サイズ (単位: バイト)。
StorageClass: oss.Ptr("Standard,IA"), // ストレージタイプ。
},
Destination: &oss.InventoryDestination{
OSSBucketDestination: &oss.InventoryOSSBucketDestination{
Format: oss.InventoryFormatCSV, // エクスポートされたインベントリリストのフォーマット。
AccountId: oss.Ptr(accountId), // 操作を実行する権限をバケット所有者から付与されたアカウントの ID を指定します。例: 109885487000****。
RoleArn: oss.Ptr("acs:ram::" + accountId + ":role/AliyunOSSRole"), // 操作を実行する権限をバケット所有者から付与された RAM ロールの名前を指定します。例: acs:ram::109885487000****:role/ram-test。
Bucket: oss.Ptr("acs:oss:::" + bucketName), // 生成されたインベントリリストを保存するバケットの名前を指定します。
Prefix: oss.Ptr("export/"), // 生成されたインベントリリストを保存するパスのプレフィックスを指定します。
},
},
Schedule: &oss.InventorySchedule{
Frequency: oss.InventoryFrequencyDaily, // インベントリリストがエクスポートされる頻度 (毎日)。
},
IncludedObjectVersions: oss.Ptr("All"), // インベントリリストにオブジェクトのすべてのバージョンを含めるか、現在のバージョンのみを含めるかを指定します。
},
}
// リクエストを実行します。
putResult, err := client.PutBucketInventory(context.TODO(), putRequest)
if err != nil {
log.Fatalf("バケットインベントリの配置に失敗しました %v", err)
}
// 結果を表示します。
log.Printf("バケットインベントリの配置結果: %#v\n", putResult)
}
ossutil
inventory-configuration.xml という名前のファイルを作成し、次のコンテンツを追加します。
<?xml version="1.0" encoding="UTF-8"?>
<InventoryConfiguration>
<Id>report1</Id>
<IsEnabled>true</IsEnabled>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>100000000000000</AccountId>
<RoleArn>acs:ram::100000000000000:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::destbucket</Bucket>
<Prefix>prefix1/</Prefix>
<Encryption>
<SSE-KMS>
<KeyId>keyId</KeyId>
</SSE-KMS>
</Encryption>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Daily</Frequency>
</Schedule>
<IncludedObjectVersions>All</IncludedObjectVersions>
<OptionalFields>
<Field>Size</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>StorageClass</Field>
<Field>IsMultipartUploaded</Field>
<Field>EncryptionStatus</Field>
</OptionalFields>
</InventoryConfiguration>
次のコマンドを実行します:
ossutil api put-bucket-inventory --bucket examplebucket --inventory-id report1 --inventory-configuration file://inventory-configuration.xml
注 put-bucket-inventory コマンドの詳細については、「put-bucket-inventory」をご参照ください。
API
PutBucketInventory API を呼び出して、インベントリ設定を構成または変更します。この方法は、HTTP リクエストを手動で作成し、署名を計算する必要があるため、高度なカスタマイズに適しています。
インベントリ分析
インベントリタスクは非同期で実行されます。各インベントリレポートは、スキャンの開始時刻をフォルダー名とする専用フォルダーに保存されます。コアファイルには、manifest.json と、data/ ディレクトリ内の .csv.gz データファイルが含まれます。タスクの完了を確認するには、デスティネーションで生成された manifest.json ファイルを確認してください。
-
manifest.jsonファイルの解析:manifest.jsonファイルを解析して、正しい列の順序とデータファイルの情報を取得します。特に次の 2 つのフィールドに注目します:-
fileSchema: CSV データファイル内の列名と正確な順序を定義する文字列。
-
files: このレポート用に生成された各
.csv.gzデータファイルの詳細を格納した配列。以下を含みます:-
key: ファイルパス -
size: ファイルサイズ -
MD5checksum: MD5 チェックサム
-
-
-
fileSchemaに従った CSV データファイルの解析-
データファイルのダウンロードと解凍:
manifest.jsonのfiles配列内の各データファイルについて、そのkey(ファイルパス) を使用して対応する.csv.gzアーカイブをダウンロードします。アーカイブを解凍して、CSV フォーマットのデータを取得します。 -
順序に従ったデータの解析:
fileSchemaのフィールドの順序を列ヘッダーとして使用します。解凍した CSV ファイルを 1 行ずつ読み取ります。各行は 1 つのオブジェクトの完全なレコードであり、各列はfileSchemaのフィールドに対応します。CSV コンテンツの例:
fileSchemaが"Bucket,Key,Size,StorageClass,LastModifiedDate"の場合、解凍された CSV コンテンツは次のフォーマットになります:source-bucket,"dir%2Fbody.xml","102400","Standard","2025-04-14T07-06-00Z" source-bucket,"dest.png","312049","Standard","2025-04-14T07-05-59Z"Keyの値は URL エンコードされており、必要に応じてデコードできます。
-
フルインベントリファイル
インベントリタスクを設定すると、OSS はインベントリ ルールのエクスポート周期に基づいてインベントリファイルを生成します。インベントリファイルのディレクトリ構造は次のとおりです:
<dest-bucket-name>/
└── <dest-prefix>/
└── <source-bucket-name>/
└── <inventory-id>/
├── YYYY-MM-DDTHH-MMZ/ (スキャン開始時刻の UTC タイムスタンプ)
│ ├── manifest.json (インベントリタスクのメタデータファイル)
│ └── manifest.checksum (manifest.json ファイルの MD5 チェックサム)
└── data/
└── <uuid>.csv.gz (1 つ以上の GZIP 圧縮されたインベントリデータファイル)
|
ディレクトリ構造 |
説明 |
|
dest-prefix |
このディレクトリは、指定したインベントリレポートのプレフィックスに基づいて命名されます。プレフィックスを指定しない場合、このディレクトリは省略されます。 |
|
source-bucket-name |
このディレクトリは、インベントリレポートのソースバケットに基づいて命名されます。 |
|
inventory-id |
このディレクトリは、インベントリタスクのルール名に基づいて命名されます。 |
|
YYYY-MM-DDTHH-MMZ |
このディレクトリは、スキャン開始時刻の UTC タイムスタンプ (例:2025-05-17T16-00Z) を使用して命名されます。このディレクトリには、manifest.json と manifest.checksum ファイルが含まれます。 |
|
data |
このディレクトリには、GZIP 圧縮された CSV インベントリファイルが格納されます。これらのファイルには、ソースバケット内のオブジェクトと、それに対応するメタデータが一覧表示されます。 重要
|
マニフェストファイル
マニフェストファイルは、 manifest.json と manifest.checksum で構成されます。詳細は以下のとおりです。
-
manifest.json:インベントリに関するメタデータおよびその他の基本情報が含まれます。
{ "creationTimestamp": "1642994594", "destinationBucket": "dest-bucket-name", "fileFormat": "CSV", "fileSchema": "Bucket, Key, VersionId, IsLatest, IsDeleteMarker, Size, StorageClass, LastModifiedDate, ETag, IsMultipartUploaded, EncryptionStatus, ObjectAcl, TaggingCount, ObjectType, CRC64", "files": [{ "MD5checksum": "F77449179760C3B13F1E76110F07****", "key": "dest-prefix/source-bucket-name/inventory-id/data/a1574226-b5e5-40ee-91df-356845777c04.csv.gz", "size": 2046}], "sourceBucket": "source-bucket-name", "version": "2019-09-01" }次の表は、各フィールドについて説明しています。
パラメーター
説明
creationTimestamp
ソースバケットのスキャンが開始されたタイムスタンプ。
destinationBucket
インベントリファイルを保存する送信先バケット。
fileFormat
インベントリファイルのフォーマット。
fileSchema
インベントリファイル内のフィールド。固定フィールドとオプションフィールドに分類されます。固定フィールドの順序は一定です。オプションフィールドの順序は、インベントリ ルールを設定する際に選択した順序によって異なります。不一致を避けるため、fileSchema のフィールドの順序に従って .csv.gz ファイルのデータ列を解析してください。
-
インベントリ ルールを設定する際にオブジェクトバージョンとして現行バージョンを選択した場合、fileSchema には固定フィールド
Bucket, Keyが最初にリストされ、その後にオプションフィールドが続きます。 -
すべてのオブジェクトバージョンを含めるようにインベントリ ルールを設定した場合、fileSchema には固定フィールド
Bucket, Key, VersionId, IsLatest, IsDeleteMarkerが最初にリストされ、その後にオプションフィールドが続きます。
files
インベントリファイルのリスト。各エントリは、ファイル 1 つにつき、MD5 チェックサム、キー、およびサイズを指定します。
sourceBucket
インベントリ ルールが設定されているソースバケット。
version
インベントリのバージョン。
-
-
manifest.checksum:
manifest.checksumファイルには、manifest.jsonファイルの MD5 ハッシュが含まれます。このハッシュを使用して、manifest.jsonの整合性を検証してください。例: F77449179760C3B13F1E76110F07****。
フルインベントリ
インベントリレポートは data/ ディレクトリに保存され、インベントリ機能でエクスポートされたファイルがリストされています。以下に例を示します:

|
パラメーター |
説明 |
|
bucket |
インベントリタスクが実行されるソースバケット。 |
|
key |
オブジェクトのキー。 このキーは URL エンコードされており、必要に応じてデコードできます。 |
|
VersionId |
オブジェクトのバージョン ID。このフィールドは、インベントリがすべてのオブジェクトバージョンを含むように設定されている場合にのみ表示されます。
|
|
IsLatest |
オブジェクトバージョンが最新であるかどうかを示します。このフィールドは、インベントリがすべてのオブジェクトバージョンを含むように設定されている場合にのみ表示されます。
|
|
IsDeleteMarker |
オブジェクトバージョンが削除マーカーであるかどうかを示します。このフィールドは、インベントリがすべてのオブジェクトバージョンを含むように設定されている場合にのみ表示されます。
|
|
size |
オブジェクトのサイズ。 |
|
StorageClass |
オブジェクトのストレージクラス。 |
|
LastModifiedDate |
オブジェクトが最後に変更された時刻 (協定世界時 (UTC))。北京時間より 8 時間遅れです。 |
|
TransitionTime |
ライフサイクルルールによって、オブジェクトがコールドアーカイブまたはディープコールドアーカイブのストレージクラスに移行された時刻。 |
|
ETag |
オブジェクトの ETag。 オブジェクトの作成時に生成される、オブジェクトのコンテンツの識別子。
|
|
IsMultipartUploaded |
オブジェクトがマルチパートアップロードによって作成された場合は true、そうでない場合は false になります。 |
|
EncryptionStatus |
オブジェクトが暗号化されている場合は true、そうでない場合は false になります。 |
|
ObjectAcl |
オブジェクトの ACL。 詳細については、「オブジェクト ACL」をご参照ください。 |
|
TaggingCount |
オブジェクトのタグ数。 |
|
ObjectType |
オブジェクトタイプ。 詳細については、「オブジェクトタイプ」をご参照ください。 |
|
CRC64 |
オブジェクトの CRC64 チェックサム。 |
|
LastAccessDate |
オブジェクトの最終アクセス時刻 (協定世界時 (UTC))。 説明
このフィールドは、バケットでアクセス追跡が有効になっている場合にのみ使用できます。それ以外の場合、このフィールドは null です。 |
|
LastAccessTimestamp |
オブジェクトの最終アクセス時刻 (UNIX タイムスタンプ)。 説明
このフィールドは、バケットでアクセス追跡が有効になっている場合にのみ使用できます。それ以外の場合、このフィールドは null です。 |
増分インベントリ
増分インベントリは、約 10 分ごとに実行され、作成、メタデータの更新、削除などのオブジェクトの変更を取得してレポートします。
インベントリ ルールの設定
コンソール
-
OSS コンソールにログインします。
-
インベントリを生成するソースバケットに移動します。左側メニューで、[データ管理] > [バケットインベントリ] を選択します。
-
バケットインベントリ ページで、インベントリの作成 をクリックします。
-
インベントリの作成 パネルで、以下の手順を実行します。
-
基本設定 のパラメーターを設定します。
パラメーター
説明
[ステータス]
増分インベントリタスクのステータスを設定します。起動 を選択します。
[スタイル名]
インベントリタスクの名前を入力します。名前に使用できるのは、小文字、数字、ハイフン (-) のみで、ハイフンで開始または終了することはできません。
[インベントリレポートの保存先]
インベントリレポートの保存先パスを指定します。ソースバケットと送信先バケットは、同じ Alibaba Cloud アカウントに属し、同じリージョンにある必要があります。
-
レポートを examplebucket バケットの exampledir1/ パスに保存するには、
exampledir1/を入力します。指定したパスがバケットに存在しない場合、OSS は自動的に作成します。保存先パスのプレフィックスは、長さが 128 文字を超えてはなりません。 -
このフィールドを空白のままにすると、レポートはルートディレクトリに保存されます。
重要OSS-HDFS への影響を防ぎ、データ破損の可能性を避けるため、OSS-HDFS が有効になっているバケットのインベントリ ルールを設定する際は、インベントリレポートのディレクトリを
.dlsdata/に設定しないでください。[インベントリのスキャン範囲]
-
バケット全体をスキャン:バケット内のすべてのオブジェクトをスキャンします。
-
オブジェクトプレフィックス:exampledir1/ などの指定されたプレフィックスを持つオブジェクトのみをスキャンします。
-
-
増分メタデータの更新を追跡・生成する エリアで、増分メタデータの更新を取得 を有効にし、エクスポートする メタデータフィールド を選択します。
パラメーター
説明
[メタデータフィールド]
レポートに含めるオブジェクトメタデータを選択します。
-
シーケンス番号、イベントタイプ、タイムスタンプ、ユーザー ID、リクエスト ID、リクエスト元 IPなどのイベントメタデータ。
-
オブジェクトサイズ、ストレージクラス、最終更新日、ETag、マルチパートアップロードステータス、[オブジェクトタイプ]、[オブジェクト ACL]、CRC64、暗号化ステータスなどのシステムメタデータ。
-
-
-
[Alibaba Cloud OSS にバケットリソースへのアクセス権限を付与することを承知し、同意します] を選択し、OK をクリックします。
ossutil
incremental-inventory.xml という名前のファイルを作成します。フルインベントリ設定との主な違いは、<IncrementalInventory> セクションが追加されている点です。
<?xml version="1.0" encoding="UTF-8"?>
<InventoryConfiguration>
<Id>report1</Id>
<IsEnabled>true</IsEnabled>
<Filter>
<Prefix>test</Prefix>
</Filter>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>12xxxxxx29</AccountId>
<RoleArn>acs:ram::12xxxxxx29:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::test-inc-bi-bj</Bucket>
<Prefix>report1</Prefix>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Weekly</Frequency>
</Schedule>
<IncludedObjectVersions>All</IncludedObjectVersions>
<OptionalFields>
<Field>Size</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>StorageClass</Field>
</OptionalFields>
<IncrementalInventory>
<IsEnabled>true</IsEnabled>
<Schedule>
<Frequency>600</Frequency>
</Schedule>
<OptionalFields>
<Field>SequenceNumber</Field>
<Field>RecordType</Field>
<Field>RecordTimestamp</Field>
<Field>Requester</Field>
<Field>RequestId</Field>
<Field>SourceIp</Field>
<Field>Size</Field>
<Field>StorageClass</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>IsMultipartUploaded</Field>
<Field>ObjectType</Field>
<Field>ObjectAcl</Field>
<Field>Crc64</Field>
<Field>EncryptionStatus</Field>
</OptionalFields>
</IncrementalInventory>
</InventoryConfiguration>
次のコマンドを実行します:
ossutil api put-bucket-inventory --bucket examplebucket --inventory-id report1 --inventory-configuration file://incremental-inventory.xml
注意: put-bucket-inventory コマンドの詳細については、「put-bucket-inventory」をご参照ください。
API
PutBucketInventory API を呼び出して、インベントリ設定を構成または変更します。この方法は、HTTP リクエストを手動で作成し、署名を計算する必要があるため、高度にカスタマイズされたシナリオに適しています。
インベントリレポートの解析
インベントリタスクが完了すると、OSS は送信先バケットの指定されたパスにレポートファイルを生成します。主なファイルは次のとおりです。
-
manifest.jsonファイル -
data/ディレクトリ内の.csvデータファイル
タスクの完了を確認するには、宛先バケットでmanifest.json ファイルを確認します。
レポートを解析するには、次の手順に従います:
-
読み取り
manifest.jsonファイル: インベントリレポートの列の順序は動的であり、インベントリルールの設定時に選択されたフィールドによって決まります。まずmanifest.jsonファイル内のfileSchemaフィールドを解析する必要があります。このフィールドは、CSV ファイル内の各列の名前と順序を定義します。 -
CSV データファイルを解析する基準は
fileSchema-
CSV ファイルの列ヘッダーには、
fileSchemaで定義されている順序を使用してください。 -
CSV ファイルを 1 行ずつ読み取ります。各行は完全なオブジェクトレコードを表し、各列は
fileSchemaで宣言されたフィールドに対応します。
-
増分インベントリファイル
インベントリタスクを設定すると、OSS はインベントリ ルールで指定された頻度でインベントリファイルを生成します。インベントリファイルのディレクトリ構造は次のとおりです:
<dest-bucket-name>/
└── <dest-prefix>/
└── <source-bucket-name>/
└── <inventory-id>/
└── incremental_inventory/
└── YYYY-MM-DDTHH-MMSSZ/
├── manifest.json
└── data/
├── uuid1_0.csv
└── ......
|
ディレクトリ構造 |
説明 |
|
dest-prefix |
このディレクトリは、インベントリレポートに指定されたプレフィックスに基づいて生成されます。プレフィックスが指定されていない場合、このディレクトリは省略されます。 |
|
source-bucket-name |
このディレクトリは、ソースバケットの名前に基づいて生成されます。 |
|
inventory_id |
このディレクトリには、インベントリのルール名が付けられます。 |
|
incremental_inventory |
増分インベントリの固定プレフィックスで、フルインベントリと区別します。 |
|
YYYY-MM-DDTHH-MMSSZ |
バケットのスキャンが開始された日時を示す標準の UTC タイムスタンプ。例: 2020-05-17T16-0000Z。 |
|
data |
このディレクトリには、CSV 形式のインベントリファイルが含まれています。これらのファイルには、指定された期間内にソースバケットで変更されたオブジェクトとそのメタデータが記載されています。 |
マニフェストファイル
{
"startTimestamp": "1759320000",
"endTimestamp": "1759320600",
"destinationBucket": "destbucket",
"fileFormat": "CSV",
"fileSchema": "Bucket, Key, VersionId, IsDeleteMarker, SequenceNumber, RecordType, RecordTimestamp, Requester, RequestId, SourceIp, Size, StorageClass, LastModifiedDate, ETag, IsMultipartUploaded, ObjectType, ObjectAcl, CRC64, EncryptionStatus",
"files": [{
"MD5checksum": "60463A9A34019CF448A730EB2CB3****",
"key": "dest-prefix/source-bucket-name/inventory-id/incremental_inventory/2025-09-28T04-0000Z/data/5b7c6cf0db490db906c60e87b917b148_5550506986a37a62abce56a83db6736d_0.csv",
"size": 2046}],
"sourceBucket": "srcbucket",
"version": "2025-09-30"
}
次の表では、各フィールドについて説明します。
|
フィールド |
説明 |
|
startTimestamp |
この増分インベントリレポートが対象とする期間の開始を示すタイムスタンプ。 |
|
endTimestamp |
この増分インベントリレポートが対象とする期間の終了を示すタイムスタンプ。 |
|
destinationBucket |
インベントリファイルが保存される送信先バケット。 |
|
fileFormat |
インベントリファイルのフォーマット。 |
|
fileSchema |
インベントリファイル内のフィールドを指定します。 スキーマには、順序が固定されている固定フィールドと、ルール設定時の選択順序によって順序が決まるオプションフィールドが含まれます。 列の不一致を防ぐため、常に
|
|
files |
各インベントリファイルの MD5 チェックサム、完全なキー、およびサイズを含むリスト。 |
|
sourceBucket |
インベントリ ルールが設定されているソースバケット。 |
|
version |
インベントリのバージョン。 |
増分インベントリレポートのフィールド
|
メタデータタイプ |
フィールド |
説明 |
|
システムメタデータ |
Bucket |
インベントリタスクが実行されるソースバケットの名前。 |
|
イベントメタデータ |
SequenceNumber |
各レコードの一意のシーケンス番号。同じオブジェクトのレコードを |
|
RecordType |
レコードタイプ: CREATE、UPDATE_METADATA、または DELETE。
|
|
|
RecordTimestamp |
ミリ秒精度の UTC タイムスタンプ。例: "2024-08-25 18:08:01.024"。 |
|
|
Requester |
リクエスタの Alibaba Cloud ID またはプリンシパル ID。 |
|
|
RequestId |
リクエストの一意の識別子。 |
|
|
SourceIp |
リクエスタのソース IP アドレス。 |
|
|
システムメタデータ |
Key |
バケット内のオブジェクトの名前。名前は URL エンコードされています。 |
|
VersionId |
オブジェクトのバージョン ID。このフィールドは、インベントリ ルールがすべてのバージョンをエクスポートするように設定されている場合にのみ含まれます。
|
|
|
IsDeleteMarker |
オブジェクトバージョンが削除マーカーであるかどうかを示します。このフィールドは、インベントリ ルールがすべてのバージョンをエクスポートするように設定されている場合にのみ含まれます。
|
|
|
Size |
オブジェクトのサイズ (バイト単位)。 |
|
|
StorageClass |
オブジェクトのストレージクラス。 |
|
|
LastModifiedDate |
オブジェクトの最終更新日時。時刻は UTC で、北京時間 (UTC+8) より 8 時間遅れです。 |
|
|
ETag |
オブジェクトのコンテンツを識別するエンティティタグ (ETag)。
|
|
|
IsMultipartUploaded |
オブジェクトがマルチパートアップロードによって作成されたかどうかを示します。値が true の場合は作成されたことを示し、false の場合は作成されなかったことを示します。 |
|
|
EncryptionStatus |
オブジェクトが暗号化されているかどうかを示します。値が true の場合は暗号化されていることを示し、false の場合は暗号化されていないことを示します。 |
|
|
ObjectAcl |
オブジェクトの ACL。 詳細については、「オブジェクト ACL」をご参照ください。 |
|
|
ObjectType |
オブジェクトのタイプ。 詳細については、「オブジェクトタイプ」をご参照ください。 |
|
|
CRC64 |
オブジェクトの CRC64 値。 |
制限
各バケットには、API または SDK を使用して最大 1,000 個、コンソールからは最大 10 個のインベントリルールを設定できます。
課金
バケットインベントリ自体は無料ですが、以下の料金が適用されます:
-
API リクエスト料金: インベントリールールを設定または取得するための
PutおよびGetリクエスト。 OSS が宛先バケットにレポートを書き込む際の PUT リクエスト。 レポートをダウンロードする際の GET リクエスト。 -
ストレージ料金:宛先バケットのインベントリレポート (
manifestおよびcsv.gzまたはcsvファイル) には、標準ストレージ料金が適用されます。 -
アウトバウンドトラフィック料金:パブリックエンドポイントからインベントリレポートをダウンロードすると、アウトバウンドトラフィック料金が発生します。
不要になったインベントリールールは削除し、ライフサイクルルールを使用して期限切れのレポートファイルを自動的にクリーンアップします。
本番環境のガイドライン
ベストプラクティス
-
最小権限:常に最小権限を持つ専用の RAM ロールを使用してください。本番環境では
AliyunOSSRoleを使用しないでください。 -
パフォーマンスに関する推奨事項:トラフィックの多いソースバケットの場合、インベントリレポートを別のバケットに保存して、オンラインサービスとの帯域幅の競合を回避してください。
-
コスト最適化:オブジェクト数が 100 億を超えるバケットの場合は、週次エクスポートを使用してください。送信先バケットにライフサイクルルールを設定して、30 日など、指定された日数より古いレポートを自動的に削除してください。
オブジェクト数
エクスポートの推奨事項
100 億未満
必要に応じて、日次または週次のエクスポートを設定します。
100 億〜500 億
週次エクスポートを設定します。
500 億以上
-
プレフィックスを照合してバッチでエクスポートします。
-
してエクスポート制限を引き上げます。
-
-
プレフィックスによるパーティショニング:非常に大規模なバケット (数千億のオブジェクト) の場合、ビジネスプレフィックスに基づいて複数のインベントリルールを作成し、分割統治方式でレポートを生成してください。
リスク防止
-
データ監査:インベントリレポートにすべてのオブジェクトが記載されるとは限りません。レポートには、manifest.json の
createTimeStampよりも最終更新時刻が前のオブジェクトが含まれます。このタイムスタンプより後に変更されたオブジェクトは除外される可能性があります。インベントリデータに基づいて操作を実行する前に、HeadObject API を使用してオブジェクトの現在のプロパティを確認してください。 -
モニタリングとアラート:送信先バケットのストレージ使用量を監視して、コストが制御不能になるのを防いでください。
PutBucketInventoryなどの API 呼び出しを監視して、設定の変更を追跡してください。 -
変更管理:インベントリルール (プレフィックス、頻度など) の変更は、ダウンストリームのデータ分析ワークフローに影響を与える可能性があります。変更をバージョン管理とレビュープロセスに組み込んでください。