pyspa-bot移行作業報告

f:id:shiumachi:20211128154841j:plain
Photo by Alex Kotliarskyi on Unsplash

この記事はpyspa アドベントカレンダー 2021の4日目です。昨日は@kumagiでした。

pyspa-botとは?

pyspa-botは、pyspaのSlackチャンネル内で稼働しているbotです。

様々な機能があって全てを説明することは難しいので省略します。一部の機能については以下の記事で触れているのでそちらを読んでください。(当時はvoluntas-botと呼んでいましたが、今はpyspa-botと呼ばれています)

shiumachi.hatenablog.com

初期バージョンが開発されてから10年以上の歴史が経っています。

2010年頃にDjango Appとして動作するSkype Botとして初期バージョンが稼働しました。(当時のpyspaはSkypeでチャットしていました)。これを便宜上バージョン1とします。

2013年頃にSlackに移行したタイミングでSkype BotがSlackにも対応するようになりましたが、開発者の@moriyoshitが個人でメンテナンスしてたこともあり、落ちたら誰も起動できなくなるなど、保守上の問題がありました。

そこで2016年に、私をはじめとした数名で、Django依存をなくし、rtmbotをベースにしたチャットボットシステムに移行しました。これを便宜上バージョン2とします。

pyspa-bot ver.2 の現在の技術概要

  • python-rtmbot ベースのbotサーバ
  • Python 3.8 (ver.2 移行時は3.6だったが一度アップグレードを実施)
  • DBはSQLiteを使用(これはver.1時代のものをそのまま流用)
  • Google Cloudで稼働 (初期の頃は無料マイクロインスタンスを使っていたが今はn1-standard-1を使用)
  • 手動デプロイ。サービスはsystemdで管理

現在の課題と移行プロジェクトのスタート

一番大きな課題は、手動デプロイ運用のため、コードを修正してpushしても自動でデプロイされないことです。 これができないので開発や保守をスキマ時間に行うのがとても難しくなっています。

2016年に構築した環境はもはや時代に合わなくなって来ているものも増えています。例えばrtmbotは既に開発が終了していますし、Python 3.8 をはじめ、依存パッケージが最新版に追随できていなくなっています。

また、Pyspa自体もSlackだけでなくDiscord等他のチャットプラットフォームを使い始めているということもあり、長期的にはマルチプラットフォームに対応しなければなりません。

そこで、環境移行をしようというプロジェクトが始まりました。

以下の作業を実施して、自動デプロイできる環境を作ることをゴールとします。

  • DBのSQLiteからCloud SQL (PostgreSQL) への移行
  • サービスのDocker化
  • Cloud Buildでビルドするように変更
  • Cloud Runから継続的にデプロイするよう変更

作業の詳細に興味があれば、下記ドキュメントを読んでみてください。

cloud.google.com

この中で私が主に担当しているのがDBマイグレーションの部分なので、この記事ではここの作業を中心に紹介します。

事前調査

最初に行うことは、現在のDBがどうなっているかの調査です。

最初に作られた10年前の構成がベースになっていますが、かなりいい加減に移行した上にその後テーブルやフィールドを追加していってたので、色々と問題がありました。

  • 間違ったユニークキー制約がORM(SQLAlchemy)上でついているのにSQLite上では存在しない
  • 外部キー制約が入っているべきところに入っていない
  • orphan recordがいたるところにある

制約を正しく設定し直す必要がありますが、その際にアプリが正しく動作するかどうかも確認する必要があります。

そして調べてみると、テストもかなりいい加減に作っていたため(書いたのは全部過去の自分ですが……)、これらのテストも正しく直す必要があることがわかりました。

SQLitePostgreSQLの仕様の違いについても調査する必要がありました。

例えばSQLiteではBOOLはINTEGERでしかないので、移行するにあたっては適切に値を変換する必要があります。

PostgreSQLではシーケンス管理をしているため、移行の最後に正しいシーケンス値を与える必要もあります。

開発環境の作成

開発用のDocker環境もなかったので、まずDockerfileとdocker-compose.ymlを書いて移行テストをローカルで簡単に行えるようにしました。

マイグレーションツールの作成

先の調査結果を元に、マイグレーションツールを作成しました。Click + SQLAlchemyを使った、DBを読み込んで適切な変換処理して書き出すだけのシンプルなツールですが、先述の問題にたびたびぶつかったために結構手間取りました。

スキマ時間で開発してたので、1ヶ月はかかったと思います。

次のステップ

DBマイグレーションの準備が完了したので、あとは自動デプロイの準備が完了すれば移行はできるはずです。

移行完了したら、最初に着手するのはパッケージ等のバージョンの更新の予定です。

最新版に対応して、それからようやく新規の開発に着手できるようになるでしょう。

明日のアドベントカレンダー@rokujyouhitomaです。