PA-API v5が429エラーにしかならない件

PA-API v4 が 3月9日 で終了するという通知が着たので、v5に移行すべく作業。

1. v5用の新しいアクセスキーを作成
2. スクラッチパッドでテスト

すると、一発目で下記のエラーが・・・

```
Error! TooManyRequests
The request was denied due to request throttling. Please verify the number of requests made per second to the Amazon Product Advertising API.
```

一応、cURL とか PHP with SDK / without SDK とか、一通り試してみたけど、だめ。

```
HTTP Status: 429: Too Many Requests
```

というわけで、長い長い戦いが・・・

# 状況

たぶん長くなるので、現在の状況をまとめておきます。

* 仕事で使っているアカウント
* 売上はある
* 同じアクセスキーを使って v4 のスクラッチパッドでは結果が取れる
* 何をやっても解決しなかったが 2/21 の朝頃突然解消
* 原因不明・なぜ解決したのかも不明

というわけで、
**2020.3.1 現在、特に問題なく使えるようにはなっています**が、なぜ発生していた問題なのかは謎。

ネットで見かける「最初ダメだったけど気がついたら治った」的な状況に近いと言えば近いですが、使えない期間がひと月程度あったので、ちょっと違うのかなと。

ちなみに、正常稼働している状態でも、タイミングによっては 429 エラーが発生することはあります。

なので、429 は発生する前提でスクリプトなどは組んでおいた方が無難かなと。
とは言っても、数回リトライすれば解消する程度なので、今回発生した問題とは根本的に異なるとは思いますが。

## 売上はある

現象として一番可能性が高いのは「売上がない」ために「リクエスト回数が無い」というものですが、一応仕事で使っているアカウントで、売上はそこそこあります。

