GET_SIGNED_URL_FROM_OSS

GET_SIGNED_URL_FROM_OSS函数用于为对象存储(OSS)中的文件生成一个预签名URL。使用此URL可以在一定时间内通过HTTP协议直接上传(PUT)或下载(GET)文件,无需提供额外的访问凭证。

使用场景

MaxCompute提供了Object Table功能,支持数仓计算引擎访问OSS存储的非结构化数据及其元信息。详情请参见OBJECT TABLE定义

Object Table中存储了对应路径下OSS对象的元信息,同时可通过GET_SIGNED_URL_FROM_OSS函数,动态生成OSS预签名URL,实现对文件的上传和下载访问。更多信息请参见生成签名地址上传和下载OSS对象

使用限制

  • 目前仅支持通过OSS内网方式创建Object Table。

  • 暂不支持用于MaxQA查询加速。需添加参数SET odps.mcqa.disable=true;SQL语句一并运行。

  • 如果OSS Bucket启用了阻止公共访问功能,则无法通过GET_SIGNED_URL_FROM_OSS函数生成公网可访问的签名地址。请确保Bucket权限配置允许生成和使用签名地址。

命令格式

STRING GET_SIGNED_URL_FROM_OSS (
  STRING <full_object_table_name>, 
  STRING <key>
  [, INT <timeToLiveSeconds>] 
  [, DATETIME <expiration>]
  [, STRING <httpMethod>]
)

参数说明

参数

是否必填

数据类型

说明

默认值

full_object_table_name

STRING

三层模型下,完整的OBJECT TABLE路径,包括ProjectSchema名称,如project.schema.object_table

如果在建表时选择了RoleARN的认证方式,该参数将协助用户自动生成访问OSSSTS Token。

key

STRING

即被访问对象在该Object Table中的名称。详情请参见查看OBJECT TABLE属性返回结果中的key参数说明。

timeToLiveSeconds

INT

签名URL的有效期时长,最小1秒,最大7天(604800秒)。与expiration不可同时使用。

默认为3600秒。

expiration

DATETIME

签名URL过期时间点。最小比当前时间大1秒,最大比当前时间多7天(604800秒)。 与timeToLiveSeconds不可同时使用。

默认比当前时间大3600秒。

httpMethod

STRING

生成URL之后使用方式,是下载(读取OSS数据)还是上传(数据写入OSS)。

  • GET表示下载。

  • PUT表示上传。

默认值是GET。

返回值说明

返回STRING类型,生成的预签名URL。

使用示例

此处以杭州地域为例,展示如何在ECS中通过生成预签名URL下载OSS对象。

执行下述代码时,需要将project_nameschema_name替换成实际的项目名称和Schema名称。

步骤一:生成下载OSS对象的URL

  1. 登录OSS控制台,上传测试数据signedget.txtobject-table-test/object_table_folder目录下。具体操作请参见上传文件

  2. 使用本地客户端(odpscmd),或在DataWorks中创建MaxCompute SQL节点,以创建Object Table并刷新元数据信息缓存。

    -- Object TableMaxCompute项目中支持Schema功能,开启三层模型。 
    SET odps.namespace.schema=true;
    
    -- 选择对应MaxCompute项目。 
    USE <project_name>;
    
    -- 选择对应的schema。 
    USE SCHEMA <schema_name>;
    
    -- Object TableMaxCompute项目中支持2.0数据类型系统。 
    SET odps.sql.type.system.odps2=true;
    
    -- 目前在MaxQA查询加速中暂不支持使用。 
    SET odps.mcqa.disable=true;
    
    -- 创建Object Table。 
    CREATE OBJECT TABLE IF NOT EXISTS test_get_signed_url_from_oss 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/object_table_folder/';
    
    -- 刷新表缓存。 
    ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;
  3. 查询Object Table表中的元数据信息。

    SELECT * FROM test_get_signed_url_from_oss;

    返回结果如下:

    +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
    | key           | size       | type       | last_modified       | storage_class | etag                             | restore_info | owner_id   | owner_display_name |
    +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
    | signedget.txt | 38         | Normal     | 2025-06-04 01:36:52 | Standard      | 96D8258845DAB51BC9B****6E61A2563 | NONE         | 13****     | 13****             |
    +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
  4. 通过函数GET_DATA_FROM_OSS读取对象数据。

    SELECT 
      STRING(   
        GET_DATA_FROM_OSS(
          '<project_name>.<schema_name>.test_get_signed_url_from_oss',
          key
        )
      )
    FROM test_get_signed_url_from_oss;

    返回结果如下:

    +----------------------------------------+
    | _c0                                    |
    +----------------------------------------+
    | test maxcompute download files by url  |
    +----------------------------------------+
  5. 查询Object Table并生成签名地址URL。

    SELECT GET_SIGNED_URL_FROM_OSS(  
      '<project_name>.<schema_name>.test_get_signed_url_from_oss',    
      key) 
    FROM test_get_signed_url_from_oss;

    返回结果如下:

    +------------+
    | _c0        |
    +------------+
    | http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=**** |
    +------------+

步骤二:通过ECS服务器下载

  1. 登录ECS控制台,单击左侧导航栏实例与镜像 > 实例

  2. 切换杭州地域,选择目标实例,单击远程连接,通过Workbench连接ECS实例。

  3. 在终端对话框执行如下指令,下载OSS对象:

    -- 切换至opt目录下
    cd /opt
    
    --通过签名URL下载对应OSS对象。
    curl -o /opt/ecs_signed.txt "http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=****"

    返回结果如图所示:

    yuddd

相关函数

GET_SIGNED_URL_FROM_OSS函数属于非结构化处理函数,更多非结构化处理相关函数请参见非结构化处理函数