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

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心
  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见Go初始化
  • 请确保您拥有调用添加、查看、列举和删除存储空间清单配置的权限。Bucket所有者默认拥有此类权限,如果您无此类权限,请先向Bucket所有者申请对应操作的权限。
  • 单个Bucket最多只能有1000条清单配置。
  • 配置清单的源Bucket与存放导出的清单文件所在的目标Bucket必须位于同一个Region。

添加清单配置

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

package main

import (
    "fmt"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    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"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    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"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    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"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    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)
    }
}

相关文档