> PA-APIより取得した商品リンクより発生した、過去30日間の発送済み商品売上$0.05（日本円で約5円）ごとに1リクエスト追加
[Product Advertising API 利用ポリシーの変更について](https://affiliate.amazon.co.jp/help/node/topic/GW65C7J2CSK7CA6C)

こちらの記載に従って計算すると、一日に4万回程度はリクエストできる売上が PA-API v4 経由であります。

## サポートに問い合わせるも・・・

技術的な問題なら頑張れるのですが、入り口でコケてるので問い合わせるしか無いのですが、実は日本語でのサポートは受け付けてくれません。

> 何かご質問がある場合、paapi5@amazon.comまでメールをするか（英語のみのご対応になります）、 FAQ（英語版） をご確認ください。

とのこと。

一応メールしたのですが、数日経っても返信なし。

なので日本のサポートに問い合わせました。

が、現時点では解決策は提示されず。

返信の内容と、実際の現象に矛盾が有るので、そこを整理したいと思い質問を繰り返しているのですが、途中から

> PA-APIのご質問を承っておりますが、PA-APIはセルフサービスである点をご理解願います。
よって、今後浮かんだPA-APIに関する疑問点は引き続き下記のメールアドレス宛にお送りいただくようお願いします。
paapi5@amazon.com

となってしまいました。

[OLP](https://www.amazon.jobs/jp/principles)とは・・・

> Ownership
リーダーにはオーナーシップが必要です。リーダーは長期的な視野で考え、短期的な結果のために、長期的な価値を犠牲にしません。リーダーは自分のチームだけでなく、会社全体のために行動します。リーダーは「それは私の仕事ではありません」とは決して口にしません。

はい、頑張ります。

## リトライしまくっても変わらない

サポートとのやり取りは下にまとめてあるので暇な人は見てもらえると助かりますが、PA-APIを叩いたときに429エラーが出ている原因は「同時にアクセスされている数（ユーザー単位の話ではない）が単純に多いから」なので「リトライを繰り返せばそのうち成功する」という回答をもらいました。

> 売上に応じたリクエスト可能数があったとしても、「PA-APIはあくまでも先着順」となります。
特に、PA-APIの新しいバージョンについてはお客様同様、3月の完全移行に向けて使用を試すユーザーも多くなっていると思われますので、アクセスが成功しづらくなっているという状態であるかと存じます。
上記の点を何卒ご理解の上、お客様のリクエスト可能な範囲でリクエストを送信し続けていただきますようお願いいたします。

こんな回答。

なので、429が返ってきたらリトライするような感じでスクリプト書いて試してみようと思って書いたのが下記の php のスクリプト。

```php
do {
    $paapi = paapi("u2");

    if ($paapi["http_response_header"][0] != "HTTP/1.1 429 Too Many Requests") {
        //  429 以外なら抜ける
        break;
    }

    $i++;
    echo $i;
    print_r($paapi["http_response_header"]);
} while ($i < 1000);
```

`paapi`関数が PA-API v5 にリクエストを投げる関数で、引数はキーワード。（この場合は u2 を検索してます。）

こんな感じで、1000回ぶん回してみました。
が、見事に 429 が出続けて終わり。

という感じで、タイミングの問題では無さそう。

本当に先着順だとしたら、めちゃくちゃシビア。

# サポートとのやり取り

長くなるので履歴のようなものはこちらにまとめます。

## スクラッチパッドでエラーが出たよなんで？

初回の問い合わせです。

> アクセスキーを作成して、スクラッチパッドで試そうとしたら一発目で下記のようなエラーが出たよ。

```
{
"__type": "com.amazon.paapi5#TooManyRequestsException",
"Errors": [
{
"Code": "TooManyRequests",
"Message": "The request was denied due to request throttling. Please verify the number of requests made per second to the Amazon Product Advertising API."
}
]
}
```

これに対しての回答。

> メッセージが表示される状態はAPIのサーバーに複数の同時アクセスがあり、先着順で接続処理が行われ、その中で接続出来なかった方に表示されるものとなります。
> つまり、お客様以外にも多数のお客様がPA-APIのリクエストを試みている場合は上記メッセージは出やすくなるかと存じます。
アソシエイト・プログラムアカウントの売り上げ数に依る、1日のリクエスト可能数をご理解の上、上記メッセージが返却・表示された場合は、再度リクエストを送信いただきますようお願いいたします。

最初は、
「私の使っているアカウントで発行されたアクセスキーを使って他の人がアクセスしていて、そのリクエストが多すぎてエラーが発生している。」
と解釈したのですが、どうやら違うようです。

## 同時アクセスの先着順の範囲は「全ユーザー」！！

というわけで、「アクセスキーは私しか使ってないですよ。」と指摘したことに対しての返信がこちら。

> PA-APIの利用者すべてを指します。

え？どういうこと？

アカウントごとの話じゃないの？
売上と関係ないの？

って念を押したところ、下記の返事。

> 恐れ入りますが、PA-API は日本国内だけではなく世界中のユーザー様から毎秒大量のリクエストを受信しております。また、その際の同時アクセス数によっても下記のエラーが返ってまいります。

へ？

> 売上に応じたリクエスト可能数があったとしても、「PA-APIはあくまでも先着順」となります。
特に、PA-APIの新しいバージョンについてはお客様同様、3月の完全移行に向けて使用を試すユーザーも多くなっていると思われますので、アクセスが成功しづらくなっているという状態であるかと存じます。
上記の点を何卒ご理解の上、お客様のリクエスト可能な範囲でリクエストを送信し続けていただきますようお願いいたします。

うそー

どうすんのこれ？

この時点で、50回以上リクエストしていて、一度も成功してないんですよw

リトライしろって、何回くらいで成功するんだよw

## 429エラーもリクエスト回数に含まれるの？

こうなったら、リソースの許す限りリトライし続けるしか無いわけですが、そうなると気になるのが、
**429エラーが発生したリクエストも一日のリクエスト回数に含まれるのか？**
です。

というわけで、「リクエスト回数を消費するか？」と聴いてみました。

> 「消費される」かと存じます。

うーん、困った。

という事は、闇雲にリトライし続けるわけにも行かないですね・・・

## 嫌がられ始める

この辺りから、「対応外だから」的な指摘が。

> 誠に申し訳ございませんが、PA-APIはシステム開発者などの専門的な知識を持つユーザー様向けのサービスとなっております。
>
このため、PAAPIはセルフサービスでのご利用を前提としており、不明点がある場合も、ユーザー様ご自身で解決をいただくことを前提に提供しており、カスタマーサービスでのサポートは行っておりません。何卒ご容赦いただきますようお願いします。

うん、分かるけど、一行目いる？

言いたいことは分かる、でもね情報がないのよ。

なので
「そもそも、内部の仕様の話じゃんね、仕様書にも書いてないし、分かるわけないよ。
仕様が公開されてるなら、教えてよ。」
っと書いた結果、返ってきたのが以下のコメント。

>
今後は下記の開発者フォーラムなどをご活用いただきますようお願いいたします。
https://forums.aws.amazon.com/forum.jspa?forumID=19
https://forums.aws.amazon.com/forum.jspa?forumID=9

ええ、フォーラムで解決するなら書きますよ。

でもね、去年の10月の時点で[似たような質問](https://forums.aws.amazon.com/thread.jspa?messageID=922082)が書かれてるけど、11月くらいからアップデートされてないんだよね。

というわけで、「フォーラムでも解決してないよね？」っと指摘。

それに対しては。

> PA-APIのご質問先については下記のページの下部にある「paapi5@amazon.com」（英語のみのご対応になります）もございますので、ご質問送信のご検討をお願いいたします。
>
https://affiliate.amazon.co.jp/help/node/topic/GZBFW3F79Y7FADBL/

とのこと。

はい、出てきました
paapi5@amazon.com

でも、これ、メールしてるけど返事こないんだよ。

とお伝えすると、

> お待たせをしており、申し訳ございませんが、すでにご質問を送信済みということであれば、このまま返信をお待ち願います。

とのこと。

本当に？
返信くるの？

## リクエストが通らないのは「バグではなく仕様」

いくらなんでも数十回実行して一度も成功しないのはバグでしょ？っと指摘したところ。

> リクエストが通らない、あるいは、通りづらいのは不具合ではございません。

とのこと。

> PA-API は世界中から毎秒大量のリクエストを受信中
リクエスト可能範囲内でも、上記の世界中からの同時アクセス数によっては承れない場合があるため、エラーが返ります(PA-APIは先着順)

だそうです。

そして

> リクエストの成功率を上げるためには、より多くの売り上げを発生させ、リクエスト数を上げていくほかございません。

うーん、つまり4万回実行するしか無いってこと？

そのうちどの程度が429になるか分かりませんが、100回以上手動でリトライしても、一度も結果が取得できないのですが。

## 先着順って本当なの？

フォーラムなどで質問した結果、すでに v5 に移行しているユーザーは現時点でも普通に v5 のスクラッチパッドでエラーにならないということはわかっているので、「先着順」って本当なのかな？っと思い質問中です。

いつものように、まともな返事は返ってこないのですが、

> これまでのやり取りで出てきている「先着順」という言葉の意味を正確に教えていただけないでしょうか？
>
ある瞬間（ms単位の期間があるのかもしれませんが）に同時にAPIに到達したリクエストの中から、先着で処理するリクエストが選ばれ、溢れたリクエストがToo Many Requestsとしてエラーが発生しているというのが認識でした。

という質問に対して

>
恐れ入りますが、文字通り「先着順」としか申し上げようがございません。つまり、二行目の認識(リクエストの中から、先着で処理するリクエストが選ばれ、溢れたリクエストがToo Many Requests)であっているかと存じます。


という回答。

でも、

> アカウントA：PA-APIv5で正常にレスポンスが取得できるアカウント
アカウントB：PA-APIv5が429エラーしか返却しないアカウント

が存在しているわけです。

んで、この2つのアカウントに関しては、同じタイミングでPA-APIにリクエストを行っても、結果が異なることはわかってるんですよね。

まぁ、実際に見ていないので分かりませんが、仮に v5 に移行済みのユーザー全てでこの確率でエラーが発生していたら、大問題になっていると思うので、アカウント毎に現象が違うのかなと。

となると、
> 二行目の認識(リクエストの中から、先着で処理するリクエストが選ばれ、溢れたリクエストがToo Many Requests)であっているかと存じます。

この表現は実際の現象とは違うよねと。

という辺りが現在地。

何でしょうね、これ月曜日くらいからやってるので、今週これで潰れてるんですけど、なんとかして欲しいです。

## たらいまわしの果てに

結局、日本のサポートに問い合わせても先に進まなそうだったので、USの窓口に問い合わせたり、 paapi5@amazon.com にメールを打ったりしました。

が、USのサポート的には
> アカウントが JP だから日本のカスタマーサポートに連絡して。

で終わり。

paapi5@amazon.com は一月以上待っていますが、一度も返信はありません。

たぶん2通以上はメール書いたはず。

英語が破綻していたんでしょうか・・・

無念。

で、そのことを踏まえつつも日本のサポートと堂々巡りのやりとりを繰り返しつつ、4秒に一度リトライとかする感じで、1日2万回弱リクエストし続けるような状態で数日回し続けてました。

が、結果は変わらず。

その間、
> 1万回以上実行してるけど、429しか返ってこないけど、本当に動いてるの？

っと聞いたのですが、
> 100万円以上の売り上げがあるお客様でも 429 エラーは発生するのでとにかくリトライしてください。

的な、回答をもらい、心が折れそうになりながらもリトライを続けていました。

もうそろそろタイムリミットが近づいてきたので、PA-APIを使うのを諦めて別な解決策を模索しないとなと感じていた 2/21（金）頃、突然リクエストが成功するようになりました。

以後、手動で数回試した限り、ほぼ全て成功。

429 エラーはほぼ起きなくなりました。

## エラーの原因を確認したい

現象としては回復しましたが、一応自社のサービスで利用している仕組みに組み込んでいるので、このままではまずい。

さすがに、
> よくわからないけど復活しました！

では済ませられないので、原因を確認してみたところ。

> メインアカウントを変更したから

っという指摘をいただきました。

確かに、アソシエイトのメインアカウントが、個人のアドレスに紐づいおり、今回の PAAPI の件など、重要な通知を見逃してしまう可能性があったあので、1月末にメインアカウントを共有のアカウントに変更しました。

が、これが原因だとしたら、PA-API を利用中のユーザーは、メインアカウントを変更できないことになりますよね。

数日程度ならまだ考えられるかもしれませんが、1ヶ月程度利用できない可能性があるとなると、ほぼ無理じゃないかなと。

「メインアカウントを変更すると PAAPI のリクエストが通らなくなる」なんて話は、どこにも書かれていないのでサポートに念を押して確認しました、が。
> 特別サイト上に記載をさせていただいているものではございませんが、以前同様の報告がございましたので、ご案内をさせていただきました。
そのため、メールアドレスを変えることは避けていただき、引き続き、リクエストをお試しいただきたく存じます。

とのことです。

まぁ、もうここまで言われたら信じるしかないので、PA-API を使う場合には メインアカウントの変更は障害を伴う可能性があることを覚悟した上で行わないとダメなようです。

## 429 の原因は結局なんだったのか？

ここまでの状況をまとめると、以下のような感じ。

- PAAPI v5に対して何をリクエストしても Too Many Requests (429) となってしまう
- 4万回/日、程度のリクエストが可能な売り上げはある
- 数万回リトライし続けても 429 エラー以外返却されない
- リクエストしてもエラーにしかならない状態は少なくとも2週間は続いている
- 或る日(2020/2/21)突然解消した

この状況から考えて、下記の質問をしました。

> 状況から考えて、おそらく今回の障害は貴社側でなにか設定変更や機能追加が行われて解消されたと考えておりますが、根本的な原因を教えていただけますでしょうか。

当然ですよね、エラーが解消したのは嬉しいですが、根本的な原因がわからないので、今後も発生する可能性があるのかどうか分からない。

その状態でサービスに利用するのは非常にリスクが高いです。
使い続けるにしても、きちんと理解する必要があります。

ですが、予想通り下記のような回答が返ってきました。

> これまでのご案内の通り、PA-APIは世界中から毎秒大量のリクエストを受信しているため、429/Too Many Requestsは発生するものとなりますので、システム障害ではございません。
また、PA-APIにつきましてはカスタマーサービスではサポートしておりません。そのため、429エラーが発生することがなくなった件も含めて、ご回答は行っておりませんことをご了承ください。

でしょうね。
っという感じ。

本当に問題を理解してくれているのか・・・

ここからさらに頑張るか、悩ましいところですが、頑張れたら頑張ろうかなと。