このトピックでは、Object Storage Service (OSS) Python SDK の一般的な問題とソリューションについて説明します。
OSS Python SDK を使用したマルチパートアップロードの失敗
解決策:
オブジェクトを OSS に直接アップロードしているか、Content Delivery Network (CDN) などのプロキシ経由でアップロードしているかを確認します。CDN 経由で OSS にアップロードする場合は、OSS で
Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headersなどのクロスドメイン HTTP ヘッダーを設定し、ETag を公開する必要があります。詳細については、「PutBucketCors」をご参照ください。ネットワークタイムアウトが原因でアップロードが失敗した場合は、標準のアップロードの代わりに再開可能なアップロードを使用します。再開可能なアップロードは、並列アップロードとカスタムパートサイズをサポートしています。例外がキャッチされた場合は、SDK からの例外メッセージを確認し、分析します。
失敗したアップロードによって生成された断片化されたパーツをクリーンアップし、アップロードをリトライします。
上記の方法で問題が解決しない場合は、Alibaba Cloud に次の情報を提供してください:
SDK から返された例外の requestID。
クライアントに tcpdump をデプロイし、アップロードコードを再度実行して、キャプチャしたパケットを保存します。
tcpdump -i <network_interface_name> -s0 host <oss_domain_name> -w failed.pcap
ossutil が同じマシン上の Python SDK よりもアップロードとダウンロードがはるかに高速である問題
原因
ossutil ツールは Go SDK に基づいて開発されており、同時アップロードのパフォーマンスが向上しています。Python SDK のアップロードとダウンロードが ossutil よりもはるかに遅い場合、通常は crcmod が正しくインストールされていないことが原因です。
解決策
crcmod のインストール方法の詳細については、「Python SDK のインストール」をご参照ください。
CentOS では動作するマルチパートアップロードが Ubuntu では 403 エラーを返す問題
クライアントに tcpdump をデプロイしてパケットをキャプチャできます。次に、TCP メッセージをチェックして、不正なヘッダー情報が原因でクライアントによって計算された署名とサーバー側の署名との間に不一致が生じているかどうかを判断します。
POST /ttsservice%2Fpasswd?uploadId=D468E486D1D94D90A1AB8885A4E32AE0 HTTP/1.1
Host: rokid.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Accept: text/html
Content-Length: 137
date: Sat, 29 Dec 2018 07:32:34 GMT
authorization: OSS LTAI****************:r2kp*****************
Content-Type: application/x-www-form-urlencoded
User-Agent: aliyun-sdk-python/2.6.0(Linux/4.4.0-31-generic/x86_64;3.4.3)
<CompleteMultipartUpload><Part><PartNumber>1</PartNumber><ETag>"3195544E19D99658706D5****"</ETag></Part></CompleteMultipartUpload>HTTP/1.1 403 Forbidden
Server: AliyunOSS
Date: Sat, 29 Dec 2018 07:33:43 GMT
Content-Type: application/xml
Content-Length: 1122
Connection: keep-alive
x-oss-request-id: 5C2723573183****
x-oss-server-time: 0
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<RequestId> 5C2723573183A12D </RequestId>
<HostId>rokid.oss-cn-hangzhou.aliyuncs.com</HostId>
<OSSAccessKeyId>LTAI****************</OSSAccessKeyId>
<SignatureProvided>r2kp*****************</SignatureProvided>
<StringToSign>POST
application/x-www-form-urlencoded
Sat, 29 Dec 2018 07:32:34 GMT
/rokid/ttsservice/passwd?uploadId=D468E486D1D94D90A1AB8885A4E3****</StringToSign>
<StringToSignBytes>50 4F 53 54 0A 0A 61 70 70 6C 69 63 61 74 69 6F 6E 2F 78 2D 77 77 77 2D 66 6F 72 6D 2D 75 72 6C 65 6E 63 6F 64 65 64 0A 53 61 74 2C 20 32 39 20 44 65 63 20 32 30 31 38 20 30 37 3A 33 32 3A 33 34 20 47 4D 54 0A 2F 72 6F 6B 69 64 2D 6F 70 73 2D 6D 6F 64 65 6C 2F 74 74 73 73 65 72 76 69 63 65 2F 70 61 73 73 77 64 3F 75 70 6C 6F 61 64 49 64 3D 44 34 36 38 45 34 38 36 44 31 44 39 34 44 39 30 41 31 41 42 38 38 38 35 41 34 45 33 32 41 45 30 </StringToSignBytes>
</Error>サーバーが受信した署名がクライアントによって計算された署名と一致しない場合、リクエストの内容が変更された可能性があります。HTTPS を使用してオブジェクトをアップロードしてください。
キャプチャしたパケットからリクエストヘッダー情報を次のスクリプトに追加し、その結果を SDK によって生成された署名と比較します。
import base64
import hmac
import sha
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())
print(Signature)スクリプトからの署名がキャプチャされたデータからの署名と一致する場合、SDK の計算は正しいです。一致しない場合、Ubuntu プラットフォーム上の SDK とのコンパイルの互換性の問題により、MD5 ハッシュが異なる可能性があります。
macOS のマルチスレッド Python アプリケーションで TensorFlow をインポートする際のエラー
Python がマルチスレッド環境で実行されると、次のエラーが報告されます:
objc[2483]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[2483]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.解決策:
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES 環境変数を追加します。次の図をご参照ください:
詳細については、「Objective-C and fork() in macOS 10.13」をご参照ください。
リトライポリシーの追加方法
Python SDK には、組み込みのリトライメカニズムがありません。ネットワークの状態が悪いと、リクエストが失敗することがあります。この場合、次の例を参照して、コードにリトライポリシーを追加できます。
def test_get_object():
MAX_RETRIES = 3
retry_count = 0
while True:
try:
retry_count += 1
# yourObjectName は、バケット名を除いた OSS ファイルの完全なパスを指定します。例:abc/efg/example.jpg。
# yourFileName は、オブジェクトをダウンロードするローカルファイルの完全なパスを指定します。例:/users/local/example.jpg。
bucket.get_object_to_file("yourObjectName", "yourFileName")
break
except Exception:
if retry_count >= MAX_RETRIES:
raise一部のオペレーティングシステムで crcmod の C 拡張モードのインストールに失敗した場合の対処法
ご利用のオペレーティングシステムに crcmod の C 拡張モードを正常にインストールできない場合は、64 ビット巡回冗長検査 (CRC-64) を無効にすることができます。詳細については、「CRC-64 データ検証の無効化」をご参照ください。
生成された署名付き URL が https で始まるようにする方法
生成された署名付き URL が https で始まるようにするには、SDK を初期化する際に、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com のように https で始まるアドレスに設定します。
マルチプロセス環境でのバケットインスタンスの使用方法
バケットインスタンスは、マルチプロセスの初期化が完了した後に作成する必要があります。