amazon-ecsを使った検索のエラー原因を確認する

公開日: : 最終更新日:2014/09/06 Ruby , , ,

Amazon が提供しているサービス Product Advertising API を手軽に扱える Ruby の gem に amazon-ecs があります。

この amazon-ecs が面倒な処理を受け持ってくれるおかげで、利用者は「検索結果を使ってゴニョゴニョするだけ」で何かいいものが作れちゃったりします。

大変ありがたい amazon-ecs なんですが、個人的に検索に失敗した場合のエラー出力が貧弱だなと思っていて、ムダに試行錯誤したことが何度かあります。

で、偶然にもエラーの原因を発見する方法が分かったので手順をメモしておきます。

icatch_474695210

photo credit: Mr. Theklan via photopin cc

目次

1. amazon-ecs を実行している環境について

amazon-ecs を実行している環境は、64 ビット版の CentOS 6.5 です。VMware の仮想環境上に “Minimal” でインストールしました。

CentOS インストール後の環境構築や、Ruby と amazon-ecs のインストールは次の記事にまとめてあるので、興味があれば見てみてください。

2. amazon-ecs を使って検索に失敗してもエラーの原因が分かりにくいのがツラい

amazon-ecs を実行してみます。

$ sample.rb
/hoge/vendor/bundle/ruby/2.1.0/gems/amazon-ecs-2.2.5/lib/amazon/ecs.rb:130:in `send_request': HTTP Response: 400 Bad Request (Amazon::RequestError)
        from /hoge/vendor/bundle/ruby/2.1.0/gems/amazon-ecs-2.2.5/lib/amazon/ecs.rb:107:in `item_lookup'
        from sample.rb:112:in `lookup'
        from sample.rb:43:in `exe'
        from sample.rb:120:in `<main>'

“400 Bad Request” と表示されるだけで、何が原因で失敗したのかさっぱり分かりません。

何も分からないので「もうちょっとヒントくれー」とか思いながらエラーメッセージで検索したり、闇雲に試行錯誤してハマるってのが、これまでのパターンでした。

でも、これからは次の方法を使ってもうちょっとスマートに解決できそうです!

3. デバッグモードで実行すると、リクエストした URL が分かる!

何かヒントはないかと GitHub に登録されている amazon-ecs のテストコード を眺めていると次のコードを見つけました。

# To print debug information
# Amazon::Ecs.debug = true

amazon-ecs には「デバッグモード」が実装されているようで、これを有効にして実行するとデバッグログが出力されるようです。
さっそくデバッグモードを有効にして実行すると、次のように出力されました(一部伏せ字にしてあります)。

$ sample.rb
Adding AWSAccessKeyId=xxx
Adding AssociateTag=xxx
Adding ItemId=4894712288
Adding Operation=ItemLookup
Adding ResponseGroup=ItemAttributes, SalesRank, Images
Adding Service=AWSECommerceService
Adding Timestamp=xxx
Adding Version=2011-08-01
Request URL: http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=xxx&AssociateTag=xxx&ItemId=4894712288&Operation=ItemLookup&ResponseGroup=ItemAttributes%2C%20SalesRank%2C%20Images&Service=AWSECommerceService&Timestamp=xxx&Version=2011-08-01&Signature=xxx
/hoge/vendor/bundle/ruby/2.1.0/gems/amazon-ecs-2.2.5/lib/amazon/ecs.rb:130:in `send_request': HTTP Response: 400 Bad Request (Amazon::RequestError)
        from /hoge/vendor/bundle/ruby/2.1.0/gems/amazon-ecs-2.2.5/lib/amazon/ecs.rb:107:in `item_lookup'
        from sample.rb:112:in `lookup'
        from sample.rb:43:in `exe'
        from sample.rb:120:in `<main>'

ここで注目したいのは、amazon-ecs がリクエストした URL も出力されているってところです。この URL にアクセスすれば、Amazon の Product Advertising API にリクエストした実行結果が分かります。

