AmazonAPIを使ったRubyアプリでSecret Access Key対応してなかったのでその改修

AmazonAPIを使ったRubyアプリでSecret Access Key対応(2009/08/15にすでにAPI変更された)してなかったのでその改修。環境でちょとハマったので、履歴。

とりあえずRubyのAmazonAPIラッパであるruby-aawsを0.7.0にupdate。READMEを読んで、~/.amazonrcにSecret Access Key設定を入れるも、ruby-aaws-0.7.0/test配下のテスト(ts_aws.rb)でEEEEEってなって盛大にコケる。

まあまずは試しにとサンプルRequestをirbで作ってみるが、HTTP Response Error 400番で落ちる。クエリがちゃんと作れてないらしい。ruby-aaws-0.7.0を眺めてるとdprintfにいろいろ出しているようなので、irbやら%ruby -d test.rbとかでデバグメッセージを読むと


#<Amazon::AWS::Search::Request:0x88caf5c

@encoding=nil,

@tag="XXXXXXXXX-22",

@config={"secret_key_id"=>"XXXXXXXXXX", "cache"=>"false", "key_id"=>"XXXXXXXXXX", "locale"=>"jp", "associate"=>"XXXXXXXXXX-22"},

@api=nil,

@key_id="XXXXXXXXXX"

@conn=nil,

@cache=nil,

@locale="jp",

@user_agent="Ruby/Amazon/AWS 0.7.0"

設定ファイルはちゃんと読めているようだがSHA256利用の判別で落ちている。


require 'openssl'

    DIGEST_SUPPORT = OpenSSL::Digest.constants.include?( 'SHA256' ) ||   OpenSSL::Digest.constants.include?( :SHA256 )

このへん。Rubyのリファレンスを確認。


ruby 1.8.3 feature: システムにインストールされている openssl が 0.9.8 以降ならば以下のアルゴリズムも利用できます。
OpenSSL::Digest::SHA256

はて…たしか、その要件は満たしている気がするのだが…と思って確認。


% ruby -v

ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-freebsd6.1]

→Good


% openssl

OpenSSL> version

OpenSSL 0.9.8e 23 Feb 2007

→Good


% irb

irb(main):001:0> require 'openssl'

=> true

irb(main):002:0> OpenSSL::Digest

=> OpenSSL::Digest

irb(main):003:0> OpenSSL::Digest::SHA256

NameError: uninitialized constant OpenSSL::Digest::SHA256

from (irb):3

→Bad

openssl自体は呼べるようだが、SHA256が定義されていない模様。


irb(main):004:0> require 'openssl/digest'

=> false

OpenSSL::Digest::SHA は?


irb(main):005:0> OpenSSL::Digest::SHA

=> OpenSSL::Digest::SHA

SHA224 SHA256 SHA384 SHA512 がない。openssl が 0.9.8 以降とrubyにみなされてないっぽい。最近さくらのOSがリファインされて今のOpenSSLのバージョンになったのかもというわけでrubyの同じバージョン1.8.7の最新パッチレベルを再インストール。


http://www.ruby-lang.org/ja/news/2009/12/25/ruby-1-8-7-p248-/

$ cd ~/local/src

$ curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p248.tar.gz

$ tar xvfz ruby-1.8.7-p248.tar.gz

$ cd ruby-1.8.7-p248

$ ./configure --prefix=$HOME/local

$ make && make install-all

ついでに、Rubyにiconv,readlineも念のため組み込みして概ね動いた。


■iconv-ruby

$ cd ext/iconv

$ ruby extconf.rb --with-iconv-dir=/usr/local

$ make && make install


■readline-ruby

$ cd ../readline

$ ruby extconf.rb

$ make && make install