
【VPC外リージョンサービス】
SQS(Amazon Simple Queue Service)は、完全マネージド型の Queue(キュー) サービスです。
Producer(プロデューサー) が送信した Message(メッセージ) を一時的に保持し、Consumer(コンシューマー) が自身のタイミングでそれを受信・処理することで、システム間の 疎結合 を実現します。
SQSには2種類のキューがあり、Standard Queue は高スループットを特徴とし、少数のメッセージ重複を許容します。一方で、FIFO Queue(First-In-First-Out) はメッセージの順序を保証し、重複排除機能を備えています。
可視性タイムアウト により、Consumerがメッセージを処理中に他のConsumerへ同じメッセージが再配信されないよう制御できます。また、一定期間メッセージを保持する 保持期間 や、配信を遅らせる 遅延配信、処理に繰り返し失敗したメッセージを退避する DLQ(Dead-Letter Queue) などの機能により、堅牢で信頼性の高い非同期処理を実現します。
さらに、Polling(ポーリング) や ロングポーリング(Long Polling) によって効率的にメッセージを取り出し、負荷のスパイクを平滑化することが可能です。
SQSは、Lambda、SNS(Simple Notification Service)、および EventBridge などのAWSサービスと連携することで、イベント駆動アーキテクチャの中心的な役割を担い、スケーラブルで柔軟なシステム設計を支えます。
重要用語
関連サービス
ユースケース
| 非同期処理キューイング | Webアプリからの重い処理をSQSキューに入れ、バックエンドのワーカーが順次処理することでレスポンスを高速化しつつ処理を安定させる。 |
| リトライ制御とデッドレタキュー | 一時的なエラーで失敗したメッセージを自動リトライし、それでも処理できないメッセージをデッドレタキューに分離して個別に調査する。 |
| マイクロサービス間の疎結合連携 | サービス間の依存を弱めるために、直接呼び出しではなくSQSキュー経由でジョブやイベントを渡すアーキテクチャを採用する。 |
ベストプラクティス
| 可視性タイムアウトの適切な設定 | メッセージ処理時間に合わせてVisibility Timeoutを調整し、重複処理を防ぐ。 |
| デッドレタキューの利用 | 処理に失敗し続けるメッセージを別キューに退避させ、分析と再処理を行う。 |
| ロングポーリングの活用 | Long Pollingを有効にして空読みを減らし、コストとレイテンシを最適化する。 |
高可用性・バックアップ・リトライ
| 高可用性・バックアップ・リトライ設計のポイント |
|---|
| 【デフォルト】AWS内部で冗長化 ・メッセージ管理システム ・メッセージデータ本体 ・キュー定義・メタデータ ・可視性タイムアウト管理 ・遅延配信・スケジュール管理 ・メトリクス・監視データ |
| 【自動リトライ】 ポーリング側で実装する |
| 【可視性タイムアウト】デフォルト30秒 Deleteされずにタイムアウトしたら可視化され再取得される |
| 【DLQ、最大受信回数】デフォルトオフ 同じメッセージが指定回数以上受信されたら DLQ に移動する |
セキュリティ
| 関連サービス | 設定内容 |
|---|---|
| KMS(データの暗号化と鍵の安全管理) | 【メッセージ本文の暗号化が必要】 独自KMSキーを使うことを推奨(鍵操作、監査) |
| Secrets Manager(機密情報の安全管理) | - |
| SSM Parameter Store(設定情報の一元管理) | - |
| CloudTrail(操作履歴の記録・監査・追跡) | 【自動記録】 作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI) データ操作は追跡できない(データプレーンAPI) |
| Config(リソースの構成状態・設定変更を記録) | 【Configが有効な場合】 キュー設定変更履歴・暗号化/ポリシー公開/可視性タイムアウト等の準拠評価 |
| GuardDuty(脅威を自動検出) | 【GuardDutyが有効な場合】 キュー削除・ポリシー変更のAPI異常検知 |
リソースベースポリシーによる補完
実行ロールで不足する権限をSQS のリソースベースポリシーで補うパターン
| リソースベースポリシーのPrincipal | リソースベースポリシーのAction |
|---|---|
| 【SNS】 sns.amazonaws.com | sqs:SendMessage |
| 【S3】 s3.amazonaws.com | sqs:SendMessage |
| 【Lambda(DLQ)】 lambda.amazonaws.com | sqs:SendMessage |
ログ・監視
標準メトリクス
| メトリクス名 | 説明 |
|---|---|
| ApproximateAgeOfOldestMessage | 最古メッセージの経過時間 |
| NumberOfEmptyReceives | 空のReceiveMessage回数 |
| NumberOfMessagesDeleted | 削除されたメッセージ数 |
| NumberOfMessagesReceived | 受信されたメッセージ数 |
| NumberOfMessagesSent | 送信されたメッセージ数 |
| SentMessageSize | 送信メッセージサイズ平均 |
| ApproximateNumberOfMessagesDelayed | 遅延メッセージ数 |
| ApproximateNumberOfMessagesNotVisible | 処理中メッセージ数 |
| ApproximateNumberOfMessagesVisible | キューに溜まっているメッセージ数 |
| NumberOfMessagesMovedToDLQ | DLQへ移動したメッセージ数 |
| NumberOfMessagesReturnedByDLQ | DLQから戻されたメッセージ数 |
制限値(固定値/ハードリミット/ソフトリミット)
| 固定値 | 制限値 |
|---|---|
| キュー数/リージョン | 無制限 |
| インフライトメッセージ数 | 120,000(標準)、20,000(FIFO) |
| バッチサイズ | 10メッセージ |
| 標準キュースループット | ほぼ無制限 |
| デッドレターキュー | 1/キュー |
| ハードリミット | 制限値 |
|---|---|
| メッセージサイズ | 最大256 KB |
| メッセージ保持期間 | 4日(デフォルト)、最大14日 |
| FIFOキュースループット | 300 TPS(デフォルト) 3,000 TPS(高スループット) |
| ロングポーリング時間 | 最大20秒 |
| 可視性タイムアウト | 0秒 - 12時間 |
AWS CLIのサンプルコード
パターン1: イベント駆動処理 EventBridge → SQS(DLQ付き)
DLQキューを作成する
aws sqs create-queue \
--queue-name eventbridge-target-queue-dlq
DLQ設定付きメインキューを作成する(DLQのARN、キュー属性ファイル名 指定)
eventbridge-target-queue-attributes.json
{
"RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:ap-northeast-1:123456789012:eventbridge-target-queue-dlq\",\"maxReceiveCount\":\"3\"}",
"VisibilityTimeout": "300",
"MessageRetentionPeriod": "345600"
}
aws sqs create-queue \
--queue-name eventbridge-target-queue \
--attributes file://eventbridge-target-queue-attributes.json
キューの一覧を表示する
aws sqs list-queues
キューを表示する(SQSのURL 指定)
aws sqs get-queue-attributes \
--queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/eventbridge-target-queue \
--attribute-names All
キューを削除する(SQSのURL 指定)
aws sqs delete-queue \
--queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/eventbridge-target-queue
EventBridgeがSQSを呼び出すことを許可するリソースベースポリシーを作成する
(SQSのURL、ポリシーファイル名 指定)
eventbridge-sqs-attributes.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sqs:SendMessage",
"Resource": "arn:aws:sqs:ap-northeast-1:123456789012:eventbridge-target-queue"
}
]
}
aws sqs set-queue-attributes \
--queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/eventbridge-target-queue \
--attributes file://eventbridge-sqs-attributes.json
イベントルールを作成する(イベントパターンファイル名 指定)
ec2-state-change-pattern.json
{
"source": ["aws.ec2"],
"detail-type": ["EC2 Instance State-change Notification"]
}
aws events put-rule \
--name my-sqs-rule \
--event-pattern file://ec2-state-change-pattern.json
ターゲットを追加する(ルール名、ターゲットファイル名 指定)
sqs-targets.json
[
{
"Id": "1",
"Arn": "arn:aws:sqs:ap-northeast-1:123456789012:eventbridge-target-queue"
}
]
aws events put-targets \
--rule my-sqs-rule \
--targets file://sqs-targets.json
パターン2: キュー配信 SNS → SQS(DLQなし)
メインキューを作成する(キュー属性ファイル名 指定)
sns-subscriber-queue-attributes.json
{
"VisibilityTimeout": "300",
"MessageRetentionPeriod": "345600"
}
aws sqs create-queue \
--queue-name sns-subscriber-queue \
--attributes file://sns-subscriber-queue-attributes.json
SNS Topic を作成する
aws sns create-topic \
--name my-notification-topic
SNSがSQSを呼び出すことを許可するリソースベースポリシーを作成する
sns-sqs-policy-attributes.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": "sqs:SendMessage",
"Resource": "arn:aws:sqs:ap-northeast-1:123456789012:sns-subscriber-queue",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:sns:ap-northeast-1:123456789012:my-notification-topic"
}
}
}
]
}
aws sqs set-queue-attributes \
--queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/sns-subscriber-queue \
--attributes file://sns-sqs-policy-attributes.json
SNSサブスクリプションを作成する(SNS Topic名、通知先エンドポイント 指定 指定)
aws sns subscribe \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:my-notification-topic \
--protocol sqs \
--notification-endpoint arn:aws:sqs:ap-northeast-1:123456789012:sns-subscriber-queue
パターン3: 非同期タスク分散 Lambda → SQS(DLQなし)
メインキューを作成する(キュー属性ファイル名 指定)
lambda-async-queue-attributes.json
{
"VisibilityTimeout": "300",
"MessageRetentionPeriod": "345600"
}
aws sqs create-queue \
--queue-name lambda-async-queue \
--attributes file://lambda-async-queue-attributes.json
実行ロールを作成する(信頼ポリシーのファイル名 指定)
lambda-trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name LambdaSQSSenderRole \
--assume-role-policy-document file://lambda-trust-policy.json
カスタム管理ポリシーを作成する(ポリシーファイル名 指定)
lambda-sqs-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sqs:SendMessage",
"sqs:GetQueueUrl",
"sqs:GetQueueAttributes"
],
"Resource": "arn:aws:sqs:ap-northeast-1:123456789012:lambda-async-queue"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-1:123456789012:*"
}
]
}
aws iam create-policy \
--policy-name LambdaSQSSenderPolicy \
--policy-document file://lambda-sqs-policy.json
実行ロールにポリシーをアタッチする(実行ロール名、ポリシーのARN 指定)
aws iam attach-role-policy \
--role-name LambdaSQSSenderRole \
--policy-arn arn:aws:iam::123456789012:policy/LambdaSQSSenderPolicy
Lambda関数デプロイパッケージを作成する(Lambda関数ファイル名 指定)
lambda_function.py
import json
import boto3
sqs = boto3.client('sqs')
QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/123456789012/lambda-async-queue'
def lambda_handler(event, context):
try:
# SQSにメッセージ送信
response = sqs.send_message(
QueueUrl=QUEUE_URL,
MessageBody=json.dumps(event),
MessageAttributes={
'Source': {
'StringValue': 'Lambda',
'DataType': 'String'
},
'Timestamp': {
'StringValue': context.request_id,
'DataType': 'String'
}
}
)
print(f"Message sent to SQS: {response['MessageId']}")
return {
'statusCode': 200,
'body': json.dumps({
'message': 'Message sent to SQS',
'messageId': response['MessageId']
})
}
except Exception as e:
print(f"Error: {str(e)}")
raise
zip function.zip lambda_function.py
Lambda関数作成(実行ロールのARN 指定)
aws lambda create-function \
--function-name my-sqs-sender \
--runtime python3.11 \
--role arn:aws:iam::123456789012:role/LambdaSQSSenderRole \
--handler lambda_function.lambda_handler \
--zip-file fileb://function.zip \
--timeout 30 \
--memory-size 128
CloudFormationのサンプルコード
Terraformのサンプルコード
料金計算
| 課金項目 | 説明 |
|---|---|
| リクエスト数 | API呼び出し回数 (最初の100万件は無料) |
| データ転送 | インターネットへのデータ転送 |
| FIFOキュー | FIFOキューのリクエスト料金 |