Как начать работать с AWS SDK для .NET в Yandex Cloud Notification Service
Примечание
Сервис находится на стадии Preview.
Чтобы начать работу с AWS SDK для .NET:
- Подготовьте облако к работе.
- Получите статический ключ доступа.
- Настройте AWS SDK.
- Создайте канал уведомлений.
- Получите список каналов.
- Создайте эндпоинт.
- Отправьте уведомление.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Получите статический ключ доступа
Для аутентификации в Cloud Notification Service используется статический ключ доступа. Этот ключ выпускается на сервисный аккаунт, и все действия выполняются от имени этого сервисного аккаунта.
Чтобы получить статический ключ доступа:
-
Создайте сервисный аккаунт.
-
Для сервисного аккаунта создайте статический ключ доступа.
Сохраните идентификатор и секретный ключ.
Настройте AWS SDK
Пререквизиты и инструкция по установке AWS SDK для .NET также описаны в документации AWS
Инструкция ниже приведена для версии .NET 8.
-
Установите
.NET Core SDK. -
Инициализируйте проект в выбранной директории:
dotnet new console --name example-app
-
Установите пакет AWS SDK for .NET для SNS:
cd example-app/ dotnet add package AWSSDK.SimpleNotificationService
-
Создайте клиент. Замените содержимое файла
Program.cs
следующим кодом:using Amazon.Runtime; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; public static class ExampleSNS { static async Task Main(string[] args) { var endpoint = "https://notifications.yandexcloud.net/"; var credentials = new BasicAWSCredentials( "<идентификатор_статического_ключа>", "<секретный_ключ>" ); var snsClient = new AmazonSimpleNotificationServiceClient( credentials, new AmazonSimpleNotificationServiceConfig { ServiceURL = endpoint, AuthenticationRegion = "ru-central1" } ); } }
Где
credentials
содержит идентификатор статического ключа и секретный ключ. -
Соберите и запустите проект:
dotnet build dotnet run
Создайте канал уведомлений
try
{
var request = new CreatePlatformApplicationRequest
{
Name = "<имя_канала>",
Platform = "<тип_платформы>",
Attributes = new Dictionary<string, string>
{
{ "<тип_аутентификации>", "<ключ>" }
}
};
var response = await snsClient.CreatePlatformApplicationAsync(request);
Console.WriteLine("Platform application ARN: " + response.PlatformApplicationArn);
}
catch (Exception ex)
{
Console.WriteLine("Error creating platform application: " + ex.Message);
}
Где:
-
Name
— имя канала уведомлений, задается пользователем. Должно быть уникальным в облаке. Может содержать строчные и заглавные буквы латинского алфавита, цифры, подчеркивания, дефисы и точки. Допустимая длина — от 1 до 256 символов. Рекомендуется для каналов APNs указывать в имени идентификатор приложения (Bundle ID), для FCM и HMS — полное название пакета приложения (Package name). -
Platform
— тип мобильной платформы:APNS
иAPNS_SANDBOX
— Apple Push Notification service (APNs). Для тестирования приложения используйтеAPNS_SANDBOX
.GCM
— Firebase Cloud Messaging (FCM).HMS
— Huawei Mobile Services (HMS).
-
Attributes
— параметры аутентификации на мобильной платформе в форматеключ=значение
. Значения зависят от типа платформы:-
APNs:
-
Аутентификация с токеном:
PlatformPrincipal
— путь к файлу с ключом подписи токена, полученный в Apple.PlatformCredential
— идентификатор ключа подписи (Key ID).ApplePlatformTeamID
— идентификатор разработчика (Team ID).ApplePlatformBundleID
— идентификатор приложения (Bundle ID).
-
Аутентификация с сертификатом:
-
PlatformPrincipal
— SSL-сертификат в формате.pem
. -
PlatformCredential
— закрытый ключ сертификата в формате.pem
.Чтобы сохранить сертификат и закрытый ключ в отдельных файлах формата
.pem
, вы можете воспользоваться утилитой openssl в Linux:openssl pkcs12 -in Certificates.p12 -nokeys -nodes -out certificate.pem openssl pkcs12 -in Certificates.p12 -nocerts -nodes -out privatekey.pem
-
Аутентификация с токеном — более современный и безопасный метод.
-
-
FCM:
PlatformCredential
— ключ сервисного аккаунта Google Cloud в формате JSON для аутентификации с помощью HTTP v1 API или API-ключ (server key) для аутентификации с помощью Legacy API.Используйте HTTP v1 API, так как с июля 2024 года FCM legacy API не поддерживается
. -
HMS:
PlatformPrincipal
— идентификатор ключа.PlatformCredential
— API-ключ.
-
Получите список каналов уведомлений
var response = await snsClient.ListPlatformApplicationsAsync(new ListPlatformApplicationsRequest());
response.PlatformApplications.ForEach(app =>
Console.WriteLine($"Platform Application ARN: {app.PlatformApplicationArn}\n")
);
В результате будет выведен список каналов уведомлений, размещенных в том же каталоге, в котором находится сервисный аккаунт.
Создайте эндпоинт
try
{
var response = await snsClient.CreatePlatformEndpointAsync(new CreatePlatformEndpointRequest
{
PlatformApplicationArn = "<ARN_канала_уведомлений>",
Token = "<Push-токен>"
});
Console.WriteLine($"Endpoint ARN: {response.EndpointArn}");
}
catch (Exception ex)
{
Console.WriteLine($"Error creating platform endpoint: {ex.Message}");
}
Где:
PlatformApplicationArn
— идентификатор (ARN) канала уведомлений.Token
— уникальный Push-токен приложения на устройстве пользователя.
Отправьте уведомление
Явные уведомления (Bright Push)
try
{
var targetArn = "<ARN_ендпоинта>";
var message = @"{
""default"": ""<текст_уведомления>"",
""APNS"": ""{\""aps\"": {\""alert\"": \""<текст_уведомления>\""}}""
}";
var messageStructure = "json";
var request = new PublishRequest
{
TargetArn = targetArn,
Message = message,
MessageStructure = messageStructure
};
var response = await snsClient.PublishAsync(request);
Console.WriteLine("Message ID: " + response.MessageId);
}
catch (Exception ex)
{
Console.WriteLine("Error publishing message: " + ex.Message);
}
try
{
var targetArn = "<ARN_эндпоинта>";
var message = @"{
""default"": ""<текст_уведомления>"",
""GCM"": ""{\""notification\"": {\""body\"": \""<текст_уведомления>\""}}""}";
var messageStructure = "json";
var request = new PublishRequest
{
TargetArn = targetArn,
Message = message,
MessageStructure = messageStructure
};
var response = await snsClient.PublishAsync(request);
Console.WriteLine("Message ID: " + response.MessageId);
}
catch (Exception ex)
{
Console.WriteLine("Error publishing message: " + ex.Message);
}
Где:
TargetArn
— идентификатор (ARN) мобильного эндпоинта.Message
— сообщение.MessageStructure
— формат сообщения.
Тихие уведомления (Silent Push)
try
{
var targetArn = "<ARN_ендпоинта>";
var message = @"{
""default"": ""<текст_уведомления>"",
""APNS"": ""{\""key\"": \""value\""}""
}";
var messageStructure = "json";
var request = new PublishRequest
{
TargetArn = targetArn,
Message = message,
MessageStructure = messageStructure
};
var response = await snsClient.PublishAsync(request);
Console.WriteLine("Message ID: " + response.MessageId);
}
catch (Exception ex)
{
Console.WriteLine("Error publishing message: " + ex.Message);
}
try
{
var targetArn = "<ARN_эндпоинта>";
var message = @"{
""default"": ""<текст_уведомления>"",
""GCM"": ""{\""data\"": {\""key\"": \""value\""}}""}";
var messageStructure = "json";
var request = new PublishRequest
{
TargetArn = targetArn,
Message = message,
MessageStructure = messageStructure
};
var response = await snsClient.PublishAsync(request);
Console.WriteLine("Message ID: " + response.MessageId);
}
catch (Exception ex)
{
Console.WriteLine("Error publishing message: " + ex.Message);
}
Где:
TargetArn
— идентификатор (ARN) мобильного эндпоинта.Message
— сообщение.MessageStructure
— формат сообщения.
SMS-сообщения
try
{
var phoneNumber = "<номер_телефона>";
var message = "<текст_уведомления>";
var request = new PublishRequest
{
PhoneNumber = phoneNumber,
Message = message,
MessageAttributes = new Dictionary<string, MessageAttributeValue>
{
{
"AWS.SNS.SMS.SenderID",
new MessageAttributeValue
{
DataType = "String",
StringValue = "<текстовое_имя_отправителя>"
}
}
}
};
var response = await snsClient.PublishAsync(request);
Console.WriteLine("Message ID: " + response.MessageId);
}
catch (Exception ex)
{
Console.WriteLine("Error sending SMS: " + ex.Message);
}
Где:
PhoneNumber
— номер телефона получателя.Message
— текст уведомления.StringValue
— текстовое имя отправителя.