botoでElasticMQに繋ぐ
Amazon SQS のローカルでの代用。
boto の connect_to_region 使った方法はよく出てくるけど、
ローカルの ElasticMQ だと regioninfo.SQSRegionInfo で繋がないとならないので、それのメモ書き。
is_secure を True にすると https になるらしい。
準備
ElasticMQ は落としてきて起動しておく。
デフォルトならポートは9324かな。
$ java -jar ~/opt/elasticmq-server-0.8.8.jar
送るやつ
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from boto.sqs import regioninfo
from boto.sqs.message import Message
AWS_ACCESS_KEY = 'TEST'   # EMQならなんでもいい
AWS_SECRET_KEY = 'TEST'   # EMQならなんでもいい
SQS_REGION     = "emq"         # EMQならなんでもいい
SQS_ENDPOINT   = "localhost"
# AWSの場合
# SQS_REGION = "ap-northeast-1"
# SQS_ENDPOINT = "sqs.ap-northeast-1.amazonaws.com"
SQS_QUEUE_NAME = 'dev_messages'
PORT = 9324     # AWSなら80 / もしくは指定しない
region = regioninfo.SQSRegionInfo(name=SQS_REGION, endpoint=SQS_ENDPOINT)
conn = region.connect(
        aws_access_key_id=AWS_ACCESS_KEY,
        aws_secret_access_key=AWS_SECRET_KEY,
        port=PORT,
        is_secure=False
    );
queue = conn.create_queue(SQS_QUEUE_NAME)
msg = Message(
    body='QUEUE TEST',
)
msg.message_attributes = {
        "name1": {
            "data_type": "String",
            "string_value": "I am a string"
        },
    }
queue.write(msg)
受けるやつ
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from boto.sqs import regioninfo
from boto.sqs.message import Message
AWS_ACCESS_KEY = 'TEST'   # EMQならなんでもいい
AWS_SECRET_KEY = 'TEST'   # EMQならなんでもいい
SQS_REGION     = "emq"         # EMQならなんでもいい
SQS_ENDPOINT   = "localhost"
# AWSの場合
# SQS_REGION = "ap-northeast-1"
# SQS_ENDPOINT = "sqs.ap-northeast-1.amazonaws.com"
SQS_QUEUE_NAME = 'dev_messages'
PORT = 9324     # AWSなら80 / もしくは指定しない
region = regioninfo.SQSRegionInfo(name=SQS_REGION, endpoint=SQS_ENDPOINT)
conn = region.connect(
        aws_access_key_id=AWS_ACCESS_KEY,
        aws_secret_access_key=AWS_SECRET_KEY,
        port=PORT,
        is_secure=False
    );
queue = conn.get_queue(SQS_QUEUE_NAME)
queue.set_attribute('ReceiveMessageWaitTimeSeconds', 20)
import json
msgs = queue.get_messages(10)
for msg in msgs:
    print json.dumps(msg.__dict__, default=str)
    queue.delete_message(msg)