これは、2012 年 4 月 6 日の garnaat の回答に対するフォローアップです。
資格情報がある署名付き URL サーバー側を生成し、クライアントがコンテンツを直接アップロードできるようにそれをクライアントに渡します。任意のサイズのファイルをアップロードできるほどクライアントを信頼していますが、セキュリティ トークンを与えるほどではありません。クライアントがリクエストの一部としてコンテンツの大きさをサーバーに伝えないようにしたかったのです。したがって、私のフォローアップの答え。
ヘッダーでコンテンツの長さを指定したり、force_http=True を指定したりしなくても、PUT メソッドの署名付き URL を取得できました。
Boto 2.31.1 の使用: garnaat の回答のように:
>>> import boto
>>> c =boto.connect_s3()
次に、代わりに使用しました:
>>> temp_url = c.generate_url(seconds_available, 'PUT', bucket_name, s3_key)
これにより、次の形式の URL が生成されました。
https://s3_location/bucket_name/s3_key?Signature=Ew407JMktSIcFln%2FZe00VroCmTU%3D&Expires=1405647669&AWSAccessKeyId=kM__pEQo2AEVd_Juz4Qq
その後、curl を使用してファイルを投稿できました。
>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')
私は通常、 Python リクエストを使用してテストとデバッグを作成するため、これを理解するのに非常に苦労しました。ただし、リクエストを使用してこれらのboto生成の署名付きURLの1つにファイルを配置するために使用しようとすると、認証に失敗します。これを完全にデバッグしたわけではありませんが、curl が生成するものと比較して、リクエストがいくつかのヘッダーを追加しているためだと思われます。
このフォローアップの回答が、私が経験したデバッグの苦痛を他の誰かに惜しまないことを願っています。