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

Il servizio SQS di AWS permette di creare code di dati, il nome deriva dall’inglese Simple Queue System. In Infromatica per coda si intende una struttura dati costituita come raccolta di entità gestite in una sequenza che può essere modificata aggiungendo entità a un estremo e rimuovendole dall’altro estremo, si rimanda alla pagina wiki per maggiori dettagli sui vari tipi di code e il loro funzionamento.

Su AWS il servizio SQS ha determinate caratteristiche che lo distinguono da sistemi simili, le principali caratteristiche sono:

  • è di tipo Serverless quindi risulta completamente gestito
  • non ha un limite di scrittura/lettura (throughput) e non ha limiti di numero di entità gestite
  • il limite massimo di retenzione di una entità è di 4 giorni come default che può essere modificato fino a 14 giorni massimo
  • ogni entità ha un limite massimo di 256 Kb
  • è possibile avere entità duplicate e possono essere ordinate, di default infatti le code non sono di tipo FIFO ma può essere attivata come opzione avanzata
  • i servizi che scrivono nella coda sono detti Producer
  • i servizi che leggono dalla coda sono Consumer ed è loro compito eliminare l’elemento letto
  • è possibile gestire la scalabilità dei Consumer tramite AutoScaling grazie ad allarmi di CloudWatch
  • è possibile gestire la sicurezza tramite sistema di entryption con KMS (client side) ed è possibile definire regole di acesso (access policy) trmiate il servizio IAM
  • il servizio prevede molti parametri e configurazioni avanziate per la gestione di un DLQ (dead letter queue), un DQ (delay queue) e il polling (long polling)

Il costo del servizio è calcolato in base all’uso con un milione di richieste al mese gratuite, si rimanda al sito ufficiale per tutti i dettagli sul servizio.


La CLI mette a disposizione una serie di comandi per la gestione delle code SQS, i principali comandi sono:

  • lista delle code:
    aws sqs list-queues
    aws sqs list-queues --queue-name-prefix "rahul"
  • creazione di una nuova coda:
    aws sqs create-queue --queue-name sqs-formaz-with-tag --tags "env"="formazione" --attributes DelaySeconds=10
  • gestione delle entità nella coda:
    aws sqs get-queue-attributes --queue-url https://sqs.us-east-1.amazonaws.com/<aws-account-number>/sqs-formaz-with-tag --attribute-names All
    
    aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/<aws-account-number>/sqs-formaz-with-tag --message-body "Test message to my-sqs-using-cli sqs"
    
    aws sqs receive-message --queue-url https://sqs.us-east-1.amazonaws.com/<aws-account-number>/sqs-formaz-with-tag
    
    aws sqs purge-queue --queue-url https://sqs.us-east-1.amazonaws.com/<aws-account-number>/sqs-formaz-with-tag
  • eliminazione di una coda:
    aws sqs delete-queue --queue-url https://sqs.us-east-1.amazonaws.com/<aws-account-number>/sqs-formaz-with-tag

La libreria SDK mette a disposizione una serie di funzioni per la gestione delle code SQS, nel sito ufficiale possono essere trovati esempi dei principali linguaggi di programmazione come Java , Javascript e Python tramite la libreria boto3, i metodi principali sono:

def get_sns_list(profile_name):
  boto3.setup_default_session(profile_name=profile_name)
  sqs_client = boto3.client("sqs") #, region_name=AWS_REGION
  topics_iter = sqs_client.list_queues(
    MaxResults=100
  )
  if 'QueueUrls' in topics_iter :
    return topics_iter['QueueUrls']
  return []
def create_queue(profile_name, queue_name,delay_seconds,visiblity_timeout):
  boto3.setup_default_session(profile_name=profile_name)
  sqs_client = boto3.client("sqs") #, region_name=AWS_REGION
  response = sqs_client.create_queue(QueueName=queue_name,Attributes={
    'DelaySeconds': str(delay_seconds),
    'VisibilityTimeout': str(visiblity_timeout)
     # 'FifoQueue': 'true'
  })
  return response
def delete_queue(profile_name, queue_name):
  boto3.setup_default_session(profile_name=profile_name)
  sqs_client = boto3.client("sqs") #, region_name=AWS_REGION
  response = sqs_client.delete_queue(QueueUrl=queue_name)
  return response
def get_queue(profile_name, queue_url):
  boto3.setup_default_session(profile_name=profile_name)
  sqs_client = boto3.client("sqs") #, region_name=AWS_REGION
  response = sqs_client.get_queue_attributes( QueueUrl=queue_url, AttributeNames=['All'])
  if 'Attributes' in response:
    return response['Attributes']
  return {}
def send_queue_message(profile_name,queue_url,msg_attributes,msg_body):
  boto3.setup_default_session(profile_name=profile_name)
  sqs_client = boto3.client("sqs") #, region_name=AWS_REGION
  response = sqs_client.send_message(QueueUrl=queue_url,
    MessageAttributes=msg_attributes,
    MessageBody=msg_body)
  return response
def receive_queue_messages(profile_name,queue_url):
  boto3.setup_default_session(profile_name=profile_name)
  sqs_client = boto3.client("sqs") #, region_name=AWS_REGION
  response = sqs_client.receive_message(QueueUrl=queue_url,MaxNumberOfMessages=10)
  if 'Messages' in response:
    return response['Messages']
  return []
def delete_queue_message(profile_name,queue_url, receipt_handle):
  boto3.setup_default_session(profile_name=profile_name)
  sqs_client = boto3.client("sqs") #, region_name=AWS_REGION
  response = sqs_client.delete_message(QueueUrl=queue_url,ReceiptHandle=receipt_handle)
  return response

Con CloudFormation è possibile gestire le risorse di SQS con il tipo specifico

SqsQueue:
  Type: AWS::SQS::Queue
  Properties:
    QueueName: !Ref QueueName
    VisibilityTimeout: 180
    Tags:
    -
      Key: StackId
      Value: !Ref AWS::StackId

Inoltre bisogna ricordarsi che, in presenza di producer/consumer, è sempre necessario gestire le regole di accesso tramite la definizione di una regola IAM, per esempio:

SqsQueueLambdaConsumer:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: lambda
    Handler: consumer.entrypoint
    Runtime: python3.8
    MemorySize: 1280
    Timeout: 900
    Role: !GetAtt SqsQueueLambdaIamRole.Arn
SqsQueueLambdaIamRole:
  Type: 'AWS::IAM::Role'
  Properties:
    AssumeRolePolicyDocument:
    Version: 2012-10-17
    Statement:
    - Effect: Allow
      Principal:
      Service:
      - lambda.amazonaws.com
      Action:
      - 'sts:AssumeRole'
    Path: /
      Policies:
      - PolicyName: root
        PolicyDocument:
          Version: 2012-10-17
          Statement:
          - Effect: Allow
            Action:
            - sqs:GetQueueUrl 
            - sqs:SendMessage
            - sqs:ReceiveMessage
            - sqs:DeleteMessage
            Resource:
            - !GetAtt SqsQueue.Arn

L’esempio completo di coda SQS con un funzioni Lambda producer/consumer è disponibile nel solito repository:

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