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で操作する
Author And Source
この問題について(SQSにキューされるメッセージをサーバにポーリングして、コンソール上に自動表示させてみた。), 我々は、より多くの情報をここで見つけました https://qiita.com/himanande/items/89ea1b75dc63c4b09d80著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .