【发布时间】:2017-10-18 15:55:33
【问题描述】:
我在存储桶上启用了“传输加速”。但我没有看到我的 C++ 应用程序的上传速度有任何改进。我已等待 AWS 文档中提到的 20 多分钟。
SDK 是否默认支持“传输加速”或者是否有运行时标志或编译器标志?我没有在 SDK 代码中发现任何内容。
谢谢
【问题讨论】:
标签: c++ amazon-web-services amazon-s3 aws-sdk-cpp
我在存储桶上启用了“传输加速”。但我没有看到我的 C++ 应用程序的上传速度有任何改进。我已等待 AWS 文档中提到的 20 多分钟。
SDK 是否默认支持“传输加速”或者是否有运行时标志或编译器标志?我没有在 SDK 代码中发现任何内容。
谢谢
【问题讨论】:
标签: c++ amazon-web-services amazon-s3 aws-sdk-cpp
目前,没有一个配置选项可以简单地打开传输加速。但是,您可以在客户端配置中使用端点覆盖来设置加速端点。
【讨论】:
我做了什么来启用(工作)传输加速:
在 AWS 面板“传输加速”的存储桶配置中设置为启用。
向我在 C++ 应用程序中使用的 IAM 用户添加权限 s3::PutAccelerateConfiguration
将以下代码添加到 s3 传输配置(bucket_ 是您的存储桶名称,最终 URL 必须与 AWS 面板“传输加速”中显示的一致):
Aws::Client::ClientConfiguration config;
/* other configuration options */
config.endpointOverride = bucket_ + ".s3-accelerate.amazonaws.com";
auto s3Client = Aws::MakeShared<Aws::S3::S3Client>("Uploader",
Aws::Auth::AWSCredentials(id_, key_), config);
Aws::S3::Model::PutBucketAccelerateConfigurationRequest bucket_accel;
bucket_accel.SetAccelerateConfiguration(
Aws::S3::Model::AccelerateConfiguration().WithStatus(
Aws::S3::Model::BucketAccelerateStatus::Enabled));
bucket_accel.SetBucket(bucket_);
s3Client->PutBucketAccelerateConfiguration(bucket_accel);
您可以在 AWS sdk 的详细日志中检查您的代码正在使用加速入口点,您还可以检查在传输开始之前是否调用了 /?accelerate (@987654322 @)
【讨论】:
什么对我有用:
在 AWS 控制台中启用 S3 传输加速
配置客户端时,只使用加速端点服务:
clientConfig->endpointOverride = "s3-accelerate.amazonaws.com";
@gabry - 你的解决方案非常接近,我认为它对我不起作用的原因可能是由于 SDK 更改,因为最初发布的更改相对较小。或者可能是因为我正在为传输管理器使用的请求构建放置对象模板。
查看日志(调试级别),SDK 会自动将 transferManager::UploadFile() 中使用的存储桶与覆盖的端点连接起来。我收到未解决的主机错误,因为请求的主机看起来像:
[DEBUG] host: myBucket.myBucket.s3-accelerate.amazonaws.com
这样我仍然可以保持相同的 S3_BUCKET 宏名称,同时仅在实例化新的上传配置时选择性地调用它。
例如
<<
...
auto putTemplate = new Aws::S3::Model::PutObjectRequest();
putTemplate->SetStorageClass(STORAGE_CLASS);
transferConfig->putObjectTemplate = *putTemplate;
auto multiTemplate = new Aws::S3::Model::CreateMultipartUploadRequest();
multiTemplate->SetStorageClass(STORAGE_CLASS);
transferConfig->createMultipartUploadTemplate = *multiTemplate;
transferMgr = Aws::Transfer::TransferManager::Create(*transferConfig);
auto transferHandle = transferMgr->UploadFile(localFile, S3_BUCKET, s3File);
transferMgr = Aws::Transfer::TransferManager::Create(*transferConfig);
...
>>
【讨论】: