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のリファレンスを確認。
OpenSSL::Digest::SHA256
ruby 1.8.3 feature: システムにインストールされている openssl が 0.9.8 以降ならば以下のアルゴリズムも利用できます。
はて…たしか、その要件は満たしている気がするのだが…と思って確認。
% 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