このトピックでは、オブジェクトテーブルを使用して OSS オブジェクトをアップロードおよびダウンロードするための署名付き URL を生成する方法について説明します。
背景情報
MaxCompute オブジェクトテーブルは、OSS の非構造化データを処理できます。オブジェクトテーブルと SQL クエリを使用して、時間、名前、サイズなどの基準に基づいて処理するイメージのリストを正確にフィルターできます。その後、これらのリストをサードパーティのサービスに渡して処理できます。ただし、これらのコンピューティングサービスには、OSS オブジェクトをダウンロードするための権限が必要です。一般的な方法には、永続的な AccessKey (AK) の使用やサービスロールの偽装などがあります。これらの方法には、次の欠点があります。
永続的な AK は、サードパーティのサービスに保存する必要があるため、セキュリティリスクをもたらします。AK が漏洩した場合、高いセキュリティリスクが生じます。
サービスロールの偽装は、通常、MaxCompute が OSS にアクセスするときに偽装するロールを指します。サードパーティのサービスは別のロールを偽装する必要があり、コードが複雑になります。
OSS は、署名付き URL を使用したファイルのダウンロードまたはプレビューをサポートしています。署名付き URL の有効期間が十分に長い場合、HTTP プロトコルを介してオブジェクトに直接アクセスできます。このプロセスは簡単です。ダウンロード用の URL を生成するだけでなく、必要に応じてアップロード用の URL を生成することもできます。
GET_SIGNED_URL_FROM_OSS
OSS データをダウンロードまたはアップロードするための、認証情報不要の署名付き URL を生成します。これにより、ユーザーは HTTP プロトコルを介して OSS ファイルを直接読み書きできます。
制限
オブジェクトテーブルは、OSS 内部ネットワーク内でのみ作成できます。
この関数は MaxQA クエリアクセラレーションではサポートされていません。
SET odps.mcqa.disable=true;パラメーターを追加し、SQL 文と一緒に実行する必要があります。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 モデルでは、これは OBJECT TABLE の完全なパスです。パスには、 テーブルの作成時に RoleARN 認証を選択した場合、このパラメーターは OSS にアクセスするためのセキュリティトークンサービス (STS) トークンを自動的に生成するのに役立ちます。 | なし |
key | はい | STRING | オブジェクトテーブルでアクセスするオブジェクトの名前です。詳細については、「OBJECT TABLE のプロパティの表示」の戻り結果における key パラメーターの説明をご参照ください。 | なし |
timeToLiveSeconds | いいえ | INT | 署名付き URL の有効期間 (秒単位) です。最小値は 1 秒です。最大値は 7 日 (604,800 秒) です。このパラメーターは expiration と一緒に使用することはできません。 | 3600 秒。 |
expiration | いいえ | DATETIME | 署名付き URL の有効期限です。時刻は、現在時刻から少なくとも 1 秒後、かつ現在時刻から 7 日 (604,800 秒) 以内である必要があります。このパラメーターは timeToLiveSeconds と一緒に使用することはできません。 | 現在時刻から 3600 秒後。 |
httpMethod | いいえ | STRING | 生成された URL で使用する HTTP メソッドです。これにより、ダウンロード (OSS からのデータ読み取り) またはアップロード (OSS へのデータ書き込み) を指定します。
| デフォルト値は GET です。 |
戻り値
生成された署名付き URL である STRING 値を返します。
さまざまなシナリオに対応する他の関数定義
最小モード。URL は 3,600 秒で有効期限が切れます。デフォルトのメソッドは GET です。
STRING get_signed_url_from_oss ( STRING <fullTableName>, STRING <ossKey> );カスタムの有効期間。デフォルトのメソッドは GET です。
STRING GET_SIGNED_URL_FROM_OSS( STRING <fullTableName>, STRING <ossKey>, INT <timeToLiveSeconds> );カスタムの有効期間とアクセスメソッド。
STRING GET_SIGNED_URL_FROM_OSS( STRING <fullTableName>, STRING <ossKey>, INT <timeToLiveSeconds>, STRING <httpMethod> );カスタムの有効期間。デフォルトのメソッドは GET です。
STRING GET_SIGNED_URL_FROM_OSS( STRING <fullTableName>, STRING <ossKey>, DATETIME <expiration> );カスタムの有効期間とアクセスメソッド。
STRING GET_SIGNED_URL_FROM_OSS( STRING <fullTableName>, STRING <ossKey>, DATETIME <expiration>, STRING <httpMethod> );
例
このセクションでは、中国 (杭州) リージョンでの例を示します。署名付き URL を生成し、それを使用して Elastic Compute Service (ECS) インスタンスから OSS オブジェクトをダウンロードする方法を示します。
次のコードを実行するときは、project_name と schema_name を実際のプロジェクト名とスキーマ名に置き換えてください。
署名付き URL を使用して ECS インスタンスから OSS オブジェクトをダウンロードする
ステップ 1: OSS オブジェクトをダウンロードするための URL を生成する
OSS コンソールにログインし、テストデータファイル signedget.txt を
object-table-test/object_table_folderディレクトリにアップロードします。詳細については、「ファイルのアップロード」をご参照ください。DataWorks でローカルクライアント (odpscmd) を使用するか、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;オブジェクトテーブルのメタデータをクエリします。
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 | +----------------------------------------+オブジェクトテーブルをクエリして、署名付き 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=**** | +------------+
ステップ 2: 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=****"次の図に、返された結果を示します。

