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路径,包括Project和Schema名称,如 如果在建表时选择了RoleARN的认证方式,该参数将协助用户自动生成访问OSS的STS 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。 |
返回值说明
返回STRING类型,生成的预签名URL。
使用示例
此处以杭州地域为例,展示如何在ECS中通过生成预签名URL下载OSS对象。
执行下述代码时,需要将project_name
和schema_name
替换成实际的项目名称和Schema名称。
步骤一:生成下载OSS对象的URL
登录OSS控制台,上传测试数据signedget.txt至
object-table-test/object_table_folder
目录下。具体操作请参见上传文件。使用本地客户端(odpscmd),或在DataWorks中创建MaxCompute SQL节点,以创建Object Table并刷新元数据信息缓存。
-- Object Table在MaxCompute项目中支持Schema功能,开启三层模型。 SET odps.namespace.schema=true; -- 选择对应MaxCompute项目。 USE <project_name>; -- 选择对应的schema。 USE SCHEMA <schema_name>; -- Object Table在MaxCompute项目中支持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;
查询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**** | +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
通过函数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 | +----------------------------------------+
查询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服务器下载
登录ECS控制台,单击左侧导航栏 。
切换杭州地域,选择目标实例,单击远程连接,通过Workbench连接ECS实例。
在终端对话框执行如下指令,下载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=****"
返回结果如图所示:
相关函数
GET_SIGNED_URL_FROM_OSS函数属于非结构化处理函数,更多非结构化处理相关函数请参见非结构化处理函数。