Claude Skill

sqs

AWS SQS message queue service for decoupled architectures. Use when creating queues, configuring dead-letter queues, managing visibility timeouts, implementing FIFO ordering, or integrating with Lambda.

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download itsmostafa-aws-agent-skills-skills_sqs-e786d25.zip · 6 KB
Part of itsmostafa/aws-agent-skills — 17 skills

Install

skills CLI npx skills add https://github.com/itsmostafa/aws-agent-skills/tree/main/skills/sqs
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install itsmostafa-aws-agent-skills@llmmart
Git git clone https://github.com/itsmostafa/aws-agent-skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole itsmostafa/aws-agent-skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

AWS SQS

Amazon Simple Queue Service (SQS) is a fully managed message queuing service for decoupling and scaling microservices, distributed systems, and serverless applications.

Table of Contents

Core Concepts

Queue Types

Type Description Use Case
Standard At-least-once, best-effort ordering High throughput
FIFO Exactly-once, strict ordering Order-sensitive processing

Key Settings

Setting Description Default
Visibility Timeout Time message is hidden after receive 30 seconds
Message Retention How long messages are kept 4 days (max 14)
Delay Seconds Delay before message is available 0
Max Message Size Maximum message size 256 KB

Dead-Letter Queue (DLQ)

Queue for messages that failed processing after maxReceiveCount attempts.

Common Patterns

Create a Standard Queue

AWS CLI:

aws sqs create-queue \
  --queue-name my-queue \
  --attributes '{
    "VisibilityTimeout": "60",
    "MessageRetentionPeriod": "604800",
    "ReceiveMessageWaitTimeSeconds": "20"
  }'

boto3:

import boto3

sqs = boto3.client('sqs')

response = sqs.create_queue(
    QueueName='my-queue',
    Attributes={
        'VisibilityTimeout': '60',
        'MessageRetentionPeriod': '604800',
        'ReceiveMessageWaitTimeSeconds': '20'  # Long polling
    }
)
queue_url = response['QueueUrl']

Create FIFO Queue

aws sqs create-queue \
  --queue-name my-queue.fifo \
  --attributes '{
    "FifoQueue": "true",
    "ContentBasedDeduplication": "true"
  }'

Configure Dead-Letter Queue

# Create DLQ
aws sqs create-queue --queue-name my-queue-dlq

# Get DLQ ARN
DLQ_ARN=$(aws sqs get-queue-attributes \
  --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/my-queue-dlq \
  --attribute-names QueueArn \
  --query 'Attributes.QueueArn' --output text)

# Set redrive policy on main queue
aws sqs set-queue-attributes \
  --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/my-queue \
  --attributes "{
    \"RedrivePolicy\": \"{\\\"deadLetterTargetArn\\\":\\\"${DLQ_ARN}\\\",\\\"maxReceiveCount\\\":\\\"3\\\"}\"
  }"

Send Messages

import boto3
import json

sqs = boto3.client('sqs')
queue_url = 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue'

# Send single message
sqs.send_message(
    QueueUrl=queue_url,
    MessageBody=json.dumps({'order_id': '12345', 'action': 'process'}),
    MessageAttributes={
        'MessageType': {
            'DataType': 'String',
            'StringValue': 'Order'
        }
    }
)

# Send to FIFO queue
sqs.send_message(
    QueueUrl='https://sqs.us-east-1.amazonaws.com/123456789012/my-queue.fifo',
    MessageBody=json.dumps({'order_id': '12345'}),
    MessageGroupId='order-12345',
    MessageDeduplicationId='unique-id-12345'
)

# Batch send (up to 10 messages)
sqs.send_message_batch(
    QueueUrl=queue_url,
    Entries=[
        {'Id': '1', 'MessageBody': json.dumps({'id': 1})},
        {'Id': '2', 'MessageBody': json.dumps({'id': 2})},
        {'Id': '3', 'MessageBody': json.dumps({'id': 3})}
    ]
)

Receive and Process Messages

import boto3
import json

sqs = boto3.client('sqs')
queue_url = 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue'

