Python
AWS
EC2
sqs
boto3

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で操作する