SQS

【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キューに溜まっているメッセージ数
NumberOfMessagesMovedToDLQDLQへ移動したメッセージ数
NumberOfMessagesReturnedByDLQDLQから戻されたメッセージ数

制限値(固定値/ハードリミット/ソフトリミット)

固定値制限値
キュー数/リージョン無制限
インフライトメッセージ数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キューのリクエスト料金
料金計算ツール

公式ページ

AWSドキュメント SQS