Instagram Graph APIが突然死した件 - 2023/9/19


はじめに

タイトルの通りである。日本時間2023/9/19 4:20頃に突然死した。かつ、他シリーズ(2022/10/52022/09/21)と違って以後1週間経過しても復旧しない。 本格的に死んでしまったっぽいので、供養のために経緯を書いておく。


事象

2023/9/19 4:20の回でInstagram Graph APIの{ig-user-id}/mediaのリクエストが400エラーになった。表面的なエラーだけで見ると2022/10/5のエラーと似ている。

{"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}  

調査

POSTMANやグラフAPIエクスプローラーで実行したところ、以下のようなエラーが返却されることを確認。

{  
  "error": {  
    "message": "(#10) Application does not have permission for this action",  
    "type": "OAuthException",  
    "code": 10,  
    "fbtrace_id": "AX..."  
  }  
}  

パーミッションが不足している?? しかし、Instagram Graph APIのドキュメント見る限り、必要なパーミッションは揃えてユーザーアクセストークンを発行している。 にも関わらずこのエラーになる。 なんで??

以下のようなことを調べたが、いずれも原因特定に至らず。

  • アクセストークンデバッガーで見てみたが、有効期限内・かつパーミッションは揃っている。
  • 開発者ポータルのアラートを見たが特に対応が必要そうな内容なし。(※)
  • {ig-user-id}/media以外のリクエストパスも試したが、いずれも同じエラー - "(#10) Application does not have permission for this action",が返却される。
  • Instagram Graph APIのstatusページには特に障害情報について掲載がない。
  • Twitterで検索しても同じ事象に悩まされてる人を見かけない。どうでもいいけど相変わらずInstagram Graph APIの利用者人口が少なすぎる。。Twitterで検索するとまず俺の投稿が出てくるのは虚しい。。
  • Developer Communityで似たようなこと質問してる人がいたのでちょっと聞いてみたんだが、この人の遭遇してる事象は500エラーなので、俺の事象(400エラー)とは異なるようだ。

(※)

開発者ポータルのアラートの中に気になるアラートがあって、それがこの「Facebookビジネスログイン」というやつなのだが。

これがなんだかまるでわかってないんだが今までこういうのがあった記憶はないのと、元に戻せそう(「Facebookログインに切り替える」というのがそれに該当する?のではないかと勝手に解釈して)なので、とりあえずやってみた。 このアラートのボタンリンクからも飛べるけど、リンク先のドキュメントに「Facebookログインへの切り替え方法」が載っている。それにしたがって戻す

が、結果は変わらずエラーだった。そもそもなんだよこのFacebookビジネスログインって。。。

結論

現時点で俺が知り得る情報からは原因が特定できないため、俺に非はない=Instagram側がなんか仕様の変更かなんかやったんだろう、と結論付けるに至った。 要するに復旧は無理だと結論づけた。 だってなんだかよくわかんねえんだもん。。 そのうち同じような問題で悩んでる人とか出てくるかもしれないし、なんならInstagram(Facebook)からも何か情報告知があるかもしれないし、しばらく様子見しよう、と思うことにした。 消極的な態度だが。。

対処

Instagramからデータ抜いてくる処理を10分に1回Lambdaで動かしているのだが、この処理がエラーになると俺のslackで俺宛てにメンションが発生するようになっている(エラー検知の仕組み)。 が、この状況だと10分に1回、毎回毎回俺宛てにエラーのメンションが発生するので、うざくてかなわない。 仕方ないのでLambdaのスロットルを0にして起動を停止した。 これによりInstagram->Twitter(X)へのデータ連携の個人ツールは突然の運用終了を迎えた。 今までの経緯からいってTwitter APIの仕様変更で死ぬだろうと思ってたが、まさかInstagram側の都合で死ぬことになるとは想定してなかった。。 まあスロットル0にしただけでLambda関数自体は残してあるので、いずれ原因が特定できて復旧できたら再開したいとは思っているが。 現時点では見通し立っていない。

余談

もともと

  1. Instagramからデータ抜く
  2. TwitterのOAuth Tokenを取得してTwitterにPOST
  3. TwitterのOAuth Tokenをrefreshする

という処理になっていたんだが、3.を(厳密に言えば2.のOAuth Tokenを取得する部分も)別のLambda関数に分離した。 というのも、今回の騒ぎにより、1.が死んでTwitter のOAuth Token更新ができずに滞ってしまったからだ。 TwitterのOAuth Tokenは7200秒(2時間)で有効期限が切れるので、今回の騒ぎで一度OAuth Tokenがexpireしてしまった。 InstagramもTwitterも問題なく動作してるうちはいいんだが、こういうことがあると一気に運用が崩れる。 よく考えればもとからそういう構成にしておいたほうが良かったんだが、今まで、InstagramかTwitterのどちらかが一時的死ぬことはあっても、そのうち自然復旧してたので、あまり問題視してなく、それが仇になった。 これで、Instagramの状況に関わらずTwitterのOAuth Tokenは独立して更新され続けており、少なくともTwitter のOAuth Tokenの更新運用は継続できる形に整った。 Github ActionsでLambdaにdeployする方法や、エラー時のslackメンションの仕組みなど、運用的な側面の処理は流用できたので、わずか1時間程度で全て完璧に構築できたのは結構感動だった。 ま、おおもとの問題が解決してないので嬉しさ半分って感じではあるんだが。。

おわりに

そんなわけで原因不明のエラーが続いてる状況は変わらずだ。 気持ち悪いけどこればっかりに構ってられないので、気になる情報はウォッチするつもりだが基本的に静観することにする。 何か進展があったらまたブログにします。 フウ。