Amazonアソシエイト API エラー

【ESXi&kusanagi】Amazonアソシエイト 広告が表示されない… ※解決済【The request has not been correctly signed】

はじめに

タイトルの通りなのですが、サーバーリプレース後Amazonアソシエイト広告が何故か表示されない状態となっておりました。

その原因特定が、一般人には中々困難だと思われたので、その情報を記載しておこうと思います。
※同様の情報は調べても出てきませんでした。

事象

WPアソシエイトポストR2で設定したAmazonの広告が表示されない

元々何も無かったかのように、広告が表示されなくなりました。
HTMLタグをブラウザで眺めてみても、そもそも要素が存在しません。

この時点で、おそらくphp側(サーバーサイド)で表示する処理が動いていないと考えました。

なお、原因切り分けのため、楽天の広告で確認しましたが、楽天は通常通り表示できていたため、

[A.当サイト(リクエスト)]→[B.AmazonのAPI(レスポンス)]→[C.当サイト]→[D.広告表示]

の間のどこかに問題があると考えました。

管理画面でAmazonの商品を検索できない

Amazon Product Advertising API(商品情報API)へ接続できないようで、下記エラーが表示されていました。

Amazonアソシエイト API エラー メッセージ

エラーが発生しました。
The request has not been correctly signed. If you are using an AWS SDK, requests are signed for you automatically; otherwise, go to https://webservices.amazon.co.jp/paapi5/documentation/sending-request.html#signing. (InvalidSignature)

以上より、広告表示に関係するかは置いておいて、商品検索時は以下で問題が発生していることを察することができました。

[A.当サイト(リクエスト)]→[B.AmazonのAPI(レスポンス)]→※このあたりで問題?→[C.当サイト(広告検索)]

原因調査・切り分け

この時点で分かっている状況

Amazonアソシエイト API エラー 整理 図解

KixiのWebサーバーからのリクエストが受け付けられず、認証エラーになっている。

確認①:同様の事象で困っている人はいないか?

まずは、Amazonの障害ではないか、Twitterで確認します。
→障害の場合は、こちらでできることは無いのでそのまま寝るしかありません。

なければ、特定の条件で発生するケースもあるので、インターネットで検索して同じ内容で困って解決した人が居ないか調べます。

Kixiが調べた感じだと、基本的に「アクセスキー」「シークレットキー」の入力ミスの事象しか出てきませんでした。
※AWSの認証関係でも同様の事象で困っている方がいましたが、アクセスキーの再生成で解決したとありました。
 上記すでに試していて未解決だったため、関係なしと判断しました。

確認②:AmazonのAPIへ接続が可能か?

Amazonアソシエイト API エラー 接続確認

そもそも私のアクセスキーが、何らかの理由でAmazonから弾かれている可能性もあったため、
Amazonが用意している開発者用のAPI確認サイトから動作確認を行いました。

こちらは、正常に接続できました。

正常に接続できなかった場合は、

  1. アクセスキー再発行
  2. 「1.」でダメならAmazonへの問い合わせ

が必要になると思います。

以上より

当サイトの環境からのみ以下のタイミングでエラーが発生していることが分かりました。

Amazonアソシエイト API エラー 整理 図解 特定①

他サイト(Amazonのテストサーバー)からはうまくいったので、
当サイトからのリクエストが不正
っぽいところまでは、絞り込みができましたね。

確認③:プラグインの問題か、原因切り分け

自分のAmazonアソシエイトのAPIキーが利用できることがわかったため、当サイト側の調査に範囲を絞り込みます。

WPアソシエイトポストR2の問題かどうかの切り分けのため、別のプラグイン(KixiはRinkerを使用)で、AmazonAPIとの通信が行えるか確認しました。

結果は、同様のエラーが発生し、プラグインの不具合では無い事が分かりました。

Amazonアソシエイト API エラー 整理 図解 特定②

赤枠の箇所があやしくなってきた

補足

念のため先程のAmazonのAPI通信のページにあった、サンプルプログラムとプラグインのソースを見比べて、
接続情報(URLや暗号化の仕様等)に更新が無いかを念のため確認しました。

確認④:サーバー側の設定を確認

このあたりは完全にエスパーですが…

認証周りでは、システム日時を使う事が多々あります。
Esxiでは、UTCの時間がVMへ連動されるため、基本的には各VM上で UTC+9をして日本時間にした上で動かしております。

NTPでの設定も行っておりましたが、何故かkusanagiは一瞬でBIOSの日時に更新されるようです。
上記のため気付いておりませんでしたが、BIOSの日付がズレており、それが原因では無いかとあたりをつけて対応しました。

確認した内容…

kusanagiにSSHで接続し、現在日時を表示すると案の定BIOSの分ずれています。
NTPの設定がすでにしてあり、サービスを再起動すると一瞬だけ正常な日時に戻る事を発見。
→なに起因かは不明ですが、数分程度でBIOSの時間に上書きされます。
 時間のズレが大きいと、そちらを優先するのだと思います。

サーバーのシステム日時が正常な状態で
・サイトを見ると広告が表示されている!
・商品検索も行える!

事を確認し、原因の特定に至りました。

原因特定!

以上の調査より、BIOS上のシステム日時をUTCに合わせて設定したところ、無事広告が表示されるようになりました。

発生事象整理

Esxi仮想化基盤:UTC (誤差+1.5h) → kusanagi(UTC+1.5h) + JST 9h
→この現在時刻+1.5時間のシステム日時をベースにAPIのリクエストを作成していた。

Amazon側の詳しい仕様は不明だが、システム日時が異常なものは、認証を通さないチェックがあると思われ、単純に

The request has not been correctly signed
(リクエストは正しく署名されていません)

とエラーメッセージが帰ってきたと思われます。

ヒントが少なすぎる!!!!

原因がすごくわかりやすい図

最後に

多分ほとんどいないとは思いますが…Esxiでkusanagi生やしている人がいて、同様の事で悩んでおりましたら、参考になればと思います。

ざっくりまとめると…!

とりあえず試す内容

  1. アクセスキー/シークレットキーの確認・再発行
  2. サーバーのシステム日時の確認

ですね…。

ここにAmazonの広告を貼っておきます。
これを表示するために、数時間調査を粘ったと思って、万感の思いで眺めてください。

それでは。