Instagram Graph APIが突然死した件 - 2022/10/05


はじめに

まさかこんな短期間でまたこの表題のブログを書くことになるとは思っていなかったが、また突然死し始めたので記録として残しておく。やはり前回とは別件である。最初に書いておくと、今回も完全に原因がわかったわけではない。ただ発生した事象だけをあとで振り返ってみると、どうも問題の時間帯において一時的にInstagram側で動作が不安定になっていた事象(要するに障害と思しき何か)があったような気がしている。とりあえず書いてみる。


事象

2022/10/05 09:20(JST)にエラーが発生。目に見える範囲でのエラーはHTTP 400が返ってきているということだけであった。以下はエラーメッセージ

:{"message":"Request failed with status code 400","name":"AxiosError","config":{"transitional":{"silentJSONParsing":true,"forcedJSONParsing":true,"clarifyTimeoutError":false},"transformRequest":[null],"transformResponse":[null],"timeout":0,"xsrfCookieName":"XSRF-TOKEN","xsrfHeaderName":"X-XSRF-TOKEN","maxContentLength":-1,"maxBodyLength":-1,"env":{},"headers":{"Accept":"application/json, text/plain, /","User-Agent":"axios/0.27.2"},"method":"get","baseURL":"https://graph.facebook.com/","params":{"limit":"5","fields":"id,caption,media_type,media_url,children{id,media_url,media_type},permalink,timestamp","access_token":"xxx"},"url":"111/media"},"code":"ERR_BAD_REQUEST","status":400}  

同様のエラーが11:10まで10分毎に出続ける。なお10分毎というのは、Instagram Graph APIを使う俺の個人ツールが、単純に10分間隔で動いてるからという理由に過ぎず、Instagram側の事情によるものではない。ちなみに11:40になったらまたエラーが発生し、以後断続的にエラーが続く。こちらで確認している限りのエラー発生時刻は以下のとおりである。

  • 9:20 ~ 11:10まで10分毎に発生
  • 11:40
  • 12:20
  • 13:30
  • 15:00

エラーの発生は15:00を最後に止まっている。少なくとも10分間隔で動作するツールに対する修正や改修といった作業は、15時の時点では何も対処していないので、この時間に自然復旧していることになる。

調査1

仕事があった関係ですぐには調べられなく、ちょっと手が空いた隙に(11時過ぎくらい)調査してみたんだが、どうも/{ig-user-id}/mediaのリクエストパスにfieldsパラメータを付与するとエラーになるようだ、ということがわかった。要するに/{ig-user-id}/media?access_token=...&fields=id,captionみたいなリクエストをすると問答無用でエラーになる。逆にいうと、fieldsパラメータがついていないとなんのエラーもなくレスポンスが返ってきた(Media IDだけの単純な配列が返ってくるだけだが)。この状況から推察するに、「Instagramが/{ig-user-id}/mediaのパラメータからfieldsを使えないようにしちゃったんだ」というところに行き着くのは、ごく自然な発想だと思う。実際API Reference)にも「使える」とは書いていない。(まあそういわれてみると昔から書いてなかった気もするが)一方で、メディア単体に対するAPIである/{ig-media-id}パスに対しては、fieldsパラメータを付与したリクエストは指定した通りにレスポンスが返ってきた。しかもこっちにはAPI Referenceにfieldsパラメータの使い方の案内が明記されている。
まあそういうわけで、「Instagramが(少なくとも俺が知らない間に)勝手にAPIの仕様変えやがったらしい。仕方ねえ修正するしかねえか…」という対処法に行き着いた。状況証拠からして原因としては十分すぎるので、この対応方法が一番マトモだと思う。その時点では仕事してたのですぐに着手できなかったが、修正対応を施すことを心に決めていた。

対応

