このトピックでは、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 パスは、 テーブル作成時に 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 |
戻り値
生成された署名付き 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_nameとschema_nameを実際のプロジェクト名とスキーマ名に置き換えてください。
署名付き URL を使用した OSS オブジェクトのダウンロード
ステップ 1:ダウンロード 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; -
オブジェクトテーブルのメタデータをクエリします。
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=****"戻り結果:
[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 でオブジェクトをアップロード
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 | ノーマル | 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**** | +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+アップロードされたオブジェクトからデータを読み取り、その内容を確認します。
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;コマンドを追加して、スキーマ構文を有効にしてください。