バケットに数百万、さらには数十億のオブジェクトが含まれている場合、ListObjects 操作を使用して個別にリストアップすると、時間がかかりコストも高くなります。バケットインベントリ機能は、膨大な数のオブジェクトを扱うシナリオ向けに設計されています。非同期かつ定期的にバケットをスキャンし、サイズ、ストレージクラス、暗号化ステータスなどの指定されたオブジェクトメタデータを含むインベントリファイルを生成します。この機能は、資産管理、コスト分析、コンプライアンス監査、バッチ処理タスクの入力準備など、さまざまな目的に使用できます。
仕組み
インベントリルールを作成すると、Object Storage Service (OSS) は指定された頻度 (毎日または毎週) でインベントリレポートを自動的に生成します。このタスクはバックグラウンドで非同期に実行され、バケットへの通常アクセスには影響しません。ワークフローは次のとおりです。
権限の取得: OSS は、事前に承認された Resource Access Management (RAM) ロールを偽装して、ソースバケットをスキャンし、宛先バケットに書き込む権限を取得します。
オブジェクトのスキャン: OSS は、オブジェクトのプレフィックス、バージョンステータス、作成時刻、サイズなど、ルールで定義されたフィルター条件に基づいて、ソースバケット内の一致するすべてのオブジェクトをスキャンします。
インベントリレポートの生成: OSS はスキャン結果を集計してインベントリレポートを生成し、Gzip 圧縮された CSV ファイルとして指定されたバケットに書き込みます。
この機能を使用する際の注意点:
レポートのスナップショット: インベントリレポートは、タスク開始時のバケットの状態のスナップショットです。スキャン中に行われたオブジェクトの追加、上書き、削除などの変更がレポートに反映されることは保証されません。
最初のインベントリレポートは、ルールを設定した直後に生成されます。その後のレポートは、毎日または毎週早朝 (UTC+8) にバッチで生成されます。エクスポート時間は、オブジェクトの数とタスクキューによって異なります。
ステップ 1: 権限の設定
権限付与の手順は、使用する ID によって異なります。
Alibaba Cloud アカウント: RAM ロールを作成して権限を付与するだけで済みます。これにより、OSS サービスがロールを偽装できるようになります。
RAM ユーザー: 管理者または Alibaba Cloud アカウントは、まずアカウントに権限を付与してインベントリを作成し、RAM ロールを管理できるようにする必要があります。その後、RAM ロールを作成して権限を付与できます。
ステップ 1: RAM ユーザーに権限を付与する (該当する場合)
このステップでは、RAM ユーザーにインベントリルールを設定し、必要な RAM ロールを作成する権限を付与します。
Alibaba Cloud アカウントを使用している場合は、このステップをスキップしてステップ 2 に進むことができます。
セキュリティに関する推奨事項: RAM ユーザーにロールを作成する権限 (ram:CreateRole) を付与すると、セキュリティリスクが生じます。Alibaba Cloud アカウントを使用して、必要な RAM ロールを事前に作成することをお勧めします。権限付与が完了すると、RAM ユーザーはインベントリルールを作成する際に、新しいロールを作成することなく、直接ロールを選択できます。これはより安全な方法です。それでも RAM ユーザーにロールを作成する権限を付与する必要がある場合は、次の手順を実行します。
カスタムポリシーの作成 編集モードで、次の内容のカスタムポリシーを作成します。
以下のポリシーの
oss:ListBuckets権限は、コンソールを使用する場合にのみ必要です。SDK や ossutil などのツールを使用してサービスにアクセスする場合、この権限は必要ありません。{ "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutBucketInventory", "oss:GetBucketInventory", "oss:DeleteBucketInventory", "oss:ListBuckets", "ram:CreateRole", "ram:AttachPolicyToRole", "ram:GetRole", "ram:ListPoliciesForRole" ], "Resource": "*" } ], "Version": "1" }注: 現在の RAM ユーザーがすでに
AliyunOSSFullAccessシステム権限を持っている場合は、ロール管理の権限のみを付与する必要があります。{ "Statement": [ { "Effect": "Allow", "Action": [ "ram:CreateRole", "ram:AttachPolicyToRole", "ram:GetRole", "ram:ListPoliciesForRole" ], "Resource": "*" } ], "Version": "1" }RAM ユーザーに権限を付与する 作成したカスタムポリシーをターゲット RAM ユーザーに付与します。
ステップ 2: RAM ロールの作成と設定
これにより、OSS サービスは生成されたインベントリレポートファイルを宛先バケットに書き込むことができます。
RAM コンソールに移動してロールを作成します。信頼できるエンティティタイプとして Alibaba Cloud サービス を選択し、信頼できるサービスとして Object Storage Service を選択します。
カスタム権限ポリシーを作成してロールにアタッチします。次のポリシーを使用します。
your-destination-bucketをインベントリレポートを保存するために使用するバケットの名前に置き換えます。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": [ "acs:oss:*:*:your-destination-bucket/*" ] } ] }KMS 暗号化: KMS キーを使用してマニフェストファイルを暗号化する予定の場合は、RAM ロールに
AliyunKMSFullAccess権限またはより詳細な KMS 関連の権限も付与する必要があります。後続のステップで使用するために、ロールの ARN (例:
acs:ram::1234567890:role/oss-inventory-role) を記録します。
セキュリティアドバイザリ: コンソールで初めてインベントリルールを設定すると、システムは自動的に AliyunOSSRole という名前のサービスリンクロールを作成します。自動的に作成された AliyunOSSRole は、本番環境での使用は推奨されません。このロールはすべてのバケットに対する完全な管理権限を持っており、重大なセキュリティリスクをもたらします。このロールは、一時的なテスト環境でのみ使用することをお勧めします。
ステップ 2: インベントリルールの設定
インベントリルールは、OSS コンソール、SDK、または ossutil などのコマンドラインツールを使用して設定できます。インベントリのスキャン範囲、頻度、レポート内容を設定できます。
コンソール
OSS コンソールにログインします。
インベントリを生成したいソースバケットに移動します。左側のナビゲーションウィンドウで、[Data Management] > [バケットインベントリ] を選択します。
[バケットインベントリ] ページで、[インベントリの作成] をクリックします。
[インベントリレポート ルールの設定] パネルで、次の表で説明されているパラメーターを設定します。
パラメーター
説明
ステータス
インベントリタスクのステータスを設定します。[有効] を選択します。
ルール名
インベントリタスクの名前を設定します。名前には小文字、数字、ハイフン (-) のみを含めることができます。ハイフン (-) で開始または終了することはできません。
インベントリの宛先バケット
インベントリファイルを保存するバケットを選択します。ソースバケットと宛先バケットは、同じ Alibaba Cloud アカウントに属し、同じリージョンにある必要があります。
インベントリレポートのストレージパス
インベントリレポートのストレージパスを設定します。
レポートを `examplebucket` バケットの `exampledir1` パスに保存するには、
exampledir1/と入力します。指定したパスがバケットに存在しない場合、OSS は自動的にパスを作成します。これを空白のままにすると、レポートはルートディレクトリに保存されます。
重要OSS-HDFS サービスが有効になっているバケットのインベントリレポートルールを設定する場合、OSS-HDFS サービスの通常の使用に影響を与えたり、データ汚染のリスクを招いたりしないように、インベントリレポートディレクトリを
.dlsdata/に設定しないでください。インベントリレポートの生成頻度
インベントリレポートの生成頻度を設定します。[毎週] または [毎日] を選択できます。ファイル数が 100 億を超える場合は、コストとスキャン圧力を削減するために [毎週] を選択することをお勧めします。
インベントリレポートの暗号化オプション
インベントリファイルを暗号化するかどうかを選択します。
[なし]: 暗号化しません。
[AES256]: AES256 暗号化アルゴリズムを使用してインベントリファイルを暗号化します。
[KMS]: KMS キーを使用してインベントリファイルを暗号化します。OSS 管理の KMS キーを使用するか、KMS コンソールで宛先バケットと同じリージョンに KMS キーを作成できます。
インベントリコンテンツ
エクスポートしたいファイル情報を選択します。これには、[オブジェクトサイズ]、[ストレージクラス]、[最終更新日]、[ETag]、[マルチパートアップロードステータス]、[暗号化ステータス]、[オブジェクト ACL]、[タグ数]、[ファイルタイプ]、[CRC-64] が含まれます。
プレフィックスによる一致
オプション。スキャンするオブジェクトのプレフィックス (例: exampledir1/)。このパラメーターを空のままにすると、バケット全体がスキャンされます。バケット内のオブジェクトが指定されたプレフィックスに一致しない場合、インベントリリストは生成されません。
高度なフィルタリングの設定
重要以下のフィルターオプションは、中国 (青島)、中国 (フフホト)、ドイツ (フランクフルト) リージョンでのみサポートされています。
ファイルサイズやストレージクラスなどの条件に基づいてエクスポートするファイルをフィルタリングするには、[高度なフィルタリングの設定] スイッチをオンにします。
サポートされているフィルターオプションは次のとおりです。
時間範囲: エクスポートするファイルの最終更新の開始日と終了日を設定します。時間は秒単位で正確です。
ファイルサイズ範囲: エクスport するファイルの最小および最大ファイルサイズを設定します。
説明ファイルサイズ範囲を設定する場合、最小ファイルサイズと最大ファイルサイズの両方が 0 B より大きく、最大値が 48.8 TB を超えないようにしてください。
ストレージクラス: エクスポートするファイルのストレージクラスを設定します。Standard、Infrequent Access、Archive Storage、Cold Archive、または Deep Cold Archive ストレージクラスのファイルをエクスポートすることを選択できます。
オブジェクトバージョン
バケットでバージョン管理が有効になっている場合、[現在のバージョン] または [すべてのバージョン] をエクスポートすることを選択できます。
[Alibaba Cloud OSS にバケットリソースへのアクセス権を付与することを理解し、同意します] を選択し、[OK] をクリックします。
多くのオブジェクトが関与する場合、インベントリファイルの生成に時間がかかることがあります。インベントリファイルが生成されたかどうかを確認できます。詳細については、「インベントリファイルが生成されたかどうかを確認する方法」をご参照ください。
SDK
以下に、一般的なソフトウェア開発キット (SDK) を使用してバケットインベントリを設定するためのコード例を示します。他の SDK を使用したコード例については、「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";
// OSS Client インスタンスを作成します。
// OSS Client が不要になったら、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 です。値を 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);
// 宛先バケットが属するアカウントの ID を指定します。
ossInvDest.setAccountId(accountId);
// 宛先バケットのロール ARN を指定します。
ossInvDest.setRoleArn(roleArn);
// 宛先バケットの名前を指定します。
ossInvDest.setBucket(destBucketName);
// 次のコードは、Key Management System (KMS) でホストされているカスタマーマスターキー (CMK) を使用してインベントリリストを暗号化する方法の例を示しています。
// 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({
// yourregion をバケットが配置されているリージョンに置き換えます。たとえば、リージョンが中国 (杭州) の場合は、リージョンを 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',
// 宛先バケット所有者の AccountId。
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',
// インベントリにオブジェクトのすべてのバージョンを含めるように設定します。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 successfully')
} 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 リソースネーム (ARN)、インベントリ名など、コマンドラインパラメータを指定します。
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--user_id', help='User account ID.', required=True)
parser.add_argument('--arn', help='The Alibaba Cloud Resource Name (ARN) of the role that has the permissions to read all objects from the source bucket and write objects to the destination bucket. Format: `acs:ram::uid:role/rolename`.', required=True)
parser.add_argument('--inventory_id', help='The name of the inventory.', 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
# カスタムエンドポイントが提供されている場合は、設定オブジェクトのエンドポイントパラメータを変更します。
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},'
)
# スクリプトが直接実行されたときに、メイン関数を呼び出して処理ロジックを開始します。
if __name__ == "__main__":
main() # スクリプトの関数のエントリポイントを指定します。制御プログラムのフローはここから始まります。using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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";
// バケットの所有者によって付与されたアカウント ID を指定します。
var accountId ="yourDestinationBucketAccountId";
// インベントリを設定するバケット内のすべてのオブジェクトを読み取る権限と、生成されたインベントリリストを保存するバケットにデータを書き込む権限が付与されている RAM ロールの名前を指定します。
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;
// 宛先バケットが属するアカウントの ID を指定します。
config.Destination.OSSBucketDestination.AccountId = accountId;
// 宛先バケットへのアクセスに使用される RAM ロールの Alibaba Cloud リソースネーム (ARN) を指定します。
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 へのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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);
/* バケットの所有者が操作を実行する権限を付与する Alibaba Cloud アカウントの ID を指定します。 */
dest.setAccountId("10988548********");
/* バケットの所有者が操作を実行する権限を付与する RAM ロールの名前を指定します。 */
dest.setRoleArn("acs:ram::10988548********:role/inventory-test");
/* 生成されたインベントリリストを保存するバケットを指定します。 */
dest.setBucket("yourDstBucketName");
/* 生成されたインベントリリストを保存するパスのプレフィックスを指定します。 */
dest.setPrefix("yourPrefix");
/* (オプション) インベントリリストの暗号化に使用される方法を指定します。有効な値: SSEOSS と SSEKMS。 */
//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", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the 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("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)
// バケットのインベントリを設定するリクエストを作成します。
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("failed to put bucket inventory %v", err)
}
// 結果を表示します。
log.Printf("put bucket inventory result:%#v\n", putResult)
}
ossutil
コマンドラインツールを使用して、スクリプト化されたバッチ操作を実行できます。始める前に、ossutil 2.0 をインストールして設定してください。
コマンド形式
ossutil api put-bucket-inventory --bucket <bucket_name> --inventory-id <inventory_id> --inventory-configuration <json_config>例
# このコマンドは、examplebucket という名前のバケットに daily-report という名前のインベントリルールを作成します。
# レポートは毎日生成され、destbucket の reports/ パスに保存されます。
# 事前に ossutil の認証情報を設定する必要があります。
ossutil api put-bucket-inventory --bucket examplebucket --inventory-id daily-report --inventory-configuration '{
"Id": "daily-report",
"IsEnabled": "true",
"Destination": {
"OSSBucketDestination": {
"Format": "CSV",
"AccountId": "100000000000000",
"RoleArn": "acs:ram::100000000000000:role/oss-inventory-role",
"Bucket": "acs:oss:::destbucket",
"Prefix": "reports/"
}
},
"Schedule": {
"Frequency": "Daily"
},
"IncludedObjectVersions": "Current",
"OptionalFields": {
"Field": ["Size", "LastModifiedDate", "StorageClass"]
}
}'注: put-bucket-inventory コマンドの詳細については、「put-bucket-inventory」をご参照ください。API
前述の操作は API に基づいています。高度なプログラムのカスタマイズが必要な場合は、REST API を直接呼び出すことができます。そのためには、署名を計算するためのコードを手動で記述する必要があります。
PutBucketInventory: インベントリルールの作成
GetBucketInventory: インベントリ設定の取得
DeleteBucketInventory: インベントリルールの削除
ListBucketInventory: インベントリルールの一覧表示
ステップ 3: インベントリの解析
インベントリタスクは非同期で実行されます。インベントリレポートのすべてのファイルは、スキャン開始時刻にちなんで名付けられたフォルダーに保存されます。コアファイルには、manifest.json と data/ ディレクトリ内の .csv.gz データファイルが含まれます。タスクが完了したことを確認するには、宛先バケットに manifest.json ファイルが生成されているかどうかを確認します。
ステップ 1: manifest.json ファイルの読み取り
インベントリレポートの列の順序は動的です。これは、インベントリルールを設定するときに選択したフィールドによって異なります。データファイルを処理する前に、まず manifest.json ファイルを解析して正しい列の順序を取得する必要があります。このファイルには、インベントリタスクのコアメタデータが含まれています。次の 2 つのフィールドに特に注意してください。
fileSchema: CSV ファイルの列の名前と正確な順序を定義する文字列。files: 現在のレポート用に生成されたすべての.csv.gzデータファイルの詳細をリストする配列。これには、パス (key)、サイズ (size)、MD5 チェックサム (MD5checksum) が含まれます。
manifest.json の例:
{
"sourceBucket": "your-source-bucket",
"destinationBucket": "your-destination-bucket",
"version": "2019-09-01",
"creationTimestamp": "1642994594",
"fileFormat": "CSV",
"fileSchema": "Bucket, Key, Size, LastModifiedDate, ETag, StorageClass, EncryptionStatus",
"files": [
{
"key": "inventory-reports/your-source-bucket/daily-report/data/a1b2c3d4-....csv.gz",
"size": 20480,
"MD5checksum": "F77449179760C3B13F1E76110F07****"
}
]
}ステップ 2: fileSchema に基づいて CSV データファイルを解析する
ファイルの取得と解凍:
manifest.jsonファイルのfiles配列から、各データファイルのkey(ファイルパス) を取得します。パスを使用して、対応する.csv.gz圧縮ファイルをダウンロードします。ファイルを解凍して、CSV 形式の生データを取得します。重要: CSV ファイルの
Keyは URL エンコードされています。使用する前に URL デコードする必要があります。順番にデータを解析する:
fileSchemaフィールドで定義された順序が、CSV ファイルの列見出しとして使用されます。解凍された CSV ファイルは 1 行ずつ読み取られます。各行はオブジェクト (ファイル) の完全なレコードを表し、各列はfileSchemaで指定されたフィールドに対応します。CSV コンテンツの例:
fileSchemaがBucket,Key,Size,StorageClass,LastModifiedDateの場合、対応する CSV コンテンツは次のようにフォーマットされます。"my-source-bucket","images/photo.jpg",102400,"Standard","2023-10-26T08:00:00.000Z" "my-source-bucket","docs/report.pdf",2048000,"IA","2023-10-25T10:30:00.000Z"
インベントリファイル
インベントリタスクが設定されると、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 (GZIP 圧縮されたインベントリデータファイル)ディレクトリ構造 | 説明 |
dest-prefix | このディレクトリは、インベントリレポート名に設定されたプレフィックスに基づいて生成されます。プレフィックスが空の場合、このディレクトリは省略されます。 |
source-bucket-name/ | このディレクトリは、インベントリレポートが設定されているソースバケットの名前に基づいて生成されます。 |
inventory_id/ | このディレクトリは、インベントリタスクのルール名に基づいて生成されます。 |
YYYY-MM-DDTHH-MMZ/ | このディレクトリは、バケットスキャンが開始された時刻を示す標準 UTC タイムスタンプです (例: 2020-05-17T16-00Z)。このディレクトリには、manifest.json ファイルと manifest.checksum ファイルが含まれています。 |
data/ | このディレクトリには、ソースバケット内のオブジェクトのリストと各オブジェクトのメタデータを含むインベントリファイルが含まれています。インベントリファイルは CSV 形式で、GZIP で圧縮されています。 重要
|
インベントリ機能によって生成される特定のファイルについて、以下に説明します。
マニフェストファイル
マニフェストファイルには、manifest.json と manifest.checksum が含まれます。詳細は次のとおりです。
manifest.json: インベントリに関するメタデータやその他の基本情報を提供します。
{ "creationTimestamp": "1642994594", "destinationBucket": "destbucket", "fileFormat": "CSV", "fileSchema": "Bucket, Key, VersionId, IsLatest, IsDeleteMarker, Size, StorageClass, LastModifiedDate, ETag, IsMultipartUploaded, EncryptionStatus, ObjectAcl, TaggingCount, ObjectType, Crc64", "files": [{ "MD5checksum": "F77449179760C3B13F1E76110F07****", "key": "destprefix/srcbucket/configid/data/a1574226-b5e5-40ee-91df-356845777c04.csv.gz", "size": 2046}], "sourceBucket": "srcbucket", "version": "2019-09-01" }フィールドの説明は次のとおりです。
フィールド名
説明
creationTimestamp
ソースバケットのスキャンが開始された時刻を示す UNIX タイムスタンプ形式のタイムスタンプ。
destinationBucket
インベントリファイルが保存される宛先バケット。
fileFormat
インベントリファイルの形式。
fileSchema
インベントリファイルに含まれるフィールドで、固定フィールドとオプションフィールドに分かれています。固定フィールドの順序は固定です。オプションフィールドの順序は、インベントリルールが設定されたときのインベントリコンテンツフィールドの配置によって異なります。コンソールでは、これはフィールドが選択された順序に基づいています。したがって、列とプロパティの不一致を避けるために、fileSchema のフィールド順序に基づいて csv.gz ファイルのデータ列を解析することをお勧めします。
インベントリルールを設定するときにオブジェクトバージョンの現在のバージョンを選択した場合、固定フィールド
Bucket, Keyが fileSchema の最初にリストされ、その後にオプションフィールドが続きます。インベントリルールを設定するときにオブジェクトバージョンのすべてのバージョンを選択した場合、固定フィールド
Bucket, Key, VersionId, IsLatest, IsDeleteMarkerが fileSchema の最初にリストされ、その後にオプションフィールドが続きます。
files
インベントリファイルの MD5 ハッシュ、完全なパス、およびサイズが含まれます。
sourceBucket
インベントリルールが設定されているソースバケット。
version
インベントリのバージョン番号。
manifest.checksum: manifest.json ファイルの MD5 ハッシュが含まれます (例:
8420A430CBD6B659A1C0DFC1C11A****)。
インベントリレポート
インベントリレポートは data/ ディレクトリに保存され、インベントリ機能によってエクスポートされたファイル情報が含まれています。インベントリレポートの例を以下に示します。

