CopyObjectRequest wrong host URL
FaZeRs opened this issue · 4 comments
Describe the bug
When I try to copy object from one folder to another in same bucket I get an error Invalid response status from request (aws-c-s3: AWS_ERROR_S3_INVALID_RESPONSE_STATUS)
. This happens only for CopyObject
, for HeadObject
, ListObjects
, GetObject
, PutObject
everything is correct
Expected Behavior
Expected host
URL should be s3.giraffe360-mimosa.com
and file should be copied
from
/cold-data/projects/db9768d14f7c4055aa7518e42b633888/floorplan/roomsketcher/floorplan-ALL-final_1_0.svg
to
/cold-data/projects/db9768d14f7c4055aa7518e42b633888/floorplan/roomsketcher/final_backups/floorplan-ALL-final_1_0_2024-01-24_13-03-01.svg
Current Behavior
Based on logs I see it has wrong host
URL
[INFO] 2024-01-24 11:03:01.675 AuthSigning [140735609304640] (id=0x7fff88004380) Signing successfully built canonical request for algorithm SigV4, with contents
HEAD
/projects/db9768d14f7c4055aa7518e42b633888/floorplan/roomsketcher/floorplan-ALL-final_1_0.svg
host:cold-data.giraffe360-mimosa.com
x-amz-content-sha256:UNSIGNED-PAYLOAD
x-amz-date:20240124T110301Z
host;x-amz-content-sha256;x-amz-date
UNSIGNED-PAYLOAD
For other requests it is correct
[INFO] 2024-01-24 11:03:01.541 AuthSigning [140735592519232] (id=0x7fff840032d0) Signing successfully built canonical request for algorithm SigV4, with contents
PUT
/cold-data/projects/db9768d14f7c4055aa7518e42b633888/floorplan/roomsketcher/geometry.json
content-length:4073
content-md5:rg4HTU7lw0cuZltmQKY+2g==
content-type:binary/octet-stream
host:s3.giraffe360-mimosa.com
x-amz-content-sha256:UNSIGNED-PAYLOAD
x-amz-date:20240124T110301Z
content-length;content-md5;content-type;host;x-amz-content-sha256;x-amz-date
UNSIGNED-PAYLOAD
cold-data
is bucket name.
Reproduction Steps
Aws::Auth::AWSCredentials credentials(access_key, secret_key, session_token);
Aws::S3Crt::ClientConfiguration config;
config.endpointOverride = host_;
config.useVirtualAddressing = false;
config.verifySSL = false;
config.enableEndpointDiscovery = false;
config.enableHostPrefixInjection = false;
config.region = Aws::Region::US_EAST_1;
config.scheme = Aws::Http::Scheme::HTTPS;
config.disableMultiRegionAccessPoints = true;
config.disableS3ExpressAuth = true;
config.payloadSigningPolicy = Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never;
config.useUSEast1RegionalEndPointOption = Aws::S3Crt::US_EAST_1_REGIONAL_ENDPOINT_OPTION::LEGACY;
config.enableEndpointDiscovery = false;
config.enableHostPrefixInjection = false;
config.version = Aws::Http::Version::HTTP_VERSION_3;
std::unique_ptr<Aws::S3Crt::S3CrtClient> client = std::make_unique<Aws::S3Crt::S3CrtClient>(credentials, config);
Aws::S3Crt::Model::CopyObjectRequest request;
request.SetBucket(bucket);
request.SetKey(dst_path);
request.SetCopySource(bucket + "/" + src_path);
auto outcome = client->CopyObject(request);
if (!outcome.IsSuccess()) {
std::cerr << "Failed to copy file " << src_path << " to " << dst_path
<< " in bucket: " " << bucket
<< " with error: " << outcome.GetError().GetMessage()
<< " and error code: " << outcome.GetError().GetExceptionName();
}
Possible Solution
No response
Additional Information/Context
No response
AWS CPP SDK version used
1.11.249
Compiler and Version used
gcc 13.1.0
Operating System and version
Ubuntu 22.04.3 LTS
I can repro this with the sample code you gave. Looking into what might be causing this.
This is a problem with aws-c-s3. Opening an issue on that repo to be tracked there: awslabs/aws-c-s3#424. Leaving this issue open for now, I will make sure to update here when that one gets closed
The CRT client has a very limited support for copy object. One of the limitation is it only supports virtual host addressing style, here
In your case, you override the host to s3.giraffe360-mimosa.com
, which is not the virtual hosting for S3 bucket. So, it's not currently supported by CRT client and currently we don't have any plan to support it. You can create a feature request.
I'd recommend to use the regular C++ S3 client for copy object instead of CRT, since there won't be much benefits to use CRT to do copy object (No throughput improvement), since the work mostly done in the server side.
This issue is now closed. Comments on closed issues are hard for our team to see.
If you need more assistance, please open a new issue that references this one.