【AWS】SQSをPythonで使ったメッセージキューを実装する方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

AWS SQSをPythonから使ってメッセージキューを実装する方法を知りたい」とお考えではありませんか?

処理を非同期化したいものの、SQSのAPI呼び出し方が分からず手が止まっている方は多いです。

SQSはboto3を使えば数行のコードでキューの作成・送信・受信・削除まで実装できます

いずみ

送信と受信の非対称な部分だけ押さえればすぐ使えるようになりますよ。

ということで、本記事ではAWS SQSをPythonで使ったメッセージキューを実装する方法を解説します。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【AWS】SQSをPythonで使ったメッセージキューを実装する方法

早速ですが、SQSをPythonで使ったメッセージキューの実装方法を解説します。

SQSとは

SQSはAWSが提供するフルマネージドのメッセージキューサービスです。

送信側と受信側の処理を切り離せるため、時間のかかる処理をバックグラウンドに逃がしたい場合によく使われます。

キューには標準キューとFIFOキューの2種類があり、順序保証や重複排除の要件に応じて使い分けます。

事前準備

PythonからSQSを操作するには、AWS公式のSDKであるboto3を使います。

STEP
boto3をインストールする

pipでboto3をインストールします。

pip install boto3
STEP
認証情報を設定する

AWS CLIのconfigureコマンドで、アクセスキーとシークレットキーを設定します。

aws configure

環境変数のAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYで設定することも可能です。

キューを作成する

まずはキューを作成します。

import boto3

sqs = boto3.client("sqs", region_name="ap-northeast-1")

response = sqs.create_queue(
    QueueName="order-queue",
    Attributes={
        "DelaySeconds": "0",
        "VisibilityTimeout": "30",
    },
)

queue_url = response["QueueUrl"]
print(queue_url)

create_queueメソッドを呼ぶと、キューのURLが返ってきます。

返ってきたキューのURLは、送信・受信・削除のすべての操作で使うので保存しておきます。

いずみ

VisibilityTimeoutは、メッセージを受信してから削除されるまでの間、他の受信処理に見えなくする秒数です。

処理に30秒以上かかるなら、もう少し長めに設定しておくと安全です。

メッセージを送信する

send_messageメソッドで、キューにメッセージを送信します。

response = sqs.send_message(
    QueueUrl=queue_url,
    MessageBody="注文データを処理してください",
    MessageAttributes={
        "OrderId": {
            "StringValue": "12345",
            "DataType": "String",
        }
    },
)

print(response["MessageId"])

MessageBodyには送信したい本文の文字列を、MessageAttributesには検索や振り分けに使う付加情報を設定します。

送信が成功すると、MessageIdが発行されます。

メッセージを受信する

receive_messageメソッドで、キューからメッセージを受信します。

response = sqs.receive_message(
    QueueUrl=queue_url,
    MaxNumberOfMessages=10,
    MessageAttributeNames=["All"],
    WaitTimeSeconds=20,
)

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

for message in messages:
    print(message["Body"])
    print(message["ReceiptHandle"])

WaitTimeSecondsに1以上の値を設定すると、ロングポーリングになります。

ロングポーリングを使うと、キューが空の間はAPI呼び出しを待機できるため、無駄なリクエスト回数を減らせます。

MaxNumberOfMessagesには、1回のリクエストで受信するメッセージ数の上限(最大10件)を指定します。

いずみ

受信したメッセージにはReceiptHandleが付いていますが、送信時のMessageIdとは別物です。

削除するときはReceiptHandleの方を使うので、混同しないように注意してください。

メッセージを削除する

処理が終わったメッセージは、delete_messageメソッドで削除します。

for message in messages:
    # メッセージの処理

    sqs.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=message["ReceiptHandle"],
    )

delete_messageを呼ばないと、VisibilityTimeoutで設定した秒数が経過した後に同じメッセージが再び受信されます。

処理の完了とメッセージの削除は、必ずセットで実装します。

FIFOキューを使う場合

メッセージの順序保証や重複排除が必要な場合は、FIFOキューを使います。

response = sqs.create_queue(
    QueueName="order-queue.fifo",
    Attributes={
        "FifoQueue": "true",
        "ContentBasedDeduplication": "true",
    },
)

fifo_queue_url = response["QueueUrl"]

sqs.send_message(
    QueueUrl=fifo_queue_url,
    MessageBody="注文データを処理してください",
    MessageGroupId="order-group",
)

FIFOキューを使う場合、キュー名は必ず「.fifo」で終わらせます。

送信時にはMessageGroupIdの指定が必須で、同じグループ内のメッセージだけ送信順序が保証されます。

いずみ

標準キューは順序が入れ替わったり重複配信されたりする可能性があるので、処理側を冪等に作っておくと安心です。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

MessageIdとReceiptHandleは何が違いますか?

MessageIdは送信時に発行される、メッセージ自体を識別するIDです。

ReceiptHandleは受信のたびに発行される値で、delete_messageやvisibility timeoutの変更で使います。

メッセージを削除し忘れるとどうなりますか?

VisibilityTimeoutで設定した秒数が経過すると、削除されなかったメッセージは再び受信可能な状態に戻ります。

結果として同じメッセージを二重に処理してしまう可能性があるため、処理側は冪等に実装しておく必要があります。

標準キューとFIFOキューはどちらを選べばいいですか?

順序保証や重複排除が不要で、大量のメッセージをさばきたい場合は標準キューを選びます。

注文処理のように送信順序を守りたい業務では、FIFOキューを選びます。

処理に失敗したメッセージはどうすればいいですか?

デッドレターキューを設定しておくと、規定回数だけ処理に失敗したメッセージを別のキューへ自動的に振り分けられます。

デッドレターキューに溜まったメッセージを個別に調査すれば、失敗原因の特定にも役立ちます。

まとめ

今回は、AWS SQSをPythonで使ったメッセージキューを実装する方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • boto3のクライアントがあれば、SQSのキュー作成から送受信・削除まで実装できる。
  • 削除にはMessageIdではなくReceiptHandleを使う点に注意する。
  • 順序保証や重複排除が必要ならFIFOキューを選ぶ。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次