Apache Ozone + AWS S3 .Net API: PutObject создает корзину вместо ключа
Я пытаюсь создать ключи в apache OZone с помощью AWS S3 API для.NET.
Ключ, который я пытаюсь создать, должен находиться внутри сегмента под названием "test", который я создал с помощью AWS S3 CLI.
Мой код:
static async Task WriteFile()
{
AmazonS3Config config = new AmazonS3Config();
config.ServiceURL = "http://myApacheOzoneEndpoint:8744"; // This port is mapped from a docker container to (not the original endpoint port for Ozone)
AWSCredentials credentials = new BasicAWSCredentials("testuser/scm@EXAMPLE.COM", "c261b6ecabf7d37d5f9ded654b1c724adac9bd9f13e247a235e567e8296d2999"); // Credentials must be set but can be random since Ozone doesn't use authentication
AmazonS3Client client = new AmazonS3Client(credentials, config);
using (FileStream fs = File.OpenRead(@"C:\Users\me\path.to.file\image.jpg"))
{
string responseBody = "";
try
{
PutObjectRequest request = new PutObjectRequest
{
BucketName = "test",
Key = "deleteme.jpg",
InputStream = fs
};
PutObjectResponse response = await client.PutObjectAsync(request);
Console.WriteLine($"Result: {response.HttpStatusCode.ToString()}");
}
catch (AmazonS3Exception e)
{
Console.WriteLine("Error encountered ***. Message:'{0}' when writing an object", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
}
}
}
Этот код возвращает ошибку кода 200 (ОК), и если я вызываю GetObjectAsync из API, я получаю HTML с метаданными в качестве результата (но не могу прочитать содержимое файла на данный момент)
Затем я перехожу в Apache Ozone и выполняю эти команды в оболочке ozone:
bash-4.2$ ozone s3 path test
Volume name for S3Bucket is : s3c89e813c80ffcea9543004d57b2a1239
Ozone FileSystem Uri is : o3fs://test.s3c89e813c80ffcea9543004d57b2a1239
bash-4.2$ ozone sh bucket list /s3c89e813c80ffcea9543004d57b2a1239
[ {
"volumeName" : "s3c89e813c80ffcea9543004d57b2a1239",
"bucketName" : "test",
"createdOn" : "Wed, 01 Apr 2020 08:06:40 GMT",
"acls" : null,
"versioning" : "DISABLED",
"storageType" : "DISK",
"encryptionKeyName" : "N/A"
}, {
"volumeName" : "s3c89e813c80ffcea9543004d57b2a1239",
"bucketName" : "deleteme.jpg",
"createdOn" : "Tue, 31 Mar 2020 10:57:26 GMT",
"acls" : null,
"versioning" : "DISABLED",
"storageType" : "DISK",
"encryptionKeyName" : "N/A"
} ]
bash-4.2$ ozone sh key list /s3c89e813c80ffcea9543004d57b2a1239/test => This command returns only keys that have been put from AWS S3 CLI
Как видите, объект создается как новая корзина внутри тома Ozone, используемого для S3, вместо того, чтобы создаваться как новый ключ ниже. test
ведро. Если я попробую поставить ключи от AWS S3 Cli, все заработает как положено
Что случилось?
К вашему сведению, я сделал тот же пример из Java API, и возникает такая же проблема!
Благодарность
1 ответ
Ozone s3-gateway по умолчанию использует адресацию в стиле пути, в то время как обновленные библиотеки SDK используют виртуальную адресацию. Самым быстрым решением будет переключиться на стиль пути:
// AmazonS3Config config = new AmazonS3Config();
config.ForcePathStyle = true;
В качестве альтернативы, как упоминалось в документации, вы можете включить схему с виртуальным размещением в ozone.
Обратите внимание, что стиль пути будет устаревшим в awss3.