SQSにキューされるメッセージをサーバにポーリングして、コンソール上に自動表示させてみた。


やりたいこと

AWSのSQSヘキューされたメッセージをEC2へポーリングしてサーバのコンソール上に通知させたい。以前「AWSのboto3を使ってサーバのコマンド結果をメールに飛ばしてた。」を書きましたが、今回はその延長で。

方法

boto3を利用して、Linuxサーバ上(EC2上で)にスクリプトを作成・実行(スクリプト内容はのちほど)。

前提

※今回は以前作成した記事の延長で、サーバのコマンド結果がSNS経由でSQSへキューされることを前提としています。

  • EC2を立てる(ここでのサーバはRHEL系を想定してます。)
  • EC2にaws cli、python3、boto3のインストール。
  • aws configureでユーザ認証。
  • SQSでキュー作成。

コード

事前にSQSのURLを記載したiniファイル作成する。(スクリプトファイルにこれを記載する事も可能だとは思いますが、それを試す余裕がなかったのでQiitaの他記事を参考に今回作成してます。)

### config.ini (拡張子.iniファイル) ###
[sqs]
url :https://sqs.ap-northeast-1.amazonaws.com/9999999999/sqs_queue_test

そして、boto3を利用したスクリプトを以下のように作成。内容としては、SQSのキューにメッセージが受信される度(本スクリプトでは1分毎)に、ポーリング処理でサーバのコンソール上にそのメッセージを表示させる。メッセージは表示後に削除。

### receive_sqs.py ###

import configparser
import boto3
import json
import time

# configファイルの読み込み(iniファイルのパスを指定)
ini = configparser.SafeConfigParser()
ini.read("/XXXX/config.ini")
sqs = boto3.client('sqs')
url = ini.get("sqs", "url")

response = sqs.receive_message(
 QueueUrl=url,
 AttributeNames=[
 'SentTimestamp'
 ],
 MaxNumberOfMessages=1,
 VisibilityTimeout=0,
 WaitTimeSeconds=0
)

# キューの先頭にあるメッセージを表示・削除(ここでは1分毎にポーリング処理)
while True:
  message = response['Messages'][0]
  if message:
    print(message)
    receipt_handle = message['ReceiptHandle']
    sqs.delete_message(
      QueueUrl=url,
      ReceiptHandle=receipt_handle
      )
  time.sleep(60)

参考にしたもの

以下参考にさせていただきました。ありがとうございました。
CloudWatchからSNS→SQS、AWS SDK for RubyでQueue取り出し
Boto3(AWS SDK for Python)でSQSに送信したメッセージをLambdaでポーリングして受信してみた
AWS SDKでSQSをPythonで操作する