GET_SIGNED_URL_FROM_OSS函數用於為Object Storage Service中的檔案產生一個預簽名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函數屬於非結構化處理函數,更多非結構化處理相關函數請參見非結構化處理函數。