SDK访问DLF全托管存储

本文将介绍如何使用SDK来访问 DLF 全托管的 OSS 资源。

前提条件

已经创建DLF Catalog

阿里云账号(主账号)能直接调用 DLF OpenAPI。如果使用RAM账户,则需要具备以下权限:

  • 支持配置最小细粒化权限,详情请参见RAM授权Action参考

  • 拥有adminsuper_administratorRAM用户允许调用GetCatalogToken,详情请参见角色管理

使用SDK获取DLF Catalog Token 列举 OSS 文件

Java

CatalogTokenDemo

说明
  • 调用 DLF OpenAPI 的访问凭据支持(AccessKey 或者 STS Token),详情请参见使用访问凭据

  • 示例中以杭州地域为例,更多 DLF 支持地域及访问 Endpoint 请参见服务接入点

import com.aliyun.dlfnext20250310.Client;
import com.aliyun.dlfnext20250310.models.GetCatalogTokenResponse;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.ListObjectsV2Result;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.teaopenapi.models.Config;
import java.util.Map;

public class CatalogTokenDemo {

    public static void main(String[] args) throws Exception {
        // 设置需要访问的 region 和 dlf endpoint
        String region = "cn-hangzhou";
        String dlfEndpoint = "dlfnext.cn-hangzhou.aliyuncs.com";
        // 设置调用 DLF OpenAPI 的访问凭据
        String dlfAccessKeyId = "${AccessKeyId}";
        String dlfAccessKeySecret = "${AccessKeySecret}";
        // 配置并创建 DLF OpenAPI 客户端
        Config dlfConfig = new Config()
                .setRegionId(region)
                .setEndpoint(dlfEndpoint)
                .setAccessKeyId(dlfAccessKeyId)
                .setAccessKeySecret(dlfAccessKeySecret);
        Client dlfClient = new Client(dlfConfig);

        // 设置需要访问的 catalog 名称
        String catalogName = "${CatalogName}";
        // 调用 OpenAPI GetCatalogToken
        GetCatalogTokenResponse response = dlfClient.getCatalogToken(catalogName);
        // 可以从 response 中获取 token 过期时间,仅在有效期内的 token 可以访问 OSS, 过期后需要重新获取
        System.out.println("catalog token will expire at " + response.getBody().getExpiresAtMillis());
        // 从 response 中获取 catalog token
        Map<String, String> catalogToken = response.getBody().getToken();
        String ossAccessKeyId = catalogToken.get("fs.oss.accessKeyId");
        String ossAccessKeySecret = catalogToken.get("fs.oss.accessKeySecret");
        String ossSecurityToken = catalogToken.get("fs.oss.securityToken");
        // 默认返回 OSS 的内网 Endpoint,如果需要使用公网 Endpoint,则去除 "-internal"
        String ossEndpoint = catalogToken.get("fs.oss.endpoint").replace("-internal", "");
        String ossBucketName = catalogToken.get("fs.oss.bucket.name");

        // 使用 DefaultCredentialProvider 方法设置 OSS 的临时访问凭证
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(ossAccessKeyId, ossAccessKeySecret, ossSecurityToken);
        // 显式声明使用 V4 签名算法
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        // 创建 OSSClient 实例。
        // 当 OSSClient 实例不再使用时,调用shutdown方法以释放资源。
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(ossEndpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
        try {
            // 获取指定 bucket 的所有文件列表
            ListObjectsV2Result result = ossClient.listObjectsV2(ossBucketName);
            System.out.println("Files:");
            for (OSSObjectSummary object : result.getObjectSummaries()) {
                System.out.println(object.getKey());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

pom.xml

  • Maven Repository 中可以获取DLF OpenAPI最新的SDK包。

  • 如需查看 OSS SDK 安装指南及各编程语言操作 OSS(如文件上传、下载等)的代码示例,请参见OSS Java SDK

<!-- DLF SDK-->
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>dlfnext20250310</artifactId>
  <version>3.1.0</version>
</dependency>
<!-- OSS SDK -->
<dependency>
  <groupId>com.aliyun.oss</groupId>
  <artifactId>aliyun-sdk-oss</artifactId>
  <version>3.17.4</version>
</dependency>

Python

  1. Python环境:建议使用Python 3.10版本。

  2. 安装DLF OpenAPI依赖:

    pip install alibabacloud_dlfnext20250310==3.2.0
  3. 安装OSS依赖:

    pip install alibabacloud_oss_v2

    如需查看 OSS SDK 安装指南及各编程语言操作 OSS(如文件上传、下载等)的代码示例,请参见OSS Python SDK V2

代码示例

说明
  • 调用 DLF OpenAPI 的访问凭据支持(AccessKey 或者 STS Token),详情请参见使用访问凭据

  • 示例中以杭州地域为例,更多 DLF 支持地域及访问 Endpoint 请参见服务接入点

from alibabacloud_dlfnext20250310.client import Client as DlfNext20250310Client
from alibabacloud_tea_openapi import models as open_api_models
import alibabacloud_oss_v2 as oss

class CatalogTokenDemo:
    def __init__(self):
        pass

    @staticmethod
    def main() -> None:
        # 设置需要访问的 region
        region = 'cn-hangzhou'
        dlf_config = open_api_models.Config(
            # 设置调用 DLF OpenAPI 的访问凭据
            access_key_id='${access_key_id}',
            access_key_secret='${access_key_secret}',
            # 设置需要访问的 DLF endpoint
            endpoint=f'dlfnext.cn-hangzhou.aliyuncs.com',
            region_id=region
        )
        # 创建 DLF OpenAPI 客户端
        dlf_client = DlfNext20250310Client(dlf_config)

        # 设置需要访问的 catalog 名称
        catalog_name = '${catalog_name}'
        # 调用 OpenAPI GetCatalogToken
        response = dlf_client.get_catalog_token(catalog_name)
        # 可以从 response 中获取 token 过期时间,仅在有效期内的 token 可以访问 OSS, 过期后需要重新获取
        print(f'catalog token will expire at {response.body.expires_at_millis}')

        # 从 response 中获取 catalog token
        catalog_token = response.body.token
        oss_access_key_id = catalog_token.get('fs.oss.accessKeyId')
        oss_access_key_secret = catalog_token.get('fs.oss.accessKeySecret')
        oss_security_token = catalog_token.get('fs.oss.securityToken')
        # 默认返回 OSS 的内网 Endpoint,如果需要使用公网 Endpoint,则去除 "-internal"
        oss_endpoint = catalog_token.get('fs.oss.endpoint').replace('-internal', '')
        oss_bucket_name = catalog_token.get('fs.oss.bucket.name')

        # 设置 OSS 的临时访问凭证
        credentials_provider = oss.credentials.StaticCredentialsProvider(
            access_key_id=oss_access_key_id,
            access_key_secret=oss_access_key_secret,
            security_token=oss_security_token
        )
        oss_config = oss.config.Config(
            credentials_provider=credentials_provider,
            endpoint=oss_endpoint,
            region=region,
            signature_version='v4'

        )
        # 创建 OSS 客户端
        oss_client = oss.Client(oss_config)

        # 创建ListObjectsV2操作的分页器
        paginator = oss_client.list_objects_v2_paginator()

        # 遍历对象列表的每一页
        for page in paginator.iter_page(oss.ListObjectsV2Request(
                bucket=oss_bucket_name
        )
        ):
            # 遍历每一页中的对象
            for o in page.contents:
                # 打印对象的名称、大小和最后修改时间
                print(f'Object: {o.key}, {o.size}, {o.last_modified}')


if __name__ == '__main__':
    CatalogTokenDemo.main()