全部产品
Search
文档中心

对象存储 OSS:Go存储空间清单

更新时间:Dec 20, 2023

本文介绍如何添加、查看、批量列举和删除存储空间(Bucket)的清单(Inventory)配置。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

  • 请确保您拥有调用添加、查看、列举和删除存储空间清单配置的权限。Bucket所有者默认拥有此类权限,如果您无此类权限,请先向Bucket所有者申请对应操作的权限。

  • 单个Bucket最多只能有1000条清单配置。

  • 配置清单的源Bucket与存放导出的清单文件所在的目标Bucket必须位于同一个Region。

添加清单配置

以下代码用于为某个Bucket添加清单配置:

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实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	IsEnabled := true

	// 如果需要使用KMS加密清单,请参考如下设置。
	//var invEncryption oss.InvEncryption
	//var invSseOss oss.InvSseOss
	//var invSseKms oss.InvSseKms
	//invSseKms.KmsId = "<yourKmsId>" // 填写KMS密钥ID。
	//invEncryption.SseOss = &invSseOss // 使用OSS完全托管加密(SSE-OSS)方式进行加密。
	//invEncryption.SseKms = &invSseKms // 使用KMS托管密钥(SSE-KMS)的方式进行加密。

	invConfig := oss.InventoryConfiguration{
		// 由用户指定的清单名称,清单名称在当前Bucket下必须全局唯一。
		Id: "yourInventoryId2",
		// 启用清单配置。
		IsEnabled: &IsEnabled,

		// 设置清单筛选规则,指定筛选Object的前缀。
		Prefix: "yourFilterPrefix",
		OSSBucketDestination: oss.OSSBucketDestination{
			// 导出清单文件的文件格式。
			Format: "CSV",

			// 存储空间所有者授予的账户ID,例如109885487000****。
			AccountId: "yourGrantAccountId",

			// 存储空间所有者授予操作权限的角色名,比如acs:ram::109885487000****:role/ram-test。
			RoleArn: "yourRoleArn",

			// 存放导出的清单结果的Bucket名称。
			Bucket: "acs:oss:::" + "yourDestBucketName",

			// 存放清单结果的存储路径前缀。
			Prefix: "yourDestPrefix",

			// 如果清单需要加密,请参考以下代码。
			//Encryption:     &invEncryption,
		},

		// 清单文件导出的周期。
		Frequency: "Daily",

		// 是否在清单中包含Object的所有版本信息。
		IncludedObjectVersions: "All",

		OptionalFields: oss.OptionalFields{
			// 清单结果中包含的配置项。
			Field: []string{
				"Size", "LastModifiedDate", "ETag", "StorageClass", "IsMultipartUploaded", "EncryptionStatus",
			},
		},
	}
	// yourBucketName填写待配置清单规则的Bucket名称。
	err = client.SetBucketInventory("yourBucketName", invConfig)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

查看清单配置

以下代码用于查看某个Bucket的清单配置:

package main

import (
	"encoding/xml"
	"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实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// yourBucketName填写Bucket名称。
	// yourInventoryId填写清单规则名称。
	result, err := client.GetBucketInventory("yourBucketName", "yourInventoryId")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 打印清单信息。
	bs, err := xml.MarshalIndent(result, "  ", "    ")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println(string(bs))
}

批量列举清单配置

说明

单次请求最多可获取100条清单配置项内容。若需获取超过100条清单配置项,则需发送多次请求,并保留相应的Token,作为下一次请求的参数。

以下代码用于批量列举某个Bucket的清单配置:

package main

import (
	"encoding/xml"
	"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实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	var sumResult oss.ListInventoryConfigurationsResult
	vmarker := ""
	for {
		// yourBucketName填写Bucket名称。
		listResult, err := client.ListBucketInventory("yourBucketName", vmarker)
		if err != nil {
			fmt.Println("Error:", err)
			os.Exit(-1)
		}
		sumResult.InventoryConfiguration = append(sumResult.InventoryConfiguration, listResult.InventoryConfiguration...)
		if listResult.IsTruncated != nil && *listResult.IsTruncated {
			vmarker = listResult.NextContinuationToken
		} else {
			break
		}
	}

	// 打印所有清单信息。
	bs, err := xml.MarshalIndent(sumResult, "  ", "    ")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	fmt.Println(string(bs))
}

删除清单配置

以下代码用于删除某个Bucket的清单配置:

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实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 删除清单配置。
	// yourBucketName填写Bucket名称。
	// yourInventoryId填写清单规则名称。
	err = client.DeleteBucketInventory("yourBucketName", "yourInventoryId")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}

相关文档