Pubblicato il 10/02/2024 da alnao nella categoria AWS

Il servizio SNS è studiato appositamente per gestire sistemi di notifiche dove una o più sorgenti abbiano la necessità di inviare notifiche ad uno o più destinatari, questo servizio non è da confondere con il servizio di code SQS che si occupa solo di smistamento di dati e non di notifiche con code come le FIFO. Esistono due tipi di notifiche: A2A e A2P:

  • A2S permette di notificare in maniera asincrona notifiche push anche molti-a-molti come Kinesis, Lambda e API Gateway
  • A2P consente l’invio di messaggi tramite SMS, notiche push ad aplicazioni e/o tramite e-mail.

I casi d’uso più usati sono invio da e per applicazioni per smartphone di messaggi, invio di SMS a clienti, invio di notifiche mail da una applicazione o da altri servizi AWS, procedure AWS Step Function che inviano notifiche nei flusso operativo.

Come ogni servizio AWS prevede un costo calcolato in base ad una tariffa ad uso, si rimanda alla documentazione ufficiale per maggiori dettagli riguardo alle tariffe e tutte le caratteristiche del servizio.


La CLI mette a disposizione una serie di comandi per il controllo del servizio SNS, si rimanda alla documentazione ufficiale. I principali comandi sono:

  • creazione di un topic
    aws sns create-topic --name ProvaAlbertoCLI
  • lista dei topic
    aws sns list-topics
  • lista delle sottoscrizioni
    aws sns list-subscriptions
  • creazione di una sottoscrizione
    aws sns subscribe --topic-arn arn:aws:sns:eu-west-1:xx:ProvaAlbertoCLI --protocol email --notification-endpoint test@email.com
  • pubblicazione di un contenuto in un topic
    aws sns publish --topic-arn arn:aws:sns:eu-west-1:xx:ProvaAlbertoCLI --message "Hello World!"
  • eliminazione di un topic
    aws sns delete-topic --topic-arn arn:aws:sns:eu-west-1:xxx:ProvaAlbertoCLI

Si rimanda sempre alla pagina specifica dove sono elencati tutti i comandi e i parametri previsti.


La libreria SDK mette a disposizione una serie di metodi per la gestione dei topic SNS, per tutti i dettagli si rimanda alla documentazione ufficiale, i principali metodi sono:

def get_sns_list(profile_name):
  boto3.setup_default_session(profile_name=profile_name)
  sns_client = boto3.client('sns')
  topics_iter = sns_client.list_topics()
  if 'Topics' in topics_iter :
    return topics_iter['Topics']
  return []
def create_topic(profile_name, topic_name):
  boto3.setup_default_session(profile_name=profile_name)
  sns_client = boto3.client('sns')
  topic = sns_client.create_topic(Name=topic_name)
  return topic
def delete_topic(profile_name, topic_arn):
  boto3.setup_default_session(profile_name=profile_name)
  sns_client = boto3.client('sns')
  topic = sns_client.delete_topic(TopicArn=topic_arn)
  return topic
def subscribe_topic(profile_name, topic_arn,email):
  boto3.setup_default_session(profile_name=profile_name)
  sns = boto3.client('sns')
  sns_resource = boto3.resource('sns')
  topics_iter = sns.list_topics()
  if 'Topics' in topics_iter :
    for element in topics_iter['Topics']:
      if topic_arn==element['TopicArn']:
        topic_arn = element['TopicArn']
        topic = sns_resource.Topic(arn=topic_arn)
        subscription = topic.subscribe(Protocol='email', Endpoint=email, ReturnSubscriptionArn=True)
        return subscription
  return {}
def get_subscriptions(profile_name,topic_arn):
  boto3.setup_default_session(profile_name=profile_name)
  sns_client = boto3.client('sns')
  subscriptions = sns_client.list_subscriptions()
  if 'Subscriptions' in subscriptions:
    list=[]
    for el in subscriptions['Subscriptions']:
      if topic_arn == el['TopicArn']:
        list.append(el)
      return list
  return []
def publish(profile_name,topic_arn,post):
  boto3.setup_default_session(profile_name=profile_name)
  #sns_client = boto3.client('sns')
  sns_resource = boto3.resource('sns')
  topic = sns_resource.Topic(arn=topic_arn)
  result = topic.publish(Message=post)
  return result

Il servizio CloudFormation permette la definizione e la gestione di SNS, si rimanda alla documentazione ufficiale per tutti i dettagli e la descrizione di tutte le proprietà. Il tipo base permette di definire un sistema di notifiche con poche proprietà:

GenericSnsTopic:
  Type: AWS::SNS::Topic
  Properties:
    DisplayName: uploadGenericSns
    TopicName: uploadGenericSns

Inoltre in un template è possibile anche impostare le sottoscrizioni con una risorsa specifica:

AlarmTopic:
  Type: AWS::SNS::Topic
  Properties:
    DisplayName: uploadGenericSns
    TopicName: uploadGenericSns
    Subscription:
    - Protocol: email
      Endpoint: !Ref NotificationEmail
  NotificationEmail:
    Type: AWS::SNS::Subscription
    Properties:
      Endpoint: example@mail.com
      Protocol: email
      TopicArn: !GetAtt AlarmTopic.Arn

Per tutti i dettagli si rimanda alla documentazione ufficiale, si possono trovare alcuni esempi nel solito repository:

https://github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio13lambdaApplicationS3Utils
MENU