Amazon 互換 API を超簡単に作れる sinatra エクステンションを作った

一見釣りエントリっぽいタイトルのようでごく一部の人にしか刺さらない感が満載ですが、タイトル通りの sinatra エクステンションを作成して公開しました。

gem install sinatra-ace でインストールできます。(ace というのは Amazon Compatible Environments の略で、Transcend Computing | Amazon Compatible Environment で使われていたのをそのまま使っている感じです。)

下記のようなコードを書いて ruby app.rb するだけで、

require 'sinatra'
require 'sinatra/ace'

action 'DescribeDreams' do
  response_xml do |xml|
    xml.Dreams do
     %w(NiceDream Nightmare DayDream).each {|member| xml.member member }
    end
  end
end

dispatch!

下記のような AWS っぽいたいへんな感じの XML を返却できます。

$ curl "http://localhost:4567/?Action=DescribeDreams"
<?xml version="1.0" encoding="UTF-8"?>
<DescribeDreamsResponse>
  <DescribeDreamsResult>
    <Dreams>
      <member>NiceDream</member>
      <member>Nightmare</member>
      <member>DayDream</member>
    </Dreams>
  </DescribeDreamsResult>
  <ResponseMetadata>
    <RequestId>3f5a54f4-2781-4903-98e4-8977cdc184ef</RequestId>
  </ResponseMetadata>
</DescribeDreamsResponse>

Version パラメーターによる挙動の切り分けも簡単に行えます。

require 'sinatra'
require 'sinatra/ace'

version '2014-06-18' do
  action 'GetMessage' do
    response_xml do |xml|
      xml.Message 'old version'
    end
  end
end

version '2014-07-12' do
  action 'GetMessage' do
    response_xml do |xml|
      xml.Message 'new version'
    end
  end
end

dispatch!
$ curl "http://localhost:4567/?Action=GetMessage&Version=2014-06-18"
<?xml version="1.0" encoding="UTF-8"?>
<GetMessageResponse>
  <GetMessageResult>
    <Message>old version</Message>
  </GetMessageResult>
  <ResponseMetadata>
    <RequestId>d98216a5-19bc-476c-99ab-ea377c284a9b</RequestId>
  </ResponseMetadata>
</GetMessageResponse>
$ curl "http://localhost:4567/?Action=GetMessage&Version=2014-07-12"
<?xml version="1.0" encoding="UTF-8"?>
<GetMessageResponse>
  <GetMessageResult>
    <Message>new version</Message>
  </GetMessageResult>
  <ResponseMetadata>
    <RequestId>0c7085ba-f4d5-4d1f-928b-0971e85e57ee</RequestId>
  </ResponseMetadata>
</GetMessageResponse>

Amazon SQS のようにリクエストパスの概念があるシステムも記述することができるのですが、この機能については q3/lib/q3.rb#L60 あたりを見ると使い方が分かると思います。

自分で作りたいもので必要がでてきたら、認証機能とか最近の AmazonJSON っぽい API にも対応していきたいと思います。
たまには REST ではなく Amazon 互換っぽいインタフェースでオレオレ API を作ってみると、荘厳な感じになっておもしろいんじゃないかと思います。