このトピックでは、Object Storage Service (OSS) SDK for Pythonに関するよくある質問に対する回答を提供します。
OSS SDK for Pythonを使用して開始されたマルチパートアップロードタスクが失敗しました。
解決策:
オブジェクトがOSSに直接アップロードされるか、CDNなどのプロキシを使用してOSSにアップロードされるかを確認します。 CDNを使用してオブジェクトをOSSにアップロードする場合は、オブジェクトのETagを公開し、
Access-Control-Allow-origin
、Access-Control-Allow-Methods
、Access-Control-Allow-headers
などのクロスオリジンヘッダーを設定します。 詳細については、「PutBucketcors」をご参照ください。ネットワークのタイムアウトによりアップロードタスクが失敗した場合は、再開可能なアップロードを使用してオブジェクトをアップロードすることを推奨します。 これにより、オブジェクトをカスタムサイズのパーツに分割し、同時にパーツをアップロードできます。 例外が発生した場合は、OSS SDK for Pythonから返されたエラーメッセージを表示および分析します。
失敗したアップロードタスクによって生成されたパーツを削除し、オブジェクトを再アップロードします。
問題が解決しない場合は、次の情報を含むチケットを起票してください。
OSS SDK for Pythonによって返されるエラーメッセージのリクエストID。
オブジェクトを再アップロードするときに、次のtcpdumpコマンドを実行してキャプチャされたパケット。
tcpdump -i <ポート名> -s0ホスト <OSSエンドポイント> -w faild.pcap
ossutilのアップロードとダウンロードの速度は、OSS SDK for Pythonよりも高速です。
原因
ossutilはOSS SDK for Goに基づいて開発され、同時アップロードシナリオでパフォーマンスが向上します。 OSS SDK for Pythonのダウンロード速度がossutilのダウンロード速度より遅い場合、crcmodの誤ったインストールが原因である可能性があります。
解決策
crcmodを正しくインストールします。 詳細については、「インストール」をご参照ください。
CentOSシステムでOSS SDK for Pythonのマルチパートアップロード機能を呼び出すことができます。 Ubuntuシステムでマルチパートアップロード機能を呼び出すと、HTTPステータスコード403が返されます。
tcpdumpを使用して、クライアントのパケットをキャプチャします。 パケットを分析して、リクエストのヘッダー情報が正しくないため、計算された署名がOSSサーバーの署名と異なるかどうかを判断します。
POST /ttsservice % 2Fpasswd?uploadId=D468E486D1D94D90A1AB8885A4E32AE0 HTTP/1.1
ホスト: rokid.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: ID
受け入れる: text/html
コンテンツ-長さ: 137
日付: 12月29日 (土) 2018 07:32:34 GMT
承認: OSS LTAIknFr:r2KPR0y4E0G5tnU/MYdcvXHP ****
コンテンツタイプ: application/x-www-form-urlencoded
ユーザーエージェント: aliyun-sdk-python/2.6.0(Linux/4.4.0-31-generic/x86_64;3.4.3)
<CompleteMultipartUpload><Part><PartNumber>1</PartNumber><ETag>"3195544E19D19D99658706D5 ****"</ETag></Part></CompleteMultipartUpload>HTTP/1.1 403禁止
サーバー: AliyunOSS
日付: 12月29日 (土) 2018 07:33:43 GMT
Content-Type: application/xml
コンテンツ-長さ: 1122
接続: キープアライブ
x-oss-request-id: 5C2723573183 ****
x-oss-server-time: 0
<?xml version="1.0" encoding="UTF-8"?>
<エラー>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. キーと署名方法を確認します。</Message>
<RequestId> 5C2723573183A12D </RequestId>
<HostI d>rokid.oss-cn-hangzhou.aliyuncs.com</HostId>
<OSSAccessKeyId> LTAXXX </OSSAccessKeyId>
<SignatureProvided>r2KPR0y4E0G5tnU/MYdc ****</SignatureProvided>
<StringToSign>POST
アプリケーション /x-www-form-urlencoded
2018年12月29日土曜日07:32:34 GMT
/rokid/ttsservice/passwd?uploadId=D468E486D1D94D90A1AB8885A4E3 ****</StringToSign>
StringToSignBytes>50 4F 53 54 0A 61 70 6C 69 61 70 6C 69 61 74 69 6F 6E 2F 78 2D 77 2D 77 2D 66 6F 72 6D 75 72 66E 63 64 65 6F 64 0A 53 61 74 2C 20 39 20 65 20 64 32 63 30 31 20 38 30 37 3A 33 32 3A 32 32 34 47 4D 54 0A 72 62F F 6B 69 64 2D 6F 70 73 2D 6D 6F 64 65 6C 2F 74 73 73 65 72 76 69 63 65 2F 70 61 73 73 77 64 3F 75 70 6C 61 49 64 3D 44 36 38 34 45 34 38 36 44 31 39 34 44 39 39 30 41 42 38 38 35 41 45 35 45 32 41 45 30 </StringToSignBytes>
</エラー>
サーバによって受信された署名がクライアント上で計算されたものと異なる場合、要求の内容は修正される。 HTTPSを使用してオブジェクトをアップロードすることを推奨します。
上記のコードは、クライアントでtcpdumpによってキャプチャされたパケットを示しています。 次のスクリプトでキャプチャされたヘッダー情報を使用して署名を計算し、計算された署名がキャプチャされたパケットの署名と一致するかどうかを確認します。
インポートbase64
hmacのインポート
インポートシャ
mac = hmac.new("<Secretkey>","POST\n\napplication/x-www-form-urlencoded\nSat, 29 Dec 2018 07:32:34 GMT\n/rokid/ttsservice/passwd?uploadId=D468E486D1D94D90A1AB8885A4E3 ****", sha)
Signature = base64.b64encode(mac.digest())
プリント (署名)
署名が一致している場合、OSS SDKによって生成されたリクエストの署名は正しいものです。 計算された署名がキャプチャされたパケット内の署名と一致しない場合、その理由は、署名に基づいて計算されたMD5ハッシュが互換性の問題のためにUbuntuシステムで異なるためである可能性があります。
macOSシステムでOSS SDK for Pythonを使用して複数のスレッドを起動し、サブスレッドのOSSリソースで操作を実行すると、TensorFlowがインポートされるとエラーが発生します。 TensorFlowがインポートされていない場合、エラーは発生しません。 さらに、複数のスレッドを起動しない場合、TensorFlowはエラーなしでインポートできます。
OSS SDK for Pythonを使用して複数のスレッドを起動すると、次のエラーが発生します。
objc[2483]: +[_NSPlaceholderDate initialize] は、fork() が呼び出されたときに別のスレッドで進行中であった可能性があります。
objc[2483]: +[_NSPlaceholderDate initialize] は、fork() が呼び出されたときに別のスレッドで進行中であった可能性があります。 fork() 子プロセスで安全に呼び出すことも無視することもできません。 代わりにクラッシュします。 objc_initializeAfterForkErrorにブレークポイントを設定してデバッグします。
解決策:
環境変数OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
を追加します。 環境変数の追加方法を次の図に示します。
詳細については、Workarounds For compatibilityをご参照ください。
再試行ポリシーを追加する方法?
OSS SDK for Pythonは、再試行メカニズムを提供しません。 悪いネットワーク条件では要求が失敗する可能性があります。 この場合、再試行ポリシーをコードに追加することを推奨します。 次のサンプルコードは、再試行ポリシーを追加する方法の例を示しています。
def test_get_object():
MAX_RETRIES = 3
retry_count = 0
while True:
試してみてください。
retry_count += 1
# オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: abc/efg/example.jpg
# ダウンロードしたオブジェクトを格納するフルパスを指定します。 例: /users/local/example.jpg
bucket.get_object_to_file("yourObjectName", "yourFileName")
break
except Exception:
if retry_count >= MAX_RETRIES:
レイズ
Cのcrcmod拡張機能を一部のオペレーティングシステムにインストールできない場合はどうすればよいですか?
Cのcrcmod拡張機能をインストールできないシステムでは、CRC-64を無効にできます。 CRC-64を無効にする方法の詳細については、「初期化」をご参照ください。
生成された署名付きURLがhttpsで始まるようにするにはどうすればよいですか?
生成された署名付きURLをhttpsで開始する場合は、OSS SDK for Python (https://oss-cn-hangzhou.aliyuncs.com
など) を初期化するときに、エンドポイントをhttpsで開始するように設定します。
複数のプロセスが同時に実行されている場合にバケットを使用するにはどうすればよいですか?
プロセスの初期化後にバケットを作成します。