ソースを張っておきますので、ご自由にお使いください。動作無保証です。未実装のメソッドもあります。テストも不完全です。無い無い尽くしでアレですが、ご自身の責任範囲でお使いください。
本来であればGitHubからForkさせるべきなんでしょうけど、使い方を把握していないので・・すみません・・
※注:すでに同じ様な事やってらっしゃる方がいました。http://github.com/bemurphy/right_aws/blob/add_sns/lib/sns/right_sns_interface.rb
require "right_aws" module RightAws class SnsInterface < RightAwsBase include RightAwsBaseInterface DEFAULT_HOST = 'sns.us-east-1.amazonaws.com' DEFAULT_PORT = 443 DEFAULT_PROTOCOL = 'https' DEFAULT_PATH = '/' API_VERSION = '2010-03-31' @@bench = AwsBenchmarkingBlock.new def self.bench_xml; @@bench.xml; end def self.bench_sns; @@bench.service; end # Creates new RightSns instance. # # Example: # # sns = RightAws::SnsInterface.new(aws_access_key_id, aws_secret_key) # def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={}) params.delete(:nil_representation) init({ :name => 'SNS', :default_host => ENV['SNS_URL'] ? URI.parse(ENV['SNS_URL']).host : DEFAULT_HOST, :default_port => ENV['SNS_URL'] ? URI.parse(ENV['SNS_URL']).port : DEFAULT_PORT, :default_service => DEFAULT_PATH, :default_protocol => ENV['SNS_URL'] ? URI.parse(ENV['SNS_URL']).scheme : DEFAULT_PROTOCOL, :default_api_version => API_VERSION }, aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'], aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY'], params) end #-------------------- # APIs #-------------------- def add_permission() raise 'Sorry! Not Implemented!' end def confirm_subscription() raise 'Sorry! Not Implemented!' end def set_topic_attributes(topic_arn, attribute_name, attribute_value) request_params = {'TopicArn' => topic_arn, 'AttributeName' => attribute_name, 'AttributeValue' => attribute_value} link = generate_request("SetTopicAttributes", request_params) result = request_info(link, QSnsSetTopicAttributesParser.new(:logger => @logger)) return result rescue Exception on_exception end def get_topic_attributes(topic_arn) request_params = {'TopicArn' => topic_arn} link = generate_request("GetTopicAttributes", request_params) result = request_info(link, QSnsGetTopicAttributesParser.new(:logger => @logger)) return result rescue Exception on_exception end def create_topic(topic_name) request_params = {'Name' => topic_name} link = generate_request("CreateTopic", request_params) result = request_info(link, QSnsCreateTopicParser.new(:logger => @logger)) return result rescue Exception on_exception end def delete_topic(topic_arn) request_params = {'TopicArn' => topic_arn} link = generate_request("DeleteTopic", request_params) result = request_info(link, QSnsDeleteTopicParser.new(:logger => @logger)) return result rescue Exception on_exception end def list_topics(next_token = nil ) request_params = {'NextToken' => next_token} link = generate_request("ListTopics", request_params) result = request_info(link, QSnsListTopicsParser.new(:logger => @logger)) # return result if no block given return result unless block_given? # loop if block if given begin # the block must return true if it wanna continue break unless yield(result) && result[:next_token] # make new request request_params['NextToken'] = result[:next_token] link = generate_request("ListTopics", request_params) result = request_info(link, QSnsListTopicsParser.new(:logger => @logger)) end while true rescue Exception on_exception end def subscribe(topic_arn, protocol, endpoint) request_params = {'TopicArn' => topic_arn, 'Protocol' => protocol, 'Endpoint' => endpoint} link = generate_request("Subscribe", request_params) result = request_info(link, QSnsSubscribeParser.new(:logger => @logger)) return result rescue Exception on_exception end def unsubscribe(subscription_arn) request_params = {'SubscriptionArn' => subscription_arn} link = generate_request("Unsubscribe", request_params) result = request_info(link, QSnsUnubscribeParser.new(:logger => @logger)) return result rescue Exception on_exception end # return {:subscritions => []} def list_subscriptions(next_token = nil ) request_params = {'NextToken' => next_token } link = generate_request("ListSubscriptions", request_params) result = request_info(link, QSnsListSubscriptionsParser.new(:logger => @logger)) # return result if no block given return result unless block_given? # loop if block if given begin # the block must return true if it wanna continue break unless yield(result) && result[:next_token] # make new request request_params['NextToken'] = result[:next_token] link = generate_request("ListSubscriptions", request_params) result = request_info(link, QSnsListSubscriptionsParser.new(:logger => @logger)) end while true rescue Exception on_exception end # return {:subscritions => []} def list_subscriptions_by_topic(topic_arn, next_token = nil ) request_params = {'TopicArn' => topic_arn, 'NextToken' => next_token} link = generate_request("ListSubscriptionsByTopic", request_params) result = request_info(link, QSnsListSubscriptionsParser.new(:logger => @logger)) # return result if no block given return result unless block_given? # loop if block if given begin # the block must return true if it wanna continue break unless yield(result) && result[:next_token] # make new request request_params['NextToken'] = result[:next_token] link = generate_request("ListSubscriptionsByTopic", request_params) result = request_info(link, QSnsListSubscriptionsParser.new(:logger => @logger)) end while true rescue Exception on_exception end def publish(topic_arn, subject, message) request_params = {'TopicArn' => topic_arn, 'Subject' => subject, 'Message' => message} link = generate_request("Publish", request_params) result = request_info(link, QSnsPublishParser.new(:logger => @logger)) return result rescue Exception on_exception end #-------------------- # Requests #-------------------- def generate_request(action, params={}) #:nodoc: generate_request_impl(:get, action, params ) end # Sends request to Amazon and parses the response # Raises AwsError if any banana happened def request_info(request, parser) #:nodoc: request_info_impl(:sdb_connection, @@bench, request, parser) end #-------------------- # PARSERS: #-------------------- class QSnsCreateTopicParser < RightAWSParser #:nodoc: def reset @result = {} end def tagend(name) case name when 'TopicArn' then @result[:topic_arn] = @text when 'RequestId' then @result[:request_id] = @text end end end class QSnsDeleteTopicParser < RightAWSParser #:nodoc: def reset @result = {} end def tagend(name) case name when 'RequestId' then @result[:request_id] = @text end end end class QSnsListTopicsParser < RightAWSParser #:nodoc: def reset @result = { :topics => [] } end def tagend(name) case name when 'NextToken' then @result[:next_token] = @text when 'TopicArn' then @result[:topics] << @text end end end class QSnsSubscribeParser < RightAWSParser #:nodoc: def reset @result = {} end def tagend(name) case name when 'SubscriptionArn' then @result[:subscription_arn] = @text when 'RequestId' then @result[:request_id] = @text end end end # same with QSnsDeleteParser... class QSnsUnubscribeParser < RightAWSParser #:nodoc: def reset @result = {} end def tagend(name) case name when 'RequestId' then @result[:request_id] = @text end end end class QSnsListSubscriptionsParser < RightAWSParser #:nodoc: def reset new_member() @result = {:subscriptions => [] } end def tagend(name) case name when 'NextToken' then @result[:next_token] = @text when 'TopicArn' then @member[:topic_arn] = @text when 'Protocol' then @member[:protocol] = @text when 'SubscriptionArn' then @member[:subscription_arn] = @text when 'Owner' then @member[:owner] = @text when 'Endpoint' then @member[:endpoint] = @text; @result[:subscriptions] << @member; new_member(); end end private def new_member @member = {:topic_arn => '', :protocol => '', :subscription_arn => '', :owner => '', :endpoint => ''} end end class QSnsPublishParser < RightAWSParser #:nodoc: def reset @result = {} end def tagend(name) case name when 'MessageId' then @result[:message_id] = @text when 'RequestId' then @result[:request_id] = @text end end end # same with QSnsDeleteTopicParser... class QSnsSetTopicAttributesParser < RightAWSParser #:nodoc: def reset @result = {} end def tagend(name) case name when 'RequestId' then @result[:request_id] = @text end end end class QSnsGetTopicAttributesParser < RightAWSParser #:nodoc: def reset @result = {:attributes => []} end def tagend(name) case name when 'key' then @key = @text when 'value' then @result[:attributes] << {:key => @key, :value => @text} when 'RequestId' then @result[:request_id] = @text end end end end end