すべてのプロダクト
Search
ドキュメントセンター

:OSS オブジェクトをアップロードおよびダウンロードするための署名付き URL の生成

最終更新日:Aug 06, 2026

このトピックでは、オブジェクトテーブルを使用して 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層モデルでのオブジェクトテーブルの完全なパス。例:project.schema.object_table

テーブル作成時に 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:ダウンロード

  • PUT:アップロード

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_nameschema_name を実際のプロジェクト名とスキーマ名に置き換えてください。

署名付き URL を使用した ECS インスタンスからの OSS オブジェクトのダウンロード

ステップ 1:OSS オブジェクトをダウンロードするための URL の生成

  1. OSS コンソールにログインし、テストファイル signedget.txtobject-table-test/object_table_folder ディレクトリにアップロードします。詳細については、「ファイルのアップロード」をご参照ください。

  2. ローカルクライアント (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;
  3. オブジェクトテーブルのメタデータをクエリします。

    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****             |
    +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
  4. 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  |
    +----------------------------------------+
  5. オブジェクトテーブルをクエリして、署名付き 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 インスタンスからのオブジェクトのダウンロード

  1. ECS コンソールにログインします。左側のナビゲーションウィンドウで、インスタンス & イメージ > [インスタンス] を選択します。

  2. 中国 (杭州) リージョンで、ターゲットインスタンスを選択し、[リモート接続] をクリックして、ワークベンチを使用してインスタンスに接続します。

  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=****"

    出力:

    [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 インスタンスからのオブジェクトのアップロード

  1. signedput.txt テストファイルを準備し、ECS インスタンスの /opt ディレクトリにアップロードします。

  2. 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=****"

    実行結果を次の図に示します。

    opopopo

ステップ 3:オブジェクトテーブルのメタデータのクエリ

  1. テーブルキャッシュを更新します。

    SET odps.namespace.schema=true;
    ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;
  2. オブジェクトテーブルのメタデータをクエリします。

    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****   |
    +------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
  3. 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_ossxxxxxx does 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.table format.

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.table format cannot be parsed.

  • Solution

    Add the set odps.namespace.schema=true; command before the SQL statement to enable the schema syntax.