このトピックでは、オブジェクトテーブルを使用して OSS オブジェクトをアップロードおよびダウンロードするための署名付き URL を生成する方法について説明します。
背景情報
MaxCompute のオブジェクトテーブルを使用して、OSS 内の非構造化データを処理できます。オブジェクトテーブルと SQL クエリを使用して、メタデータに基づいて画像などのオブジェクトをフィルタリングし、処理のためにサードパーティのサービスに渡すことができます。ただし、これらのコンピューティングサービスには、OSS オブジェクトをダウンロードするための権限が必要です。一般的な方法には、永続的な AccessKey ペアの使用や、ロールの引き受けなどがあります。これらの方法には、次のような欠点があります。
永続的な AccessKey ペアは、セキュリティ上のリスクをもたらします。AccessKey ペアをサードパーティのサービスに保存する必要があります。AccessKey ペアが漏洩した場合、データは高いリスクにさらされます。
ロールの引き受けは、通常、MaxCompute が OSS にアクセスするために引き受けるロールを指します。サードパーティのサービスは別のロールを引き受ける必要があり、コードが複雑になります。
OSS は、署名付き URL を使用したファイルのダウンロードまたはプレビューをサポートしています。URL が有効であれば、HTTP 経由で直接オブジェクトにアクセスできます。この操作は簡単です。ダウンロード用の URL を生成するだけでなく、アップロード用の URL も生成できます。
GET_SIGNED_URL_FROM_OSS
GET_SIGNED_URL_FROM_OSS 関数は、OSS オブジェクトをダウンロードまたはアップロードするための署名付き URL を生成します。この URL を使用して、HTTP 経由で直接 OSS ファイルを読み書きできます。
制限事項
オブジェクトテーブルは、OSS の内部エンドポイントを使用してのみ作成できます。
この関数は MaxQA クエリアクセラレーションではサポートされていません。SQL ステートメントに
SET odps.mcqa.disable=true;コマンドを含める必要があります。OSS バケットで 公開アクセス禁止 機能が有効になっている場合、
GET_SIGNED_URL_FROM_OSS関数は一般公開アクセス可能な署名付き URL を生成できません。バケットの権限で署名付き URL の生成と使用が許可されていることを確認してください。
関数定義
STRING GET_SIGNED_URL_FROM_OSS (
STRING <full_object_table_name>,
STRING <key>
[, INT <timeToLiveSeconds>]
[, DATETIME <expiration>]
[, STRING <httpMethod>]
)パラメーター
パラメーター | 必須 | 型 | 説明 | デフォルト値 |
full_object_table_name | はい | STRING | プロジェクト名とスキーマ名を含む、3層モデルでのオブジェクトテーブルの完全なパス。例: テーブル作成時に RoleARN 認証を選択した場合、OSS にアクセスするための STS トークンが自動的に生成されます。 | なし |
key | はい | STRING | オブジェクトテーブル内でアクセスするオブジェクトの名前。key パラメーターの詳細については、「オブジェクトテーブルのプロパティの表示」の戻り値の説明をご参照ください。 | なし |
timeToLiveSeconds | いいえ | INT | 署名付き URL の有効期間 (秒単位)。最小値:1 秒。最大値:604,800 秒 (7 日間)。このパラメーターは expiration と相互排他です。 | 3,600 秒 |
expiration | いいえ | DATETIME | 署名付き URL の有効期限。値は現在時刻から 1 秒以上、604,800 秒 (7 日間) 以内である必要があります。このパラメーターは timeToLiveSeconds と相互排他です。 | 現在時刻から 3,600 秒後 |
httpMethod | いいえ | STRING | 生成される URL の HTTP メソッド。OSS からのダウンロード (読み取り) または OSS へのアップロード (書き込み) を指定します。
| GET |
戻り値
生成された署名付き URL を STRING 型で返します。
その他のシナリオの関数定義
最小構成:有効期間 3600 秒、GET メソッド。
STRING get_signed_url_from_oss ( STRING <full_object_table_name>, STRING <key> );カスタム有効期間 (秒):GET メソッド。
STRING GET_SIGNED_URL_FROM_OSS( STRING <full_object_table_name>, STRING <key>, INT <timeToLiveSeconds> );カスタム有効期間 (秒) と読み書き権限
STRING GET_SIGNED_URL_FROM_OSS( STRING <full_object_table_name>, STRING <key>, INT <timeToLiveSeconds>, STRING <httpMethod> );カスタム有効期間 (DATETIME):GET メソッド。
STRING GET_SIGNED_URL_FROM_OSS( STRING <full_object_table_name>, STRING <key>, DATETIME <expiration> );カスタム有効期限 (DATETIME) と読み書き権限
STRING GET_SIGNED_URL_FROM_OSS( STRING <full_object_table_name>, STRING <key>, DATETIME <expiration>, STRING <httpMethod> );
使用例
次の例では、中国 (杭州) リージョンの Elastic Compute Service (ECS) インスタンスから OSS オブジェクトをダウンロードするための署名付き URL を生成します。
以下のコードを実行する前に、project_name と schema_name を実際のプロジェクト名とスキーマ名に置き換えてください。
署名付き URL を使用した ECS インスタンスからの OSS オブジェクトのダウンロード
ステップ 1:OSS オブジェクトをダウンロードするための URL の生成
OSS コンソールにログインし、テストファイル signedget.txt を
object-table-test/object_table_folderディレクトリにアップロードします。詳細については、「ファイルのアップロード」をご参照ください。ローカルクライアント (odpscmd) を使用するか、DataWorks で MaxCompute SQL ノードを作成して、オブジェクトテーブルを作成し、メタデータキャッシュを更新します。
-- MaxCompute プロジェクトでスキーマをサポートするために3層モデルを有効にします。 SET odps.namespace.schema=true; -- MaxCompute プロジェクトを選択します。 USE <project_name>; -- スキーマを選択します。 USE SCHEMA <schema_name>; -- MaxCompute プロジェクトで 2.0 データ型システムを有効にします。 SET odps.sql.type.system.odps2=true; -- この関数は MaxQA クエリアクセラレーションではサポートされていません。 SET odps.mcqa.disable=true; -- オブジェクトテーブルを作成します。 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;オブジェクトテーブルのメタデータをクエリします。
SET odps.namespace.schema=true; 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 関数を使用してオブジェクトデータを読み取ります。
SET odps.namespace.schema=true; 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 | +----------------------------------------+オブジェクトテーブルをクエリして、署名付き URL を生成します。
SET odps.namespace.schema=true; 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=**** | +------------+
ステップ 2:ECS インスタンスからのオブジェクトのダウンロード
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=****"出力:
[xxx] opt]# curl -o /opt/ecs_signed.txt "http://object-table-test.oss-cn-hangzhou-inxxx&SAccessKeyId=STS.xxx&Signature=xxx&security-token=CAIS3gJxxx xxx % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 38 100 38 0 0 263 0 --:--:-- --:--:-- --:--:-- 265 opt]# ls aliyun-security ecs_signed.txt [root@iZbp1al9u5z0axrqx50mptZ opt]# cat ecs_signed.txt test maxcompute download files by url xxx opt]#
署名付き URL を使用した ECS インスタンスからの OSS オブジェクトのアップロード
ステップ 1:OSS オブジェクトをアップロードするための URL の生成
作成したtest_get_signed_url_from_oss オブジェクトテーブルをクエリして、署名付き URL を生成します。
SET odps.namespace.schema=true;
SELECT get_signed_url_from_oss(
'<project_name>.<schema_name>.test_get_signed_url_from_oss',
key,
3600,
'PUT'
)
FROM test_get_signed_url_from_oss;実行結果:
+------------+
| _c0 |
+------------+
| http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsinged_put?Expires=17490****&OSSAccessKeyId=****&Signature=****&security-token=**** |
+------------+ステップ 2:ECS インスタンスからのオブジェクトのアップロード
signedput.txt テストファイルを準備し、ECS インスタンスの /opt ディレクトリにアップロードします。
Workbench ターミナルで、次のコマンドを実行してデータを OSS にアップロードします。
# /opt ディレクトリに切り替えます。 cd /opt # 署名付き URL を使用して signedput.txt を OSS にアップロードします。 curl -X PUT -T /opt/signedput.txt -i "http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsinged_put?Expires=17490****&OSSAccessKeyId=****&Signature=****&security-token=****"実行結果を次の図に示します。

