2016-07-28 20 views
2

AWS C++ SDKを使用しているとき、PutObjectRequestを実行しようとすると〜400KBを超えてアップロードされたときに「エンドポイントに接続できません」というメッセージが表示されました。AWS C++ S3 SDK PutObjectRequestがエンドポイントに接続できません

Aws::Client::ClientConfiguration clientConfig; 
clientConfig.scheme = Aws::Http::Scheme::HTTPS; 
clientConfig.region = Aws::Region::US_EAST_1; 

Aws::S3::S3Client s3Client(clientConfig); 

Aws::S3::Model::PutObjectRequest putObjectRequest; 
putObjectRequest.SetBucket("mybucket"); 
putObjectRequest.SetKey("mykey"); 

typedef boost::iostreams::basic_array_source<char> Device; 
boost::iostreams::stream_buffer<Device> stmbuf(compressedData, dataSize); 
std::iostream *stm = new std::iostream(&stmbuf); 

putObjectRequest.SetBody(std::shared_ptr<Aws::IOStream>(stm)); 
putObjectRequest.SetContentLength(dataSize); 

Aws::S3::Model::PutObjectOutcome outcome = s3Client.PutObject(putObjectRequest); 

限り、私のデータは〜400キロバイト未満であるとして、それはS3上のファイルにアップロードされますが、それを超えて、エンドポイントに接続することができません。 1つのPutObjectRequestで最大5GBをアップロードできるはずです。

どのような考えですか?

編集:@ JonathanHensonさんのコメントへの対応

は、AWSのログを繰り返し、このタイムアウトエラーを示しています

[DEBUG] 2016-08-04 13:42:03 AWSClient [0x700000081000] Request Successfully signed 
[TRACE] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] Making request to https://s3.amazonaws.com/mybucket/myfile 
[TRACE] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] Including headers: 
[TRACE] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] content-length: 3151261 
[TRACE] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] content-type: binary/octet-stream 
[TRACE] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] host: s3.amazonaws.com 
[TRACE] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] user-agent: aws-sdk-cpp/0.13.9 Darwin/15.6.0 x86_64 
[DEBUG] 2016-08-04 13:42:03 CurlHandleContainer [0x700000081000] Attempting to acquire curl connection. 
[DEBUG] 2016-08-04 13:42:03 CurlHandleContainer [0x700000081000] Returning connection handle 0x10b09cc00 
[DEBUG] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] Obtained connection handle 0x10b09cc00 
[TRACE] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] HTTP/1.1 100 Continue 

[TRACE] 2016-08-04 13:42:03 CurlHttpClient [0x700000081000] 

[ERROR] 2016-08-04 13:42:06 CurlHttpClient [0x700000081000] Curl returned error code 28 
[DEBUG] 2016-08-04 13:42:06 CurlHandleContainer [0x700000081000] Releasing curl handle 0x10b09cc00 
[DEBUG] 2016-08-04 13:42:06 CurlHandleContainer [0x700000081000] Notifying waiting threads. 
[DEBUG] 2016-08-04 13:42:06 AWSClient [0x700000081000] Request returned error. Attempting to generate appropriate error codes from response 
[WARN] 2016-08-04 13:42:06 AWSClient [0x700000081000] Request failed, now waiting 12800 ms before attempting again. 
[DEBUG] 2016-08-04 13:42:19 InstanceProfileCredentialsProvider [0x700000081000] Checking if latest credential pull has expired. 
+0

私はログファイルを送ってもらえますか?私はこれを調べてうれしいです。 –

+0

コメントありがとうございました@JonathanHenson。私は、ログファイルにエラーを表示するために質問を編集しました。私は電子メールであなたと連絡を取ることができますか? –

+0

Appleのデバイスでこれをやっているのが分かります。これは無線LAN経由ですか?もしそうなら、これをイーサネット経由で試すことができますか? –

答えて

1

結局のところ、この問題を解決したのは要求のタイムアウトを設定したことです。要求のタイムアウトは、転送全体が完了するのに十分な時間が必要です。低速のインターネット接続で大容量のファイルを転送する場合は、要求のタイムアウトがこれらのファイルを転送するのに十分な長さであることを確認してください。

Aws::Client::ClientConfiguration clientConfig; 
clientConfig.scheme = Aws::Http::Scheme::HTTPS; 
clientConfig.region = Aws::Region::US_EAST_1; 
clientConfig.connectTimeoutMs = 30000; 
clientConfig.requestTimoutMs = 600000; 
+0

これはcurlの既知の問題です。タイムアウトオプションは通常のソケット読み取りタイムアウトであると誤って想定していました。私はlibcurlコードを修正して通常の読み取りタイムアウトのように動作させています。これはもはや問題ではありません。 –

0

はそれが動作する参照below.Andにconfigファイルを微調整します。

Aws::Client::ClientConfiguration clientConfig; 
clientConfig.scheme = Aws::Http::Scheme::HTTPS; 
clientConfig.region = Aws::Region::US_EAST_1; 
clientConfig.connectTimeoutMs = 30000; 

Aws::S3::S3Client s3Client(clientConfig); 

Aws::S3::Model::PutObjectRequest putObjectRequest; 
putObjectRequest.SetBucket("mybucket"); 
putObjectRequest.SetKey("mykey"); 

typedef boost::iostreams::basic_array_source<char> Device; 
boost::iostreams::stream_buffer<Device> stmbuf(compressedData, dataSize); 
std::iostream *stm = new std::iostream(&stmbuf); 

putObjectRequest.SetBody(std::shared_ptr<Aws::IOStream>(stm)); 
putObjectRequest.SetContentLength(dataSize); 

Aws::S3::Model::PutObjectOutcome outcome = s3Client.PutObject(putObjectRequest); 
+0

残念ながら、タイムアウトを設定してもエンドポイントエラーに接続できません 'clientConfig.connectTimeoutMs = 30000;' –

+0

接続のタイムアウトが間違った設定です。送信中にタイムアウトした場合は、実際の受信タイムアウトです。 –

関連する問題