while True:
    # Long polling (wait up to 20 seconds)
    response = sqs.receive_message(
        QueueUrl=queue_url,
        MaxNumberOfMessages=10,
        WaitTimeSeconds=20,
        MessageAttributeNames=['All'],
        AttributeNames=['All']
    )

    messages = response.get('Messages', [])

    for message in messages:
        try:
            body = json.loads(message['Body'])
            print(f"Processing: {body}")

            # Process message...

            # Delete on success
            sqs.delete_message(
                QueueUrl=queue_url,
                ReceiptHandle=message['ReceiptHandle']
            )
        except Exception as e:
            print(f"Error processing message: {e}")
            # Message will become visible again after visibility timeout

Lambda Integration

# Create event source mapping
aws lambda create-event-source-mapping \
  --function-name my-function \
  --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
  --batch-size 10 \
  --maximum-batching-window-in-seconds 5

Lambda handler:

def handler(event, context):
    for record in event['Records']:
        body = json.loads(record['body'])
        message_id = record['messageId']

        try:
            process_message(body)
        except Exception as e:
            # Raise to put message back in queue
            raise

    return {'batchItemFailures': []}

CLI Reference

Queue Management

Command Description
aws sqs create-queue Create queue
aws sqs delete-queue Delete queue
aws sqs list-queues List queues
aws sqs get-queue-url Get queue URL by name
aws sqs get-queue-attributes Get queue settings
aws sqs set-queue-attributes Update queue settings

Messaging

Command Description
aws sqs send-message Send single message
aws sqs send-message-batch Send up to 10 messages
aws sqs receive-message Receive messages
aws sqs delete-message Delete message
aws sqs delete-message-batch Delete up to 10 messages
aws sqs purge-queue Delete all messages

Visibility

Command Description
aws sqs change-message-visibility Change timeout
aws sqs change-message-visibility-batch Batch change

Best Practices

Message Processing

  • Use long polling (WaitTimeSeconds=20) to reduce API calls
  • Delete messages promptly after successful processing
  • Configure appropriate visibility timeout (> processing time)
  • Implement idempotent consumers for at-least-once delivery

Dead-Letter Queues

  • Always configure DLQ for production queues
  • Set appropriate maxReceiveCount (usually 3-5)
  • Monitor DLQ depth with CloudWatch alarms
  • Process DLQ messages manually or with automation

FIFO Queues

  • Use message group IDs to partition ordering
  • Enable content-based deduplication or provide dedup IDs
  • Throughput: 300 msgs/sec without batching, 3000 with

Security

  • Use queue policies to control access
  • Enable encryption with SSE-SQS or SSE-KMS
  • Use VPC endpoints for private access

Troubleshooting

Messages Not Being Received

Causes:

  • Short polling returning empty
  • All messages in flight (visibility timeout)
  • Messages delayed (DelaySeconds)

Debug:

# Check queue attributes
aws sqs get-queue-attributes \
  --queue-url $QUEUE_URL \
  --attribute-names All

# Check approximate message counts
aws sqs get-queue-attributes \
  --queue-url $QUEUE_URL \
  --attribute-names \
    ApproximateNumberOfMessages,\
    ApproximateNumberOfMessagesNotVisible,\
    ApproximateNumberOfMessagesDelayed

Messages Going to DLQ

Causes:

  • Processing errors
  • Visibility timeout too short
  • Consumer not deleting messages

Redrive from DLQ:

# Enable redrive allow policy on source queue
aws sqs set-queue-attributes \
  --queue-url $MAIN_QUEUE_URL \
  --attributes '{"RedriveAllowPolicy": "{\"redrivePermission\":\"allowAll\"}"}'

# Start redrive
aws sqs start-message-move-task \
  --source-arn arn:aws:sqs:us-east-1:123456789012:my-queue-dlq \
  --destination-arn arn:aws:sqs:us-east-1:123456789012:my-queue

Duplicate Processing

Solutions:

  • Use FIFO queues for exactly-once
  • Implement idempotency in consumer
  • Track processed message IDs in database

Lambda Not Processing

# Check event source mapping
aws lambda list-event-source-mappings \
  --function-name my-function

# Check for errors
aws lambda get-event-source-mapping \
  --uuid <mapping-uuid>

References

Files (aws-agent-skills)
  • messaging-patterns.md 10.5 KB
    # SQS Messaging Patterns
    
    Advanced messaging patterns and configurations.
    
    ## Queue Policies
    
    ### Allow SNS to Send Messages
    
    ```json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "sns.amazonaws.com"
          },
          "Action": "sqs:SendMessage",
          "Resource": "arn:aws:sqs:us-east-1:123456789012:my-queue",
          "Condition": {
            "ArnEquals": {
              "aws:SourceArn": "arn:aws:sns:us-east-1:123456789012:my-topic"
            }
          }
        }
      ]
    }
    ```
    
    ### Allow S3 to Send Messages
    
    ```json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "sqs:SendMessage",
          "Resource": "arn:aws:sqs:us-east-1:123456789012:my-queue",
          "Condition": {
            "ArnLike": {
              "aws:SourceArn": "arn:aws:s3:::my-bucket"
            }
          }
        }
      ]
    }
    ```
    
    ### Cross-Account Access
    
    ```json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::111111111111:root"
          },
          "Action": [
            "sqs:SendMessage",
            "sqs:ReceiveMessage",
            "sqs:DeleteMessage"
          ],
          "Resource": "arn:aws:sqs:us-east-1:123456789012:my-queue"
        }
      ]
    }
    ```
    
    ## Encryption
    
    ### Server-Side Encryption (SSE-SQS)
    
    ```bash
    aws sqs create-queue \
      --queue-name my-queue \
      --attributes '{
        "SqsManagedSseEnabled": "true"
      }'
    ```
    
    ### SSE with KMS
    
    ```bash
    aws sqs create-queue \
      --queue-name my-queue \
      --attributes '{
        "KmsMasterKeyId": "alias/my-key",
        "KmsDataKeyReusePeriodSeconds": "300"
      }'
    ```
    
    ## FIFO Queue Patterns
    
    ### Message Groups for Parallel Processing
    
    ```python
    import boto3
    import json
    
    sqs = boto3.client('sqs')
    queue_url = 'https://sqs.us-east-1.amazonaws.com/123456789012/orders.fifo'
    
    # Different customers can be processed in parallel
    # Same customer maintains order
    orders = [
        {'customer_id': 'A', 'order_id': '1'},
        {'customer_id': 'B', 'order_id': '2'},
        {'customer_id': 'A', 'order_id': '3'},  # After order 1
    ]
    
    for order in orders:
        sqs.send_message(
            QueueUrl=queue_url,
            MessageBody=json.dumps(order),
            MessageGroupId=order['customer_id'],  # Group by customer
            MessageDeduplicationId=f"{order['customer_id']}-{order['order_id']}"
        )
    ```
    
    ### High Throughput FIFO
    
    ```bash
    aws sqs create-queue \
      --queue-name my-queue.fifo \
      --attributes '{
        "FifoQueue": "true",
        "ContentBasedDeduplication": "true",
        "DeduplicationScope": "messageGroup",
        "FifoThroughputLimit": "perMessageGroupId"
      }'
    ```
    
    ## Batch Processing with Lambda
    
    ### Partial Batch Failure
    
    ```python
    def handler(event, context):
        batch_item_failures = []
    
        for record in event['Records']:
            try:
                body = json.loads(record['body'])
                process_message(body)
            except Exception as e:
                # Report this specific message as failed
                batch_item_failures.append({
                    'itemIdentifier': record['messageId']
                })
    
        return {'batchItemFailures': batch_item_failures}
    ```
    
    ### Configure Lambda for Partial Failures
    
    ```bash
    aws lambda update-event-source-mapping \
      --uuid <mapping-uuid> \
      --function-response-types ReportBatchItemFailures
    ```
    
    ## Visibility Timeout Management
    
    ### Extend Visibility During Processing
    
    ```python
    import boto3
    import time
    import threading
    
    sqs = boto3.client('sqs')
    
    def extend_visibility(queue_url, receipt_handle, stop_event):
        """Background thread to extend visibility."""
        while not stop_event.wait(timeout=30):
            try:
                sqs.change_message_visibility(
                    QueueUrl=queue_url,
                    ReceiptHandle=receipt_handle,
                    VisibilityTimeout=60
                )
            except Exception:
                break
    
    def process_long_running_message(queue_url, message):
        stop_event = threading.Event()
    
        # Start background visibility extender
        extender = threading.Thread(
            target=extend_visibility,
            args=(queue_url, message['ReceiptHandle'], stop_event)
        )
        extender.start()
    
        try:
            # Long processing...
            do_long_processing(message['Body'])
    
            # Delete on success
            sqs.delete_message(
                QueueUrl=queue_url,
                ReceiptHandle=message['ReceiptHandle']
            )
        finally:
            stop_event.set()
            extender.join()
    ```
    
    ## Message Delay Patterns
    
    ### Per-Message Delay
    
    ```python
    # Delay individual message up to 15 minutes
    sqs.send_message(
        QueueUrl=queue_url,
        MessageBody=json.dumps({'action': 'reminder'}),
        DelaySeconds=900  # 15 minutes
    )
    ```
    
    ### Scheduled Processing
    
    ```python
    import time
    
    def schedule_message(queue_url, body, execute_at):
        """Schedule message for future processing."""
        delay = int(execute_at - time.time())
    
        if delay <= 0:
            delay = 0
        elif delay > 900:
            # For delays > 15 min, use message attribute
            # and filter on receive
            sqs.send_message(
                QueueUrl=queue_url,
                MessageBody=json.dumps({
                    **body,
                    '_execute_at': execute_at
                }),
                DelaySeconds=900  # Maximum delay
            )
            return
    
        sqs.send_message(
            QueueUrl=queue_url,
            MessageBody=json.dumps(body),
            DelaySeconds=delay
        )
    ```
    
    ## Monitoring
    
    ### CloudWatch Alarms
    
    ```bash
    # DLQ depth alarm
    aws cloudwatch put-metric-alarm \
      --alarm-name "SQS-DLQ-NotEmpty" \
      --metric-name ApproximateNumberOfMessagesVisible \
      --namespace AWS/SQS \
      --dimensions Name=QueueName,Value=my-queue-dlq \
      --statistic Sum \
      --period 60 \
      --threshold 1 \
      --comparison-operator GreaterThanOrEqualToThreshold \
      --evaluation-periods 1 \
      --alarm-actions arn:aws:sns:us-east-1:123456789012:alerts
    
    # Queue backlog alarm
    aws cloudwatch put-metric-alarm \
      --alarm-name "SQS-Queue-Backlog" \
      --metric-name ApproximateNumberOfMessagesVisible \
      --namespace AWS/SQS \
      --dimensions Name=QueueName,Value=my-queue \
      --statistic Sum \
      --period 300 \
      --threshold 1000 \
      --comparison-operator GreaterThanThreshold \
      --evaluation-periods 3 \
      --alarm-actions arn:aws:sns:us-east-1:123456789012:alerts
    
    # Age of oldest message
    aws cloudwatch put-metric-alarm \
      --alarm-name "SQS-Old-Messages" \
      --metric-name ApproximateAgeOfOldestMessage \
      --namespace AWS/SQS \
      --dimensions Name=QueueName,Value=my-queue \
      --statistic Maximum \
      --period 300 \
      --threshold 3600 \
      --comparison-operator GreaterThanThreshold \
      --evaluation-periods 2 \
      --alarm-actions arn:aws:sns:us-east-1:123456789012:alerts
    ```
    
    ### Custom Metrics
    
    ```python
    import boto3
    
    cloudwatch = boto3.client('cloudwatch')
    
    def publish_processing_metrics(queue_name, processing_time, success):
        cloudwatch.put_metric_data(
            Namespace='MyApp/SQS',
            MetricData=[
                {
                    'MetricName': 'ProcessingTime',
                    'Value': processing_time,
                    'Unit': 'Milliseconds',
                    'Dimensions': [
                        {'Name': 'QueueName', 'Value': queue_name}
                    ]
                },
                {
                    'MetricName': 'ProcessingSuccess' if success else 'ProcessingFailure',
                    'Value': 1,
                    'Unit': 'Count',
                    'Dimensions': [
                        {'Name': 'QueueName', 'Value': queue_name}
                    ]
                }
            ]
        )
    ```
    
    ## Request-Response Pattern
    
    ### Temporary Response Queue
    
    ```python
    import boto3
    import json
    import uuid
    
    sqs = boto3.client('sqs')
    
    def send_request_with_response(request_queue_url, payload):
        # Create temporary response queue
        correlation_id = str(uuid.uuid4())
        response_queue = sqs.create_queue(
            QueueName=f'response-{correlation_id}',
            Attributes={'MessageRetentionPeriod': '300'}
        )
        response_queue_url = response_queue['QueueUrl']
    
        try:
            # Send request with reply-to
            sqs.send_message(
                QueueUrl=request_queue_url,
                MessageBody=json.dumps(payload),
                MessageAttributes={
                    'ReplyTo': {
                        'DataType': 'String',
                        'StringValue': response_queue_url
                    },
                    'CorrelationId': {
                        'DataType': 'String',
                        'StringValue': correlation_id
                    }
                }
            )
    
            # Wait for response
            response = sqs.receive_message(
                QueueUrl=response_queue_url,
                WaitTimeSeconds=20,
                MaxNumberOfMessages=1
            )
    
            if response.get('Messages'):
                return json.loads(response['Messages'][0]['Body'])
    
            return None
        finally:
            sqs.delete_queue(QueueUrl=response_queue_url)
    ```
    
    ## Large Message Pattern
    
    ### Using S3 for Large Payloads
    
    ```python
    import boto3
    import json
    import uuid
    
    s3 = boto3.client('s3')
    sqs = boto3.client('sqs')
    
    def send_large_message(queue_url, bucket, payload):
        """Send message > 256KB using S3."""
        payload_str = json.dumps(payload)
    
        if len(payload_str) > 200000:  # Use S3 for large payloads
            key = f'sqs-payloads/{uuid.uuid4()}.json'
            s3.put_object(Bucket=bucket, Key=key, Body=payload_str)
    
            sqs.send_message(
                QueueUrl=queue_url,
                MessageBody=json.dumps({
                    's3_bucket': bucket,
                    's3_key': key
                }),
                MessageAttributes={
                    'PayloadLocation': {
                        'DataType': 'String',
                        'StringValue': 's3'
                    }
                }
            )
        else:
            sqs.send_message(
                QueueUrl=queue_url,
                MessageBody=payload_str
            )
    
    def receive_large_message(queue_url, bucket):
        """Receive message, fetch from S3 if needed."""
        response = sqs.receive_message(
            QueueUrl=queue_url,
            MessageAttributeNames=['PayloadLocation'],
            MaxNumberOfMessages=1
        )
    
        if not response.get('Messages'):
            return None
    
        message = response['Messages'][0]
        attrs = message.get('MessageAttributes', {})
    
        if attrs.get('PayloadLocation', {}).get('StringValue') == 's3':
            pointer = json.loads(message['Body'])
            response = s3.get_object(
                Bucket=pointer['s3_bucket'],
                Key=pointer['s3_key']
            )
            body = json.loads(response['Body'].read())
    
            # Clean up S3 object
            s3.delete_object(Bucket=pointer['s3_bucket'], Key=pointer['s3_key'])
        else:
            body = json.loads(message['Body'])
    
        return body, message['ReceiptHandle']
    ```
    
  • SKILL.md 8.8 KB
    ---
    name: sqs
    description: AWS SQS message queue service for decoupled architectures. Use when creating queues, configuring dead-letter queues, managing visibility timeouts, implementing FIFO ordering, or integrating with Lambda.
    last_updated: "2026-01-07"
    doc_source: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/
    ---
    
    # AWS SQS
    
    Amazon Simple Queue Service (SQS) is a fully managed message queuing service for decoupling and scaling microservices, distributed systems, and serverless applications.
    
    ## Table of Contents
    
    - [Core Concepts](#core-concepts)
    - [Common Patterns](#common-patterns)
    - [CLI Reference](#cli-reference)
    - [Best Practices](#best-practices)
    - [Troubleshooting](#troubleshooting)
    - [References](#references)
    
    ## Core Concepts
    
    ### Queue Types
    
    | Type | Description | Use Case |
    |------|-------------|----------|
    | **Standard** | At-least-once, best-effort ordering | High throughput |
    | **FIFO** | Exactly-once, strict ordering | Order-sensitive processing |
    
    ### Key Settings
    
    | Setting | Description | Default |
    |---------|-------------|---------|
    | **Visibility Timeout** | Time message is hidden after receive | 30 seconds |
    | **Message Retention** | How long messages are kept | 4 days (max 14) |
    | **Delay Seconds** | Delay before message is available | 0 |
    | **Max Message Size** | Maximum message size | 256 KB |
    
    ### Dead-Letter Queue (DLQ)
    
    Queue for messages that failed processing after maxReceiveCount attempts.
    
    ## Common Patterns
    
    ### Create a Standard Queue
    
    **AWS CLI:**
    
    ```bash
    aws sqs create-queue \
      --queue-name my-queue \
      --attributes '{
        "VisibilityTimeout": "60",
        "MessageRetentionPeriod": "604800",
        "ReceiveMessageWaitTimeSeconds": "20"
      }'
    ```
    
    **boto3:**
    
    ```python
    import boto3
    
    sqs = boto3.client('sqs')
    
    response = sqs.create_queue(
        QueueName='my-queue',
        Attributes={
            'VisibilityTimeout': '60',
            'MessageRetentionPeriod': '604800',
            'ReceiveMessageWaitTimeSeconds': '20'  # Long polling
        }
    )
    queue_url = response['QueueUrl']
    ```
    
    ### Create FIFO Queue
    
    ```bash
    aws sqs create-queue \
      --queue-name my-queue.fifo \
      --attributes '{
        "FifoQueue": "true",
        "ContentBasedDeduplication": "true"
      }'
    ```
    
    ### Configure Dead-Letter Queue
    
    ```bash
    # Create DLQ
    aws sqs create-queue --queue-name my-queue-dlq
    
    # Get DLQ ARN
    DLQ_ARN=$(aws sqs get-queue-attributes \
      --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/my-queue-dlq \
      --attribute-names QueueArn \
      --query 'Attributes.QueueArn' --output text)
    
    # Set redrive policy on main queue
    aws sqs set-queue-attributes \
      --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/my-queue \
      --attributes "{
        \"RedrivePolicy\": \"{\\\"deadLetterTargetArn\\\":\\\"${DLQ_ARN}\\\",\\\"maxReceiveCount\\\":\\\"3\\\"}\"
      }"
    ```
    
    ### Send Messages
    
    ```python
    import boto3
    import json
    
    sqs = boto3.client('sqs')
    queue_url = 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue'
    
    # Send single message
    sqs.send_message(
        QueueUrl=queue_url,
        MessageBody=json.dumps({'order_id': '12345', 'action': 'process'}),
        MessageAttributes={
            'MessageType': {
                'DataType': 'String',
                'StringValue': 'Order'
            }
        }
    )
    
    # Send to FIFO queue
    sqs.send_message(
        QueueUrl='https://sqs.us-east-1.amazonaws.com/123456789012/my-queue.fifo',
        MessageBody=json.dumps({'order_id': '12345'}),
        MessageGroupId='order-12345',
        MessageDeduplicationId='unique-id-12345'
    )
    
    # Batch send (up to 10 messages)
    sqs.send_message_batch(
        QueueUrl=queue_url,
        Entries=[
            {'Id': '1', 'MessageBody': json.dumps({'id': 1})},
            {'Id': '2', 'MessageBody': json.dumps({'id': 2})},
            {'Id': '3', 'MessageBody': json.dumps({'id': 3})}
        ]
    )
    ```
    
    ### Receive and Process Messages
    
    ```python
    import boto3
    import json
    
    sqs = boto3.client('sqs')
    queue_url = 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue'
    
    while True:
        # Long polling (wait up to 20 seconds)
        response = sqs.receive_message(
            QueueUrl=queue_url,
            MaxNumberOfMessages=10,
            WaitTimeSeconds=20,
            MessageAttributeNames=['All'],
            AttributeNames=['All']
        )
    
        messages = response.get('Messages', [])
    
        for message in messages:
            try:
                body = json.loads(message['Body'])
                print(f"Processing: {body}")
    
                # Process message...
    
                # Delete on success
                sqs.delete_message(
                    QueueUrl=queue_url,
                    ReceiptHandle=message['ReceiptHandle']
                )
            except Exception as e:
                print(f"Error processing message: {e}")
                # Message will become visible again after visibility timeout
    ```
    
    ### Lambda Integration
    
    ```bash
    # Create event source mapping
    aws lambda create-event-source-mapping \
      --function-name my-function \
      --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
      --batch-size 10 \
      --maximum-batching-window-in-seconds 5
    ```
    
    Lambda handler:
    
    ```python
    def handler(event, context):
        for record in event['Records']:
            body = json.loads(record['body'])
            message_id = record['messageId']
    
            try:
                process_message(body)
            except Exception as e:
                # Raise to put message back in queue
                raise
    
        return {'batchItemFailures': []}
    ```
    
    ## CLI Reference
    
    ### Queue Management
    
    | Command | Description |
    |---------|-------------|
    | `aws sqs create-queue` | Create queue |
    | `aws sqs delete-queue` | Delete queue |
    | `aws sqs list-queues` | List queues |
    | `aws sqs get-queue-url` | Get queue URL by name |
    | `aws sqs get-queue-attributes` | Get queue settings |
    | `aws sqs set-queue-attributes` | Update queue settings |
    
    ### Messaging
    
    | Command | Description |
    |---------|-------------|
    | `aws sqs send-message` | Send single message |
    | `aws sqs send-message-batch` | Send up to 10 messages |
    | `aws sqs receive-message` | Receive messages |
    | `aws sqs delete-message` | Delete message |
    | `aws sqs delete-message-batch` | Delete up to 10 messages |
    | `aws sqs purge-queue` | Delete all messages |
    
    ### Visibility
    
    | Command | Description |
    |---------|-------------|
    | `aws sqs change-message-visibility` | Change timeout |
    | `aws sqs change-message-visibility-batch` | Batch change |
    
    ## Best Practices
    
    ### Message Processing
    
    - **Use long polling** (WaitTimeSeconds=20) to reduce API calls
    - **Delete messages promptly** after successful processing
    - **Configure appropriate visibility timeout** (> processing time)
    - **Implement idempotent consumers** for at-least-once delivery
    
    ### Dead-Letter Queues
    
    - **Always configure DLQ** for production queues
    - **Set appropriate maxReceiveCount** (usually 3-5)
    - **Monitor DLQ depth** with CloudWatch alarms
    - **Process DLQ messages** manually or with automation
    
    ### FIFO Queues
    
    - **Use message group IDs** to partition ordering
    - **Enable content-based deduplication** or provide dedup IDs
    - **Throughput**: 300 msgs/sec without batching, 3000 with
    
    ### Security
    
    - **Use queue policies** to control access
    - **Enable encryption** with SSE-SQS or SSE-KMS
    - **Use VPC endpoints** for private access
    
    ## Troubleshooting
    
    ### Messages Not Being Received
    
    **Causes:**
    - Short polling returning empty
    - All messages in flight (visibility timeout)
    - Messages delayed (DelaySeconds)
    
    **Debug:**
    
    ```bash
    # Check queue attributes
    aws sqs get-queue-attributes \
      --queue-url $QUEUE_URL \
      --attribute-names All
    
    # Check approximate message counts
    aws sqs get-queue-attributes \
      --queue-url $QUEUE_URL \
      --attribute-names \
        ApproximateNumberOfMessages,\
        ApproximateNumberOfMessagesNotVisible,\
        ApproximateNumberOfMessagesDelayed
    ```
    
    ### Messages Going to DLQ
    
    **Causes:**
    - Processing errors
    - Visibility timeout too short
    - Consumer not deleting messages
    
    **Redrive from DLQ:**
    
    ```bash
    # Enable redrive allow policy on source queue
    aws sqs set-queue-attributes \
      --queue-url $MAIN_QUEUE_URL \
      --attributes '{"RedriveAllowPolicy": "{\"redrivePermission\":\"allowAll\"}"}'
    
    # Start redrive
    aws sqs start-message-move-task \
      --source-arn arn:aws:sqs:us-east-1:123456789012:my-queue-dlq \
      --destination-arn arn:aws:sqs:us-east-1:123456789012:my-queue
    ```
    
    ### Duplicate Processing
    
    **Solutions:**
    - Use FIFO queues for exactly-once
    - Implement idempotency in consumer
    - Track processed message IDs in database
    
    ### Lambda Not Processing
    
    ```bash
    # Check event source mapping
    aws lambda list-event-source-mappings \
      --function-name my-function
    
    # Check for errors
    aws lambda get-event-source-mapping \
      --uuid <mapping-uuid>
    ```
    
    ## References
    
    - [SQS Developer Guide](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/)
    - [SQS API Reference](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/)
    - [SQS CLI Reference](https://docs.aws.amazon.com/cli/latest/reference/sqs/)
    - [boto3 SQS](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sqs.html)
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related