Apache Озон + AWS S3. Net API: PutObject создает корзину вместо ключа - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь создать ключи в 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 кода (ОК), и если я вызываю GetObjectAsyn c из API, я получаю HTML с метаданными в качестве результата (но на данный момент не могу прочитать содержимое файла)

Затем я go в Apache Озон и выполняю эти команды внутри оболочки озона:

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

Как вы можете видеть, объект создается как новый контейнер внутри тома Озона, используемого для S3, вместо того, чтобы быть созданным в качестве нового ключа ниже test корзины. Если я попытаюсь поставить ключи от AWS S3 Cli, он будет работать как положено

Что происходит?

К вашему сведению Я сделал тот же пример из Java API, и возникает та же проблема!

Спасибо

1 Ответ

3 голосов
/ 01 апреля 2020

Ozone s3-gateway по умолчанию использует адресацию в стиле пути , в то время как обновленные библиотеки SDK используют виртуальную размещенную адресацию. Самым быстрым решением было бы переключиться на стиль пути:

// AmazonS3Config config = new AmazonS3Config();
config.ForcePathStyle = true;

В качестве альтернативы, как упомянуто в документации, вы можете включить виртуальную схему размещения в озоне.

Обратите внимание, что стиль пути устарел в aws s3.

...