Ekasiliconのゴミ捨て場

ゴミがあります。そこに。

Misskeyでbotを暴走させてしまったときの後始末

私はMisskey(≠ Misskey.io )で半分身内のサーバーを運営しており、そこでbotを実行させています。botといってもそこまで大きなものではなく(私がオリジナルを作ったわけではないのですが)、特定のRSSを定期的に取得し、新着情報を配信するようなものです。

しかしながら、2月3日から4日にかけてこの botを暴走させてしまい、少なくとも2時間で700以上の公開投稿を行ってしまいました 。ここではその顛末と後始末に関して簡単に書いていこうかと思います。

暴走を止める

3日午後、botが突如大量の投稿を行い始めました。その数はわずか10秒余りの間に400弱。当然ながらフォロワーの方のタイムラインを一瞬で埋め尽くしてしまいました。恥ずかしながら実行している最中にその挙動に関して気づくことが出来ず、暴走が始まってから30分程度経ってから気づきました。

原因として思い当たるのはその数時間前、RSSの作成を行う際の処理に小さな変更を加えたことでした。それぞれのentryの時刻に関して、これまでは日付までの取得を行い、日本時間の9時にそろえていました。しかしながら、若干不便であるため、時刻を新しいentryの存在を認知した際の時刻にすることにしました。これ単体に関しては大きな問題はありませんでした(若干の問題はありましたが、そこまで大きくない)。しかし先述の問題が発生してしまったのです。このbot

  • 情報を取得し、RSSに加工する部分
  • 加工したRSSを用いてMisskeyに投稿する部分

が(歴史的な理由もあり)分離されています。それぞれが(意図的にずらされた)特定のタイミングに動作し、新着情報を適切に提供していました。反対に言えばRSSに加工する部分の変更が「下流」たるMisskeyに投稿する部分に影響を及ぼしてしまったのです。

詳細な理由は調査していないのであまり分かっていないのですが、Misskeyに投稿する部分においてフィードの解釈に誤りが生じ(タイムゾーンの設定を深く考えていなかったこともあって)、フィード中全ての投稿が新着の情報であると判断してしまったものだと思います。元となるRSSフィードは最新10件などではなく、取得可能な全データをフィード中に含めていましたので、それは膨大な数となってしまいました。

追記: 既にフィードとして配信済みのものに関しても認知した際の時刻にしたことで、既存のものであるとの認識に失敗したかも…という話もあります。

また、この調査を行っている最中にMisskeyに投稿する部分が再度動作してしまい、 意図せず問題を再来させ、被害を2倍にしてしまいました 。これは意思疎通の過程に問題があり、問題の発生を食い止めるためリバートを行った際、双方に誤認識が発生していた(リバートPRを立てた方はもう1人が実行するのだと思い、もう1人の方は立てた本人が自ら実行するものだと思っていた)ものだと思います。ある種の「障害対応」でしたので、適切に状況を認識することの大切さというのを認識する(?)必要を改めて感じました。

被害を2倍にしてからこれに気づき、即リバートが行われ、一旦は暴走が止まりました。暴走を止めるためにはアカウントを一旦ストップするなどの方法がありましたが、あまり本質的ではないと考えて行いませんでした。後から振り返ってみると、確かに本質的な問題解決手法ではないものの、問題を再来させることを防ぐためには有効な対策ではあるので、出来ることはやったほうがよかったのかなと思っています。

バッチファイルを用いて削除

暴走を止めたところで、既存のノートは残ってしまいます。Misskeyにおいて管理者権限を持っていたとしても既存のノートを削除するというのは普通のユーザーと大して変わらない労力が求められます。「いつからいつまでの、このユーザーの投稿をまとめて削除!」というような便利な機能はありません。アカウントごと削除することは出来ますが、このような事態においては不適切です。

というわけでえーあいに書かせたバッチファイルを用いて削除させます。先に当該botアカウントにログインし、 「アカウントの情報を見る」及び「ノートを作成・削除する」の権限を持ったアクセストークンを生成 しておきます。これを変数の形でバッチファイルに渡します。

ただえーあいはMisskeyのAPIに関して詳しいわけではないため、人によっては自分で書いた方がよっぽど早いと思います。特に v12以前とv13以降ではAPIの構造が大きく変わっている ことを認識出来ていない可能性が極めて高いですので、明示的に指示をしてあげる必要があるかと思います。ただ私は眠かったためえーあいに書いてもらいました。具体的には

  1. 初めに最新の投稿1つを取得し、それを削除させることを行わせ、
  2. 次に新着順で投稿を取得し、一覧表示させ、
  3. 特定の時間以降の投稿を取得できることも確認し、
  4. 特定の時間から特定の時間までの投稿を、順繰りに削除させる

といった、ステップを踏んだ形でえーあいにバッチファイルを書かせました。1~3の条件が満たせていないとどう考えても事故が発生してしまうので、丁寧に(?)確認を行いました。またMisskeyサイドでのリクエスト上限に関してもこれを把握し、実行させる必要があります。これは人間が調べた方が速いと思います。

また、 「レートリミット」を緩和したロールを設定し当該アカウントに付与 します。レートリミットは(なぜかよく分からないのですが)値を小さくすると緩和されます。このようにすると429エラーを発生させずに効率よく削除することが出来ます。

連合先に影響を及ぼす操作ではあるので、時間帯などを考慮しつつ慎重に行いました。無事削除が終わりましたので、トークンなどは無効化を行い、取り敢えずの後始末は終わりました。

まとめ

というわけでMisskeyでbotを誤って暴走させてしまったときの後始末に関する記事でした。きちんと動作を確認していないものを実戦投入するのが悪い…と言えばそれはそうなのですが、万が一暴走させてしまったときの後始末に関して大まかにまとめました。万が一暴走させてしまったときの後始末に困るかもしれない方の参考になればと思います。