署名付き URL を使用して ECS インスタンスから OSS オブジェクトをアップロードする
ステップ 1: OSS オブジェクトをアップロードするための URL を生成する
作成した test_get_signed_url_from_oss オブジェクトテーブルを使用します。オブジェクトテーブルをクエリして、署名付き URL を生成します。次のコードは例を示しています。
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 サーバーからオブジェクトをアップロードする
作成した ECS サーバーを使用します。signedput.txt テストデータファイルを準備し、/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: オブジェクトテーブルのメタデータをクエリする
次のコマンドを実行して、テーブルキャッシュをリフレッシュします。
ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;次のコマンドを実行して、オブジェクトテーブルのメタデータをクエリします。
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-03 01:36:52 | Standard | 96D8258845DAB51BC****546E61A2563 | NONE | 13**** | 13**** | | singed_put | 44 | Normal | 2025-06-03 19:31:23 | Standard | F5EA64DF895CF08C3****7D3FD09F12 | NONE | 13**** | 13**** | +------------+------------+------------+---------------+---------------+------------+--------------+------------+--------------------+GET_DATA_FROM_OSS 関数を使用して 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 | | test Object Table upload file to oss by url | +------------+
よくある質問
FAQ 1: 関数のテーブルパスが、クエリ対象の基になるテーブルのパスと異なる
エラーメッセージ
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]).エラーの説明
テーブル名
test_get_signed_url_from_ossxxxxxxが存在しないか、SQL 文でアクセスされるテーブル名と異なります。解決策
既存のオブジェクトテーブルの名前を入力します。名前は、クエリ対象のテーブルと同じで、
project.schema.table形式である必要があります。
FAQ 2: timeToLiveSeconds パラメーターの値が無効である
エラーメッセージ
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].エラーの説明
関数の有効期間パラメーター (timeToLiveSeconds) の値が無効です。値は 1 から 604,800 までの整数である必要があります。
解決策
有効な範囲内の有効期間を入力します。
FAQ 3: HttpMethod パラメーターの値が無効である
エラーメッセージ
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'.エラーの説明
関数の HttpMethod パラメーターの値が無効です。
解決策
HttpMethod パラメーターの値は GET または PUT のみです。
FAQ 4: 有効期間が短すぎるため、署名付き URL の有効期限が切れている
エラーメッセージ
curl コマンドを実行すると、「Request has expired」エラーが報告されます。
エラーの説明
署名付き URL の有効期間が短すぎて、URL の有効期限が切れています。
解決策
expiration パラメーターを適切な値に設定します。期間を長すぎたり短すぎたりしないように設定することをお勧めします。
FAQ 5: レイヤー 3 モデル構文のスイッチが有効になっていない
エラーメッセージ
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}').エラーの説明
スキーマ構文のスイッチが有効になっていません。そのため、
project.schema.table構文形式を認識できません。解決策
関数の SQL 文の前に
set odps.namespace.schema=true;を追加して、スキーマ構文を有効にします。