2016-07-28 3 views
2

При работе с SDK для SDS C++ я столкнулся с проблемой, когда попытка выполнить PutObjectRequest жалуется на то, что «не может подключиться к конечной точке» при загрузке более ~ 400 КБ.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); 

Пока мои данные меньше, чем ~ 400KB он получает загружены в файл на S3, но помимо этого она не может подключиться к конечной точке. Я должен иметь возможность загружать до 5 ГБ в один PutObjectRequest.

Любые мысли?

Edit:

В ответ на @ 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. Это происходит через Wi-Fi? Если это так, вы можете попробовать это через Ethernet? –

ответ

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

Это известная проблема для завитки, так как я ошибочно предположил, что параметр таймаута был обычным тайм-аутом чтения сокетов, чего нет. Я работаю над исправлением нашего кода libcurl, чтобы заставить его вести себя как обычный тайм-аут чтения, и это больше не должно быть проблемой. –

0

Tweak ваш конфигурационный файл для below.and увидеть это будет работать.

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

Тайм-аут соединения - это неправильный параметр в любом случае, если он отключен во время отправки, это фактический тайм-аут получения. –

Смежные вопросы