インベントリレポートのフィールドの具体的な順序は、インベントリルールが設定されたときに選択したフィールドの順序によって異なります。上記のインベントリレポートの例では、フィールドは左から右に次のように説明されています。
フィールド名 | 説明 |
Bucket | インベントリタスクが実行されるソースバケットの名前。 |
Key | バケット内のオブジェクトの名前。 オブジェクト名は URL エンコードされています。必要に応じてデコードできます。 |
VersionId | オブジェクトのバージョン ID。このフィールドは、設定されたインベントリルールがすべてのバージョンをエクスポートするように設定されている場合にのみ表示されます。
|
IsLatest | オブジェクトのバージョンが最新バージョンであるかどうか。このフィールドは、設定されたインベントリルールがすべてのバージョンをエクスポートするように設定されている場合にのみ表示されます。
|
IsDeleteMarker | オブジェクトのバージョンが削除マーカーであるかどうか。このフィールドは、設定されたインベントリルールがすべてのバージョンをエクスポートするように設定されている場合にのみ表示されます。
|
Size | オブジェクトのサイズ。 |
StorageClass | オブジェクトのストレージクラス。 |
LastModifiedDate | オブジェクトの最終更新時刻 (UTC 形式)。UTC+8 より 8 時間遅れています。 |
ETag | オブジェクトの ETag。 ETag は、オブジェクトが生成されたときに作成され、オブジェクトのコンテンツを識別します。
|
IsMultipartUploaded | オブジェクトがマルチパートアップロードによって生成されたかどうか。その場合、このフィールドの値は true で、そうでない場合は false です。 |
EncryptionStatus | オブジェクトが暗号化されているかどうか。オブジェクトが暗号化されている場合、このフィールドの値は true で、そうでない場合は false です。 |
ObjectAcl | オブジェクトのアクセス制御リスト (ACL)。詳細については、「オブジェクト ACL」をご参照ください。 |
TaggingCount | オブジェクトのタグの数。 |
ObjectType | オブジェクトタイプ。詳細については、「オブジェクトタイプ」をご参照ください。 |
Crc64 | オブジェクトの CRC-64。 |
制限
ルール数: 1 つのバケットでサポートされるインベントリルールは最大 1,000 (API/SDK 経由) または 10 (コンソール経由) です。
リージョン制限: ソースバケットと宛先バケットは同じリージョンにあり、同じ Alibaba Cloud アカウントに属している必要があります。この機能は、Alibaba Finance Cloud のバケットやリージョン未指定のバケットではサポートされていません。
課金
バケットインベントリ機能は無料ですが、以下の関連料金が発生します。
API リクエスト料金: インベントリルールを設定および取得する際に、
PutおよびGetリクエストに対して料金が発生します。OSS がインベントリレポートを宛先バケットに書き込む際に PUT リクエスト料金が発生します。インベントリレポートをダウンロードして読み取る際に GET リクエスト料金が発生します。ストレージ料金: 生成されたインベントリレポート (
manifestファイルとcsv.gzファイル) は宛先バケットのストレージスペースを占有し、標準ストレージとして課金されます。アウトバウンドトラフィック料金: パブリックエンドポイントを使用してインベントリレポートをダウンロードして読み取る場合、インターネット経由のアウトバウンドトラフィック料金が発生します。
不要なコストを避けるために、不要になったインベントリルールは速やかに削除してください。ライフサイクルルールを使用して、期限切れのインベントリレポートファイルを自動的に削除します。
本番稼働
ベストプラクティス
最小権限: 常に最小権限を持つ専用の RAM ロールを使用してください。本番環境では
AliyunOSSRoleを使用しないでください。パフォーマンスに関する推奨事項: トラフィックの多いソースバケットの場合、インベントリレポートを別の専用バケットに保存してください。これにより、レポートの書き込みによる帯域幅の競合を回避し、オンラインサービスへの影響を防ぐことができます。
コストの最適化: バケットインベントリは、インベントリファイルを毎日または毎週エクスポートすることをサポートしています。100 億を超えるファイルを持つバケットの場合、毎週インベントリを生成することをお勧めします。また、宛先バケットにライフサイクルルールを設定して、N 日 (例: 30 日) より古いインベントリレポートを自動的に削除し、ストレージコストを節約します。
バケット内のファイル数
エクスポートの推奨
<100 億
必要に応じて毎日または毎週のエクスポートを設定
100 億~500 億
毎週エクスポート
≥500 億
プレフィックスを一致させてバッチでエクスポート
プレフィックスによるパーティション分割: 数千億のオブジェクトを持つような超大規模バケットの場合、ビジネスプレフィックスに基づいて複数のインベントリルールを作成します。これにより、レポートをパーティション分割して生成でき、管理と処理が容易になります。
リスク防止
データ監査: インベントリファイルのエクスポート中に、オブジェクトの作成、削除、上書きなどの操作が行われると、インベントリリストにすべてのオブジェクトが含まれない場合があります。manifest.json ファイルの `createTimeStamp` より前の最終更新時刻を持つオブジェクトはインベントリファイルに表示されます。`createTimeStamp` より後の最終更新時刻を持つオブジェクトは表示されない場合があります。インベントリリスト内のオブジェクトに対して操作を実行する前に、HeadObject 操作を使用してオブジェクトのプロパティを確認してください。
監視とアラート: インベントリファイルの無制限な増加によるコストの無秩序な増加を防ぐために、宛先バケットのストレージ使用量を監視します。
PutBucketInventoryなどの API への呼び出しを監視して、設定の変更を追跡します。変更管理: プレフィックスや頻度の変更など、インベントリルールへの変更は、下流のデータ分析ワークフローに影響します。すべての変更は、バージョン管理とレビュープロセスに含める必要があります。