sqs について
Amazon SQS で疎結合サービスやサーバーレスアプリケーションを構築する開発者向けのリファレンススキルです。キュー設定、メッセージ処理、Lambda 連携、運用、トラブルシューティングを扱います。
主な機能
- 01Standard キューと FIFO キューの設定
- 02メッセージの送信・受信・削除
- 03デッドレターキューの設定と再処理
- 04Lambda イベントソース連携
- 05CLI ガイドとトラブルシューティング
活用シーン
- 01メッセージ処理に使うキュー種別の選択
- 02SQS キューと Lambda 関数の接続
- 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
コメント
Markdown 対応