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

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

最終更新日:Jun 22, 2026

このトピックでは、Object Table を使用して OSS オブジェクトをアップロードおよびダウンロードするための署名付き URL を生成する方法について説明します。

背景情報

MaxCompute の Object Table を使用して、OSS 内の非構造化データを処理できます。Object Table を SQL と組み合わせて使用することで、変更時刻、名前、サイズなどの基準に基づいて、画像などのオブジェクトのリストを正確にフィルタリングし、そのリストをサードパーティのサービスに渡して処理できます。しかし、これらのサービスが OSS からオブジェクトをダウンロードするには権限が必要です。恒久的なアクセスキーの使用やサービスロールの引き受けといった従来の方法には、次のような欠点があります。

  • サードパーティのサービスにアクセスキーを保存すると、キーが漏洩した場合に高いセキュリティリスクが生じます。

  • サービスロールの引き受けは、通常 MaxCompute が OSS にアクセスするために引き受けるロールを指します。サードパーティのサービスは別のロールを引き受ける必要があり、コードが複雑になります。

OSS は、署名付き URL を使用したファイルのダウンロードまたはプレビューをサポートしています。十分な有効期間を持つ URL を使用すると、ユーザーは HTTP 経由で直接オブジェクトにアクセスできるため、プロセスが簡素化されます。ダウンロード用の URL を生成するだけでなく、データをアップロードするための URL も生成できます。

GET_SIGNED_URL_FROM_OSS

OSS オブジェクトのダウンロードまたはアップロード用に、認証情報不要の署名付き URL を生成します。これにより、ユーザーは HTTP 経由でオブジェクトを直接読み書きできます。

制限事項

  • 現在、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 パスは、project.schema.object_table のようになります。

テーブル作成時に RoleARN 認証方式を選択した場合、このパラメーターにより、ユーザーが OSS にアクセスするための STS トークンが自動的に生成されます。

なし

key

はい

STRING

このオブジェクトテーブル内にある、アクセス対象オブジェクトの名前です。詳細については、「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:ダウンロード

  • PUT:アップロード

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>
    );
  • カスタム有効期間と HTTP メソッド。

    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>
    );
  • カスタム有効期限と HTTP メソッド。

    STRING GET_SIGNED_URL_FROM_OSS(
      STRING <fullTableName>, 
      STRING <ossKey>, 
      DATETIME <expiration>, 
      STRING <httpMethod>
    );

ここでは杭州リージョンを例に、Elastic Compute Service (ECS) で署名付き URL を生成して OSS オブジェクトをダウンロードする方法を示します。

以下のコードを実行する際は、project_nameschema_nameを実際のプロジェクト名とスキーマ名に置き換えてください。

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

ステップ 1:ダウンロード 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. オブジェクトテーブルのメタデータをクエリします。

    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 を使用してオブジェクト データを読み取ります。

    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 を生成します。

    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. 杭州リージョンに切り替え、対象のインスタンスを選択し、リモート接続をクリックして、Workbench 経由で ECS インスタンスに接続します。

  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&OSSAccessKeyId=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 を使用した OSS オブジェクトのアップロード

ステップ 1:アップロード URL の生成

作成済みの Object Table test_get_signed_url_from_oss を使用します。Object Table をクエリし、アップロード用の署名付き URL を生成します。次のコードは一例です。

SELECT get_signed_url_from_oss(
  '<project_name>.<schema_name>.test_get_signed_url_from_oss', 
  'singed_put',
  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. ECS インスタンス上で、テストデータファイル signedput.txt を準備し、/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=****"

ステップ 3:アップロードの確認

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

    ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;
  2. 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-03 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. アップロードされたオブジェクトからデータを読み取り、その内容を確認します。

    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 |
    +----------------------------------------------+

よくある質問

エラー:関数内のテーブルパスの不一致

  • エラーメッセージ

    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 ステートメントの FROM 句で指定されたテーブル名と一致しません。

  • 解決策

    関数で指定された Object Table 名が存在し、FROM 句のテーブル名と同一であることを確認してください。project.schema.table 形式を使用してください。

エラー: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 までの整数である必要があります。

  • 解決策

    有効な範囲内で有効期間を指定してください。

エラー: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 である必要があります。

エラー:署名付き URL の有効期限切れ

  • エラーメッセージ

    curl コマンドが Request has expired エラーを返します。

  • 原因

    署名付き URL の有効期間が短すぎたため、使用される前に URL の有効期限が切れました。

  • 解決策

    expiration または timeToLiveSeconds パラメーターに大きな値を設定して、有効期間を延長してください。

エラー: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; コマンドを追加して、スキーマ構文を有効にしてください。