ステップ 3:オブジェクトテーブルのメタデータのクエリ
テーブルキャッシュを更新します。
SET odps.namespace.schema=true; ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;オブジェクトテーブルのメタデータをクエリします。
SET odps.namespace.schema=true; 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 | ノーマル | 2025-06-04 01:36:52 | Standard | 96D8258845DAB51BC****546E61A2563 | NONE | 13**** | 13**** | | singed_put | 44 | ノーマル | 2025-06-03 19:31:23 | Standard | F5EA64DF895CF08C3****7D3FD09F12 | NONE | 13**** | 13**** | +------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+GET_DATA_FROM_OSS を使用して OSS オブジェクトデータを読み取ります。
SET odps.namespace.schema=true; 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 | | test Object Table upload file to oss by url | +------------+
FAQ
Problem 1: The table path in the function is different from the path of the underlying table being queried
Error message
ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: Can't do ObjectTableTwoPhasesSplitting process (Caused by: java.lang.IllegalArgumentException: The first arg[xxx.default.test_get_signed_url_from_ossxxxxxx] of function GET_SIGNED_URL_FROM_OSS({object_table_full_name}, {object_key}, ...) can't be found in the underlying object table scans[xxx.default.test_get_signed_url_from_oss]).Problem description
The table name
test_get_signed_url_from_ossxxxxxxdoes not exist or is different from the table name specified in the SQL statement.Solution
Specify the name of an existing Object Table in the
project.schema.tableformat.
The timeToLiveSeconds parameter value is invalid
Error message
ODPS-0121095:[1,8] Invalid argument - The parameter <timeToLiveSeconds> of the function GET_SIGNED_URL_FROM_OSS() you specified (0) is invalid, it should be in the range [1, 604800].Problem description
The value of the timeToLiveSeconds parameter is invalid. The value must be in the range [1, 604800].
Solution
Specify a valid value for the time-to-live (TTL).
The HttpMethod parameter value is invalid
Error message
ODPS-0121095:[1,8] Invalid argument - The parameter <httpMethod> of the function GET_SIGNED_URL_FROM_OSS() you specified 'PU' is invalid, it can only be 'GET' or 'PUT'.Problem description
The value of the HttpMethod parameter is invalid.
Solution
Set the HttpMethod parameter to GET or PUT.
The link has expired because the validity period is too short
Error message
The Request has expired error is reported when you run the curl command.
Problem Description
The signed URL expired before it was used.
Solution
Set a reasonable value for the expiration parameter. Do not set an excessively long or short value.
The three-layer model syntax is not enabled
Error message
ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: Can't do ObjectTableTwoPhasesSplitting process (Caused by: java.lang.IllegalArgumentException: Invalid parameter of object table full name[str=xxx.test_get_signed_url_from_oss], which should be split up into 3 parts by '.' like '${project}.${schema}.${table}').Problem description
The schema syntax is not enabled. Therefore, the
project.schema.tableformat cannot be parsed.Solution
Add the
set odps.namespace.schema=true;command before the SQL statement to enable the schema syntax.