at posts/single.html

Apache モジュール版の Amazon API 認証プロキシを作ったよ

Amazon の Web サービス API が、8月中旬から署名付きのリクエストしか受け付けなくなるとのこと。

これに対して、オープンソースとして配布するソフトの利用者が不便になるとの指摘がある。

さらに、指摘するだけではなくて、認証を代行するプロキシを用意するというアクションまで起こされている。素晴らしい。 このプロキシを経由すれば、既存のスクリプトでも修正せずに新しいAPIに対応できる。

現在では、複数のプロキシを束ねるリバースプロキシまで登場している。

少しでもお手伝いできればと思って、この Amazon API 認証プロキシを Apache モジュールに移植した。 自分でもプロキシサーバを立てて、上記のリバースプロキシに登録している。 今のところ、エラー無しで動いているみたい。

ソースコード

GitHub - mod_amazon_proxyで公開。 Apache モジュールに詳しい人にチェックしてもらえると助かるなぁ…。

  • クエリストリングの解析と URI エンコードのために、 Apache のApache HTTP Request Library (mod_apreq2)に依存しています。
  • Apache2.2でテストしています。2.0で動くかどうかは不明です。

Apache モジュールで動かす利点

第1にパフォーマンス。 Amazon API のプロキシは利用者が増えると負荷が大きくなることが予想されるので、速いに越したことはない。 ab コマンドを使って、たださんの CGI 版プロキシと比較してみた。

CGI 版
Concurrency Level:      1
Time taken for tests:   1.830 seconds
Complete requests:      20
Failed requests:        0
Write errors:           0
Non-2xx responses:      20
Total transferred:      10432 bytes
HTML transferred:       40 bytes
Requests per second:    10.93 [#/sec] (mean)
Time per request:       91.492 [ms] (mean)
Time per request:       91.492 [ms] (mean, across all concurrent requests)
Transfer rate:          5.57 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:    90   91   1.9     91      99
Waiting:       89   90   2.1     90      99
Total:         90   91   1.9     91      99
Apacheモジュール版
Concurrency Level:      1
Time taken for tests:   0.013 seconds
Complete requests:      20
Failed requests:        0
Write errors:           0
Non-2xx responses:      20
Total transferred:      21720 bytes
HTML transferred:       10580 bytes
Requests per second:    1571.59 [#/sec] (mean)
Time per request:       0.636 [ms] (mean)
Time per request:       0.636 [ms] (mean, across all concurrent requests)
Transfer rate:          1666.74 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     0    0   0.2      0       1
Waiting:        0    0   0.2      0       1
Total:          0    1   0.2      1       1

20リクエストを処理するのにCGIで1.8秒がApacheモジュールで0.013秒だった。だいたい100倍くらい速い。

Apache モジュールで動かす欠点

CGI より敷居が高いことかな。 Amazon の API は1秒に1回しか使えないらしいので、たくさんの人がプロキシサーバを立てないと辛くなる。 レンタルサーバで動く CGI のほうが、たくさんの人に参加してもらえる。

インストール方法

Apacheモジュールなので、Apacheを操作できる権限 (通常は root 権限) が必要。

以下のコマンドでコンパイルとインストールする。 apxsコマンドが無い場合は、 apache2-devel パッケージなどが必要かも。

apxs -c mod_amazon_proxy.c
sudo apxs -i mod_amazon_proxy.la

次に、添付の httpd-amazon-proxy.conf.sample にて Amazonのキーを設定する。 ここでは /amazon_proxy をエンドポイントにしている。 複数のロケールに対応する場合は、 Location をコピーして AmazonEndPoint を書き換える。

LoadModule apreq_module modules/mod_apreq2.so
LoadModule amazon_proxy_module modules/mod_amazon_proxy.so

<Location /amazon_proxy/ja>
        AmazonAccessKey your_access_key
        AmazonSecretKey your_secret_key
        # AmazonDefaultAid your_aid_if_you_want  # optional
        AmazonEndPoint webservices.amazon.co.jp
  SetHandler amazon_proxy
</Location>

この設定ファイルを、 httpd.conf からインクルードする。

include conf.d/httpd-amazon-proxy.conf

最後に Apache を再起動すればOK.