AWS SNS i NET.Core
Pracuję nad projektem, w którym muszę pobrać dane z MySQL na AWS, przetworzyć je i zapisać do Azure SQL. Rozwiązanie będzie pracowało tylko raz na jakiś czas, staram sie więc wykorzystać dobrodziejstwa serverless. Piszę w Pythonie i NET.Core i dziś chciałem wysłać powiadomiania za pomocą AWS SNS i NET.Core i nie było tak hopsiup. Musiałem trochę poszperać i popróbować. Żaden znaleziony tutorial, żaden przykład nie działał. Nawet na StackOverflow nie znalazłem nic do dziedziczenia edytorowego (CTRL-C/CTRL-V) 🙂
Udało się coś zrobić, więc notuję. Ku pamięci.
Na GitHub wrzuciłem gotowe, proste rozwiązanie. Tu je tylko krótko opiszę.
Będziemy potrzebowali paczki AWSSDK.SimpleNotificationService. Dodajemy więc do csproj
<PackageReference Include="AWSSDK.SimpleNotificationService" Version="3.3.0.22" />
Dla wygody skorzystamy z klasy, która trzyma dane dostępowe do naszego regionu AWS.
public class AWSCredentials { public string AccessKey {get; set;} public string SecretKey { get; set; } public RegionEndpoint Region { get; set; } public AWSCredentials(string accessKey, string secretKey, RegionEndpoint region) { AccessKey = accessKey; SecretKey = secretKey; Region = region; } }
Samo wysyłanie wiadomości to raptem dwie linie kodu. Dla czytelności opakowałem to w metodę.
public async Task SendAWSNotification(AWSCredentials credentials, string topicArn, string message) { Console.WriteLine("--SENDING-MESSAGE----------------------"); var client = new AmazonSimpleNotificationServiceClient(credentials.AccessKey, credentials.SecretKey, credentials.Region); Console.WriteLine("Pushing message to topic: {0}", topicArn); var publishResponse = await client.PublishAsync(topicArn, message); Console.WriteLine("Message sent with HttpStatusCode: {0}", publishResponse.HttpStatusCode); Console.WriteLine("---------------------------------------"); }
Jako parametr metody AmazonSimpleNotificationServiceClient.PublishAsync możemy wykorzystać także obiekt PublishRequest, który daje nam trochę większe możliwości. Możemy na przykład zmienić temat wiadomości
var publishRequest = new PublishRequest(); publishRequest.Subject = "Message subject"; publishRequest.Message = message; publishRequest.TopicArn = topicArn; publishResponse = await client.PublishAsync(publishRequest);
czy też wysłać ją bezpośrednio sms-em
var phonePublishRequest = new PublishRequest(); phonePublishRequest.Message = message; phonePublishRequest.PhoneNumber = "YOUR-PHONE-NUMBER"; publishResponse = await client.PublishAsync(phonePublishRequest);
Trzeba pamiętać, że nie da się jednocześnie ustawić TopicArn i PhoneNumber.
W repozytorium na GitGub jest także przerobiona i działająca metoda pobierająca listę tematów SNS i wyświetlająca informacje o nich. Chętnych zapraszam.