fine, later feeling

晴れのち気分

pythonからElasticMQにメッセージキューイングする

プロジェクトではAmazon SQSを使ってます。

開発環境でAmazonSQSを使うとお金がかかるのでAmazonSQS互換のElasticMQというScala製のメッセージキューを使ってます。

github.com

ロングポーリングするバックグラウンドで動くプログラムをScalaで作ってるのですが、デバッグ用にjson形式でエンキューするスクリプトが欲しかったのでささっと作りました。 AWS SDKはbotoを使ってます。

# botoのインストール
$ sudo yum install pip
$ pip install boto

デバッグ用のスクリプトはこれ。
ElasticMQに投げる場合は、AWSアクセスキー/シークレットアクセスキーは適当な文字列入れておけばOKです。
いじるのはキュー名とエンドポイントくらいだと思います。

elasticmq_test.py

# -*- coding: utf-8 -*-                                     
                                                            
from boto.sqs import regioninfo                             
from boto.exception import SQSError                   
from boto.sqs.message import RawMessage                     
                                                            
def post_mq(message):                                       
                                                            
    AWS_ACCESS_KEY='dummy_access_key'                       
    AWS_SECRET_KEY='dummy_secret_key'                       
                                                            
    queue_name = 'your_queue_name'               
    name = "elasticmq"                                      
    endpoint = "localhost"                                  
                                                                                     
    fake_region = regioninfo.SQSRegionInfo(name=name, endpoint=endpoint)
                                                            
    # コネクション作成                                              
    conn = fake_region.connect(                             
        aws_access_key_id=AWS_ACCESS_KEY,                   
        aws_secret_access_key=AWS_SECRET_KEY,               
        port=9324,                                          
        is_secure=False                                     
    )                                                       
                                                                                                 
    queue = conn.get_queue(queue_name)                      
                                                            
    try:                                                    
        # キューにメッセージを投入                                      
        queue.write(RawMessage(body=message))               
    except SQSError, e:                                     
        print e.status, e.reason, e.body                    
                                                            
                                                            
if __name__ == "__main__":                                  
    import sys                                              
    import json                                             
    message = ""                                            
                                                            
    if len(sys.argv) != 2:                                  
        print "usage: python elasticmq_test.py hogehoge.json" 
        sys.exit(1)                                         
                                                            
    f = open(sys.argv[1], 'r')                              
    message = json.load(f)                                  
    json_string = json.dumps(message)                       
                                                            
    post_mq(json_string)                                    

実行の仕方は

$ python elasticmq_test.py hogehoge.json

メッセージの最大サイズがたしか256KBとかだったので、バカでかいjsonを送ろうとすると死にます。