AWS SDK для .NET
AWS SDK для .NET
Подготовка к работе
-
Назначьте сервисному аккаунту роли, которые нужны для вашего проекта, например storage.editor на бакет — для работы с конкретным бакетом, или на каталог — для работы со всеми бакетами в каталоге. Подробнее о ролях см. на странице Управление доступом с помощью Yandex Identity and Access Management.
Чтобы работать с объектами в зашифрованном бакете, у пользователя или сервисного аккаунта вместе с ролью
storage.configurer
должны быть следующие роли на ключ шифрования:kms.keys.encrypter
— для чтения ключа, шифрования и загрузки объектов;kms.keys.decrypter
— для чтения ключа, расшифровки и скачивания объектов;kms.keys.encrypterDecrypter
— включает разрешения, предоставляемые ролямиkms.keys.encrypter
иkms.keys.decrypter
.
Подробнее см. Сервисные роли Key Management Service.
-
Создайте статический ключ доступа.
В результате вы получите данные статического ключа доступа. Для аутентификации в Object Storage вам понадобятся:
key_id
— идентификатор статического ключа доступа;secret
— секретный ключ.
Сохраните
key_id
иsecret
, так как повторное получение значения ключа будет невозможно.
Примечание
Сервисный аккаунт может просматривать список бакетов только в том каталоге, в котором он был создан.
Сервисный аккаунт может выполнять действия с объектами в бакетах, которые созданы в каталогах, отличных от каталога сервисного аккаунта. Для этого назначьте сервисному аккаунту роли на нужный каталог или бакет в нем.
Установка
Для установки AWS SDK для .NET воспользуйтесь инструкцией
Настройка
-
Создайте директорию для хранения аутентификационных данных и перейдите в нее:
Для macOS и Linux:
mkdir ~/.aws/
Для Windows:
mkdir C:\Users\<имя_пользователя>\.aws\
-
В директории
.aws
создайте файлcredentials
и скопируйте в него аутентификационные данные, полученные ранее:[default] aws_access_key_id = <идентификатор_статического_ключа> aws_secret_access_key = <секретный_ключ>
-
Создайте файл
config
с параметрами региона по умолчанию и скопируйте в него следующую информацию:[default] region = ru-central1 endpoint_url = https://storage.yandexcloud.net
Примечание
Некоторые приложения, предназначенные для работы с Amazon S3, не позволяют указывать регион, поэтому Object Storage принимает также значение
us-east-1
.
Особенности
- AWS SDK для .NET некорректно обрабатывает конфигурации для жизненных циклов, которые не содержат в себе описания правил (ID). Добавьте описания ко всем правилам жизненного цикла.
- Для доступа к Object Storage, например при работе с классом
AmazonS3Config
, используйте адресs3.yandexcloud.net
.
Примеры кода
Чтобы подключиться к Object Storage, используйте код:
AmazonS3Config configsS3 = new AmazonS3Config {
ServiceURL = "https://s3.yandexcloud.net"
};
AmazonS3Client s3client = new AmazonS3Client(configsS3);
Пример программы с использованием .NET AWS SDK, которая при запуске создаст бакет, загрузит в него объект, удалит объект и удалит бакет:
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
namespace Example
{
public static class Program
{
public static async Task Main()
{
var testBucketName = "your-unique-bucket-name";
var uploadObjectKey = "object-key";
AmazonS3Client s3client = null;
try
{
// Настройка клиента S3
AmazonS3Config configsS3 = new AmazonS3Config {
ServiceURL = "https://s3.yandexcloud.net",
};
s3client = new AmazonS3Client(configsS3);
// Создание бакета
Console.WriteLine($"Creating bucket {testBucketName}");
try
{
await s3client.PutBucketAsync(new PutBucketRequest
{
BucketName = testBucketName,
UseClientRegion = true
});
Console.WriteLine($"Bucket '{testBucketName}' created successfully.");
}
catch (AmazonS3Exception ex) when (ex.StatusCode == System.Net.HttpStatusCode.Conflict)
{
Console.WriteLine($"Bucket '{testBucketName}' already exists. Continuing with existing bucket.");
}
// Загрузка объекта
Console.WriteLine($"Uploading object to bucket '{testBucketName}'.");
try
{
await s3client.PutObjectAsync(new Amazon.S3.Model.PutObjectRequest
{
BucketName = testBucketName,
Key = uploadObjectKey,
ContentBody = "Hello World!"
});
Console.WriteLine("Object was uploaded successfully.");
}
catch (AmazonS3Exception ex)
{
Console.WriteLine($"Error uploading object: {ex.Message}");
throw; // Re-throw to be caught by outer try-catch
}
// Удаление объекта
Console.WriteLine($"Deleting object with key '{uploadObjectKey}'");
try
{
await s3client.DeleteObjectAsync(new Amazon.S3.Model.DeleteObjectRequest
{
BucketName = testBucketName,
Key = uploadObjectKey
});
Console.WriteLine($"Object with key '{uploadObjectKey}' was deleted successfully");
}
catch (AmazonS3Exception ex)
{
Console.WriteLine($"Error deleting object: {ex.Message}");
throw; // Re-throw to be caught by outer try-catch
}
// Удаление бакета
Console.WriteLine($"Deleting bucket with name '{testBucketName}'");
try
{
await s3client.DeleteBucketAsync(new Amazon.S3.Model.DeleteBucketRequest
{
BucketName = testBucketName
});
Console.WriteLine($"Bucket '{testBucketName}' was deleted successfully");
}
catch (AmazonS3Exception ex)
{
Console.WriteLine($"Error deleting bucket: {ex.Message}");
// Если нужно принудительно удалить не пустой бакет, можно добавить код здесь
throw; // Re-throw to be caught by outer try-catch
}
}
catch (AmazonS3Exception ex)
{
Console.WriteLine($"Amazon S3 Error: {ex.ErrorCode}, Message: {ex.Message}");
Console.WriteLine($"Status code: {ex.StatusCode}, Request ID: {ex.RequestId}");
}
catch (AmazonServiceException ex)
{
Console.WriteLine($"Amazon Service Error: {ex.ErrorCode}, Message: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"General error: {ex.Message}");
Console.WriteLine(ex.StackTrace);
}
finally
{
// Правильная очистка ресурсов
s3client?.Dispose();
}
}
}
}