というわけで面倒くさいがプログラムを修正することにした。今までは/{ig-user-id}/mediafieldsパラメータで欲しい項目のリストを列挙して一気にメディアの情報を取得してきていたが、それができなくなったので、一旦/{ig-user-id}/mediaだけでMedia-IDのリストだけを取得し、取得したリストをforEachで回しながら、各Mediaに対して改めてもう1回/{ig-media-id}のリクエストを投げるように改修した。その際、/{id-media-id}にはもともと/{ig-user-id}/mediaにつけていたfieldsパラメータと同じ値を付与して、同様の項目が取得できることを確認した。
これのデメリットはAPIの発行回数が増えてしまうことである。今までは{ig-user-id}/media一発でできていたことが、取得したmediaの件数分追加で/{id-media-id}を呼び出す必要が出てくるわけなので、最低でも1回分増える。ただ、もともと俺専用のツールだし、短時間に100件や1000件も投稿するような運用もしてないし、というかほとんど10分以内に1件しか投稿しないので、平均1回APIの発行回数が増えるくらいならまあいいかと思って、完全に納得しているわけではないが、とりあえず修正してリリースした。これが10/5 18:30過ぎくらいのこと。テスト用に1件投稿してちゃんと動作したのを見届けて、一安心した。

調査2

しかしその後改めてエラーの発生状況を振り返ったら、少しおかしなところがあることに気づいた。というのも、上の「事象」で書いた通りで、11:10を最後に一旦エラーが止まって、11:20および11:30の回ではエラーが発生しなかった。で、11:40にまたエラーが発生した。しかしまたそこでエラーは止まり、12:20、13:30、15:00と断続的にエラーが起きる状況が続いた。
11:00過ぎ位の時点=上の「調査1」の段階で、「ツールのプログラムを修正するしかない」と心に決めていたので、その後に発生するエラーのことはあまり追跡していなかった(どうせ10分毎に律儀にエラー吐いてるんだろとしか思ってなく、いちいち見ていなかった)のだが、あとから改めてエラーの発生状況を見てみると、この状況が変だと気づいた。というのも、このツールというのは、処理内で必ず1回は/{ig-user-id}/mediaに対するGETを投げるので、上の「調査1」の推測の通り=つまり「/{ig-user-id}/mediafieldsパラメータつけてると死ぬ(ようになった)」が原因だとすると、11:10でエラーが止まるわけはなくて、11:20、11:30でもエラーが起きていないと逆におかしい話になるわけである。実際、10/5の19:00過ぎに試したときには、/{ig-user-id}/mediaへのリクエストは、fieldsパラメータの有無にかかわらず動作した。要するに11:00時点(上の「調査1」の段階)と19:00時点で状況が変わっていたのである。
このことから、この日2022/10/5に起きたエラーについては、上の「調査1」で結論付けた原因とは違うもので、単純にInstagram側が動作不安定な状況になる何らかの障害が発生していたのではないかと推測するに至った。ただ、Status Siteには特になんの情報もあがってないので、状況証拠からの推測である。全く違うところに原因がある可能性もあるし、正直原因の真相は謎のままだ。振り返ってみるとこの線が濃厚だ、というのが個人的な推理である。
ちなみにそうなると上の「対応」で行った改修作業は全く無駄なことになるわけだが(改修前の状態でも動作するので)、今更面倒なので改修後のコードのまま放置している。というか改めて考えると、/{ig-user-id}/mediaのAPI Referenceにfieldsのことが明記されていないことが本当に今さらながら気になり始めており、非公式というかdeprecateな機能なんじゃないかという不安が心をよぎった。公式に明記されていない機能が、動作上たまたま使える(ように見える)からといって、使っていいわけでもないんじゃないかと思い始めたのである。ただ、Instagram側が「使えるのにあえて明記していない」のか「公式に利用できる(けど俺がそれを読み落としているだけ)」なのか、その辺は分かっていない。ここはもう少し確認が必要かもしれない。

おわりに

というわけでひとまず対応完了である。色々右往左往したが現状は動く状態になっているのでまずは一安心である。ただ、いつまた起きるか分からないので油断はできない。短期間で2回も原因不明の問題が起きているので明日にでもまた違う問題でエラーになるかもしれないし、割と綱渡りの状態である可能性は大いにある。これぶっちゃけそういう感じだと個人が趣味でツールで利用する程度の感覚だと緊張感が足りないような気もしてきた。もっと気軽に使っていたいのが本音なところなのだが。。調査と対応が面倒なのでもう辞めて欲しいものだ…(まあCloud Platformに依存するツールは多かれ少なかれそういうリスクを抱えているものだが)
最後にこの日の不満スレッドをつなげておしまいにする。おつかれさまでした。