Чтение и запись в 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/