さっそくブラウザからアクセスしてみると、次のように表示されました(一部伏せ字にしてあります)。

<?xml version="1.0"?>
<ItemLookupErrorResponse xmlns="http://ecs.amazonaws.com/doc/2011-08-01/"><Error><Code>RequestExpired</Code><Message>Request has expired. Timestamp date is xxx</Message></Error><RequestId>xxx</RequestId></ItemLookupErrorResponse>

期限切れなリクエストらしいです。

そこで、、、リクエストの期限が切れている → 時間が過ぎてしまっているってことか? → とにかく時間に問題があることは分かった! → ところで、この環境の時刻は正確なのか?、って流れで推測して date コマンドを実行すると、確かに時刻がズレてました。。。自動で合わせてくれるはずなんだけど。。。

時刻がズレた原因は後で調べるとして ntpdate -bv ntp.nict.jp を実行した後に、改めて amazon-ecs で商品検索してみると見事に商品情報が取得できました。

4. まとめ

以上、amazon-ecsを使った検索のエラー原因を確認する方法でした。

  • amazon-ecs にはデバッグモードが存在する
  • デバッグモードを有効にして実行すると、リクエストした URL が確認できる
  • ブラウザからその URL にアクセスすると、 Amazon のサービスが返すエラーの原因が分かる

5. その他 Ruby に関する。。。

その他の Ruby に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

パーフェクトRuby (PERFECT SERIES 6)

  • 著者Rubyサポーターズ
  • 価格¥ 3,456(2014/09/06 時点)
  • 出版日2013-08-10
  • 商品ランキング8704 位
  • 大型本640 ページ
  • ISBN-104774158798
  • 出版社技術評論社

小学生から楽しむ Rubyプログラミング

  • 著者(株)まちづくり三鷹
  • 価格¥ 1,944(2014/09/06 時点)
  • 出版日2014-07-19
  • 商品ランキング71897 位
  • 大型本128 ページ
  • ISBN-104822297470
  • 出版社日経BP社

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

with_index メソッド

with_index というメソッドを知ったのでメモ。どういうときに使うかのサンプルを載せておく。

記事を読む

icatch_4081722858-resized

CentOSにRubyのBundlerをインストールして使い始める人向けの簡単なまとめ

Bundler を使ってないと環境を移したときに面倒だってことが身に染みて分かったので Bundle

記事を読む

no image

amazon-ecs を使って Amazon から関連商品情報を取得するサンプル

次のサンプルスクリプトを書いたが、これに続くもの。 amazon-ecs を使って Amazon

記事を読む

no image

amazon-ecs を使って Amazon から商品情報を取得するサンプル

次の仕事で使うことになるかもしれないので、どんなことができるのか調査したときに作成したスクリプト。

記事を読む

no image

配列の内容をファイルに書き込む

Ruby で書いたスクリプトを module 化していく試みの一貫です。 Array に保持してい

記事を読む

no image

Redcarpet を使って Markdown をパースする

Ruby から Redcarpet を使って Markdown をパースしてみた。 せっかくなので

記事を読む

icatch_100612765-resized

CentOSのバージョン6.5(64ビット)にRuby2.1.2をインストールする

2014/08/10 時点での最新安定版である Ruby 2.1.2 をインストールしてみたので、そ

記事を読む

no image

VPS に Nokogiri をインストールしたときのトラブル

Bundler を使って Nokogiri をインストールしようとしたが、次のようにエラーメッセージ

記事を読む

no image

ファイルを読み込んでその内容を保持する

Ruby で書いたスクリプトを module 化していく試みの一貫です。 ファイルを読み込んで、そ

記事を読む

no image

プログラミングの「面倒くせー」を減らす試み

プライベートで書くコードや、ちょっとしたスクリプトなんかは Ruby で書くようにしていますが、どう

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


− 3 = 一

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