Чтение и запись в Amazon S3 с помощью ASP.NET Core

Введение

Amazon S3, или Simple Storage Service, — это центральное хранилище в облаке Amazon Web Services (AWS). Он позволяет разработчикам хранить и извлекать файлы как объекты для облачных приложений.

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

В этом контексте мы исследуем использование S3 для обработки файлов с помощью AWS SDK для ASP.NET Core.

Настроив правильные права доступа с помощью политик IAM, мы можем обеспечить безопасное использование корзины S3. Наша цель — обеспечить удобную загрузку и извлечение файлов, повышая удобство работы пользователей.

Хранилище S3, организованное в сегменты, управляется политиками IAM, которые контролируют доступ к ресурсам.

Для чтения из хранилища AWS S3 или записи в него мы выполняем следующие 3 шага:

Установка AWSSDK.S3

Начнем с добавления необходимого пакета AWS SDK, позволяющего использовать необходимые библиотеки для взаимодействия с S3. Пакет закладывает основу для наших последующих действий.

dotnet add package AWSSDK.S3 --version 3.5.5.2

Реализация чтения и записи S3

Создав S3Client и предоставив сведения о регионе, мы устанавливаем соединение.

Метод AddItem считывает отправленный файл, создает PutObjectRequest, содержащий метаданные, и использует PutObjectAsync для сохранения файла в корзине.

Следующий код показывает, как мы можем записать файл в Amazon S3:

public async Task<string> AddItem(IFormFile file, string readerName)
{
    string fileName = file.FileName;
    string objectKey = $"{FOLDER_NAME}/{readerName}/{fileName}";
    
    using (Stream fileToUpload = file.OpenReadStream())
    {
        var putObjectRequest = new PutObjectRequest(); 
        putObjectRequest.BucketName = BUCKET_NAME; 
        putObjectRequest.Key = objectKey; 
        putObjectRequest.InputStream = fileToUpload; 
        putObjectRequest.ContentType = file.ContentType; 

        var response = await s3Client.PutObjectAsync(putObjectRequest); 
        return GeneratePreSignedURL(objectKey);
    }
}

Для повышения безопасности мы генерируем заранее назначенный URL-адрес для ограниченного по времени доступа.

public string GeneratePreSignedURL(string objectKey)
{
    var request = new GetPreSignedUrlRequest
    {
        BucketName = BUCKET_NAME,
        Key = objectKey,
        Verb = HttpVerb.GET,
        Expires = DateTime.UtcNow.AddHours(DURATION)
    };

    string url = s3Client.GetPreSignedURL(request);
    return url;
}

В качестве альтернативы мы также можем прочитать отдельный объект из корзины S3 и вернуть байты. Следующий код показывает, как –

public async Task<byte[]> GetItem(string keyName) 
{
    GetObjectResponse response = await client.GetObjectAsync(BUCKET_NAME, keyName);
    MemoryStream memoryStream = new MemoryStream();

    using Stream responseStream = response.ResponseStream
    responseStream.CopyTo(memoryStream);

    return memoryStream.ToArray();
}

Заключение

Таким образом, мы исследовали и внедрили решение для обработки файлов с использованием Amazon S3 и библиотеки AWSSDK.S3 в ASP.NET Core. Такой подход упрощает загрузку и извлечение файлов для облачных приложений.

Хотя наша реализация хорошо работает для централизованного хранения файлов, сценарии, ориентированные на пользователя, требуют индивидуальной корректировки политик IAM.

Эта адаптация соответствует модели доступа к ресурсам на основе ролей, обеспечивая персонализированные пути доступа в корзине S3.

Вы можете прочитать полную статью, где я подробно объяснил все это здесь — https://referbruv.com/blog/implementing-a-simple-file-upload-to-amazon-s3-using-aspnet-core/