LoginSignup
3
4

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

Last updated at Posted at 2018-10-31

やりたいこと

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.ConfigParser()
ini.read("/XXXX/config.ini")

sqs = boto3.client('sqs')
url = ini.get("sqs", "url")

# キューの先頭にあるメッセージを表示・削除(ここでは1分毎にポーリング処理)
while True:
    response = sqs.receive_message(
        QueueUrl=url,
        AttributeNames=['SentTimestamp'],
        MaxNumberOfMessages=1,
        VisibilityTimeout=0,
        WaitTimeSeconds=0
    )

    if 'Messages' in response and response['Messages']:
        message = response['Messages'][0]
        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で操作する

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4