mcpField
S
sqs

sqs

github.com/itsmostafaクラウド・DevOps1.2k159 回インストール2 日前に更新
リポジトリ

sqs について

Amazon SQS で疎結合サービスやサーバーレスアプリケーションを構築する開発者向けのリファレンススキルです。キュー設定、メッセージ処理、Lambda 連携、運用、トラブルシューティングを扱います。

主な機能

  1. 01Standard キューと FIFO キューの設定
  2. 02メッセージの送信・受信・削除
  3. 03デッドレターキューの設定と再処理
  4. 04Lambda イベントソース連携
  5. 05CLI ガイドとトラブルシューティング

活用シーン

  1. 01メッセージ処理に使うキュー種別の選択
  2. 02SQS キューと Lambda 関数の接続
  3. 03デッドレターキューに送られたメッセージの原因調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itsmostafa/aws-agent-skills --skill sqs

インストール後、Claude Code で/sqsを入力して読み込まれたか確認します。

同梱ファイルmessaging-patterns.md

詳細

AWS SQS

Amazon Simple Queue Service(SQS)は、マイクロサービス、分散システム、サーバーレスアプリケーションを分離してスケーリングするための、フルマネージド型メッセージキューイングサービスです。

目次

コアコンセプト

キューの種類
種類説明ユースケース
Standard少なくとも 1 回の配信、順序はベストエフォート高スループット
FIFO厳密な順序での 1 回限りの配信順序が重要な処理
主な設定
設定説明デフォルト
可視性タイムアウトメッセージ受信後、メッセージが非表示になる時間30 seconds
メッセージ保持期間メッセージの保持期間4 days (max 14)
遅延秒数メッセージが利用可能になるまでの遅延時間0
最大メッセージサイズメッセージの最大サイズ256 KB
デッドレターキュー(DLQ)

maxReceiveCount 回試行しても処理に失敗したメッセージを格納するキューです。

一般的なパターン

Standard キューを作成する

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']
FIFO キューを作成する
aws sqs create-queue \
  --queue-name my-queue.fifo \
  --attributes '{
    "FifoQueue": "true",
    "ContentBasedDeduplication": "true"
  }'
デッドレターキューを設定する
# 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\\\"}\"
  }"
メッセージを送信する
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})}
    ]
)
メッセージを受信して処理する
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 との統合
# 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 ハンドラー:

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 リファレンス

キュー管理
コマンド説明
aws sqs create-queueキューを作成
aws sqs delete-queueキューを削除
aws sqs list-queuesキューを一覧表示
aws sqs get-queue-url名前からキュー URL を取得
aws sqs get-queue-attributesキューの設定を取得
aws sqs set-queue-attributesキューの設定を更新
メッセージング
コマンド説明
aws sqs send-message単一のメッセージを送信
aws sqs send-message-batch最大 10 件のメッセージを送信
aws sqs receive-messageメッセージを受信
aws sqs delete-messageメッセージを削除
aws sqs delete-message-batch最大 10 件のメッセージを削除
aws sqs purge-queueすべてのメッセージを削除
可視性
コマンド説明
aws sqs change-message-visibilityタイムアウトを変更
aws sqs change-message-visibility-batch一括で変更

ベストプラクティス

メッセージ処理
  • ロングポーリング(WaitTimeSeconds=20)を使って API 呼び出しを減らします
  • 正常に処理した後は、メッセージを速やかに削除します
  • 適切な可視性タイムアウト(処理時間より長い値)を設定します
  • 少なくとも 1 回の配信に対応するため、冪等性のあるコンシューマーを実装します
デッドレターキュー
  • 本番環境のキューには必ず DLQ を設定します
  • 適切な maxReceiveCount(通常は 3~5)を設定します
  • CloudWatch アラームでDLQ のメッセージ数を監視します
  • DLQ のメッセージを手動または自動化によって処理します
FIFO キュー
  • 順序を分割するには、メッセージグループ ID を使用します
  • コンテンツベースの重複排除を有効にするか、重複排除 ID を指定します
  • スループット:バッチ処理なしの場合は 300 msgs/sec、ありの場合は 3000
セキュリティ
  • アクセスを制御するためにキューポリシーを使用します
  • SSE-SQS または SSE-KMS による暗号化を有効化します
  • プライベートアクセスにはVPC エンドポイントを使用します

トラブルシューティング

メッセージを受信できない

原因:

  • ショートポーリングで空の結果が返される
  • すべてのメッセージが処理中(可視性タイムアウト)
  • メッセージが遅延している(DelaySeconds)

デバッグ:

# 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
メッセージが DLQ に送られる

原因:

  • 処理エラー
  • 可視性タイムアウトが短すぎる
  • コンシューマーがメッセージを削除していない

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
重複処理

解決策:

  • 1 回限りの配信には FIFO キューを使用します
  • コンシューマーに冪等性を実装します
  • 処理済みメッセージ ID をデータベースで追跡します
Lambda が処理しない
# 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

コメント