Merpay Advent Calendar 2020 の4日目の記事です。
こんにちは!Merpay Solutions Teamの@vvakameです。
1年前のAdvent Calendarでメルペイ社内ツールのお話をしました。この記事では、1年経ってuser-tkoolががどう変わったか、今どのように使われているかをまたしても紹介したいと思います。
gchammerについてはsinmetalがDay 2に記事を書いているのでそちらを見てください。
というわけで、この記事ではテスト環境に任意の状態のお客さまデータを生成するツールである、user-tkoolの最近を紹介していきたいと思います!
user-tkool とは
メルカリ/メルペイには実に様々な状態のお客さまが存在しています。アカウントを作った直後の方、メルカリで売り買いを楽しんでいただいている方、本人確認を済ませた方(いわゆるKYC済)、メルペイスマート払い、定額払いを利用していただいている方、はたまた支払い期限までに支払いを忘れてしまった方…。
上記以外にもここには書ききれない無限のバリエーションで君だけの最強のテストデータを準備する必要があります。user-tkoolはそういうときに役に立つ、テスト環境にデータを作ってくれるツールなのです。
去年の時点では、ツールのインタフェースとしてSlackが利用されていて、いわゆるChatOps的な使い方をするツールでした。/user-tkool create vvakame --ekyc
みたいなスラッシュコマンドを投げると、指定された状態のデータを作って、Slackに投げ返してくれます。
去年から改善されたポイント
1年で開発された機能、結構色々ありました。この1年間にmergeしたPRをまとめてみました。
- メルカリ関連機能
- お客さまデータ作成時のオプションの拡充
- 年齢、誕生日、氏名、etc…
- 商品の売り買いキャンセルのサポート
- 大量データが必要な場合の自動化
- 売上金の付与/没収操作のサポート
- お客さまデータ作成時のオプションの拡充
- メルペイ関連機能
- ネット決済で商品購入&その他操作のサポート
- メルペイスマート払い(定額)関連機能のサポート
- お客さまを(複雑な前準備を乗り越えて)利用中状態に設定可能に
- 精算可能状態や延滞状態の作成のサポート
- 開発関連
- telepresenceによる開発からskaffoldによる開発に移行
- 社内ではどれを使うかはチーム毎にバラバラ
- 個人的にはskaffoldのほうが困ること少なくて好き
- 開発版iOSアプリ用かんたんログインリンクの生成をサポート
- 生成データへの入力作業無しのログイン
- プロジェクトの構造の大幅なリファクタリング
- 無駄なレイヤーの削除
- 提供APIごとの(なるべく)薄いラッパの作成
- ログ出力方式の大幅な見直し
- ログ閲覧用リンク生成機能の追加
- 既存のGoLinks integrationのあいのり利用開始
- 誰かが作った仕組みに勝手に乗っかってる
- gRPCエンドポイントの提供開始
- 自動化ワークフローに組み込みやすくなった
- フロントエンドのテストやバックエンドのシナリオテストに組み込み可能に
- HTTPエンドポイントの提供も一応可能(gRPCとのトンネル
- Circle CIなどの外部ネットワークからのIdentity Aware Proxy(IAP)を利用したセキュアなアクセスの提供
- SlackコマンドのバックエンドをgRPCに置き換え
- その他細々とした改善や依存先MS(Microservices)の変更に伴う改修、認証系改善に伴う対応作業など
- telepresenceによる開発からskaffoldによる開発に移行
gRPC API化の話
今年一番大きかった変化は、やはりgRPC API化でしょうか。
去年までのuser-tkoolは、Slackのスラッシュコマンドを受け取るためのHTTPエンドポイントだけを持っていました。メルペイではMS間通信はほぼほぼgRPC APIで行われるのですが、user-tkoolは外部からAPIとして利用されることを想定していなかったのです。
これまでもMicroservices Platform(Platform Teamが管理するterraformやDatadogやその他etcが準備された開発基盤)上には乗っていました。ですが、他のマイクロサービス(microservices、MS)からアクセスされることはないので、リクエストの受け口となるgRPC APIを備えていませんでした。gRPC APIの追加により、user-tkoolはだいぶ”社内によくあるMS”らしくなりました。
これによりSlackコマンドからの利用という”人間的”ツールから、CIやシナリオテストから使える、”機械的”なツールに一皮むけました。
利用者の喜びの声を掲載しておきます。
API化以前はuser-tkoolをSlackコマンドで実行してテストに即したユーザーを作り、それを使いまわしていました。それだと、ユーザーの状態を変えてしまうようなシナリオでの冪等性に不安がありました。しかしAPI化でテストの前処理などで、任意の状態のユーザーを新規に作成する事ができるようになりシンプルかつ高速にテストを回せるようになりました。API化の他にも日々増えていく機能に合わせた、複雑なユーザーの状態への対応もスピーディーに行ってもらっています。今では開発時、テスト自動化時の両局面でなくてはならないツールになっています!
おかげで定時に帰れるし長年患っていた腰痛が治って恋人ができて宝くじが当たりました!今では親戚一同みんなtkoolユーザーです
いい話ですね。宝くじが当たっても会社を辞めないのは勤労意欲を感じます。
UI Testを実装するとき、まずSlackコマンドで動作を確認できました。その時の処理の流れをDatadog上で確認する方法が用意されていて、user-tkoolのどのgRPC APIが使われていて、どういうパラメータが指定されているのか、さらにその先のどのMSのどのAPIが使われているか、ひと目で確認できるようになっていてわかりやすかったです!
シナリオ全体のログの一覧作成と、RPCのdumpはウケがよかったのでやってよかったです。
開発補助ツールとしての需要の高まりの話
user-tkoolはメルペイスマート払い(定額)のQAを補助するツールとして開発プロセスに組み込まれました。新規にこの機能を利用可能なお客さまデータを作るのは結構な操作ステップが必要で、繰り返しQAを行う上で大きな手間になるため、これを削減する狙いです。QAの段階や、社内での新機能お触り会でもここで開発した機能が多いに使われました。user-tkoolの開発追加自体もなかなかタイトなスケジュールだったのですが、無事に新機能がリリースされたのでよかったですね。
Productivityの向上のためにリリースサイクルを加速しようと組織単位で取り組むなか、任意のお客さまデータを作れるuser-tkoolはその重要性を増しています。実は、これまでも似たような目的のツールはところどころに存在していたようです。出自的に、フロントエンドのニーズにより作られたパターンが多く、Microservices Platformに乗っておらず、またGoで書かれてもいなかったようです。他のMSと同様の構成やプラットフォームを利用していないということは、APIへのアクセスに制限があり、組織が持つミドルウェアを流用できないことを意味します。そんななか、MSネイティブ(?)としてuser-tkoolが構成しなおされ、既存資産を利用しやすくなったのは楽ができそうではあります。
テストや運用の補助を目的として内部のAPIを叩くツールを作るときはフロントエンドで頑張らずにバックエンドの人たちメインで作ったほうがよいのかもしれませんね。運用上必要な変更などの通知など、会社が大きくなると個人が監視できる情報源の数には自ずと上限ができてしまうので、畑違いのニュースに敏感でいるのは難しいためです。
今後、さらにいろいろなニーズが集まり、多くの機能がuser-tkoolによって提供されるようになるかもしれません。組織のProductivityの改善のための屋台骨となれるのか。はたまた、様々なMSの仕様変更や運用のトラブルの集約点として時代の徒花となるのか…!
ここがツライよ社内ツール運用
はい。というわけでですね、1年のレポートを書いたらくたびれてしまったわけなんですが、せっかくなので使われるようになってきたがゆえのツライところをネタにしてここに供養していきたいと思います。
名前がツライ!
社ではユーザではなくお客さまと呼称しており、userじゃなくてcustomerなわけです。なぜcustomer-makerじゃないのか…。
TUKURU(つくる)とTOOL(ツール)をかけてtkool(ツクール)としているのは某R○Gツクールにあやかっているわけですが、この言葉遊びは日本語話者にしか伝わらず意味もわかりにくいです。たまに「tkoolってなんて読むの?ティークール?え?ちゅーくーる?言いにくいね!」みたいなことになってます。
すまん…すまんかった…
ちなみに某R○Gツクールは海外発売の際に R○G Maker というタイトルに変えています。冷静だね!
変更・不調が炸裂するのが主にうちでツライ!
user-tkoolは様々なMSの機能をパッチワーク的に利用して構成しています。つまり様々なMSの様々な機能に断片的に依存しているということであり、各所の仕様変更や接続の不調やもろもろのトラブルがuser-tkoolのトラブルとして表出します。その問い合わせを受けて色々調査するのに結構な時間がかかっています。
実際にあった例をご紹介します。
Q. なぜか作成したデータが結果に反映されなくなった!なんで?
A. あ、最近データ反映処理を非同期にしました!お客さまはそんなに素早く操作しない(できない)から、5秒後に処理完了しても十分だよね!
user-tkoolは自動操作なので一瞬で結果がほしいのです!そしてuser-tkool以外では困る変更ではないのでうち(だけ)が初めて困るという…。
Q. なんかこのAPIの挙動が変わってるんだけど…?
A. 呼び出した先のMSがさらに呼び出すMSのエンドポイントを変えました!システム全体としてみると問題ないはず!
user-tkoolが利用していたつもりの機能は、実は特定のエンドポイントの副作用に依存していた…!QAなどはアプリからの操作が主なのでそちらから見ると特に問題がない。つまりうち(だけ)が主に困るという…。
Q. 過去データを無理やり生成したい…!?え、できるのそんなこと…
A. MS担当者「デバッグ用API作ってあげるからそれでパラメータ頑張っていじって」
え、デバッグ用API作ってくれるの… 優しい… きゅん…
Q. ある日突然、快調に動いてたデバッグ用APIが有効にされているServiceにリクエストが刺さらなくなった!
A. 内部のシステム構成の改善に伴いService間のルーティング指定のやり方が段階的に変更になっている途中です
えっ!し、知らんかったが…?段階的…?つ、つらい…
みたいなのがちょいちょいあります。
ここにまとめた事例を読むと、問題と原因が明確ですが、実際はなぜその問題が発生するのか、問題になるMSはどれなのか、問題が発生しているMSが真の原因なのか、真の原因を解決できるチームはどこなのか、調査になかなかの手間がかかります。
筆者のメルカリ・メルペイの好きな点は、みんな誰かが困っていたら自分が困っているのと同じプライオリティで解決に協力してくれる点です。原因の調査に快く協力してくれますし、問題の解決も嫌な顔をせずに対応してくれます。この点に非常によく助けられています。さもなくば、user-tkoolのようなツールの運用など到底やっていられないでしょう。
みんなーー!!いつもありがとーーー!!これからもものすごく助けてくれーーー!!
これは必要だったなぁ という工夫の話
もうやった / やったほうがよかった / やれない気がするけどやりたい 話を書いていきます。自分たちも社内ツール作ってるぜ!という人で、これもやったほうがいいよ!というのがあったらぜひ教えてください。
- 社内共通の言語・環境の利用
- うちの場合 Go など
- ミドルウェアなどの資産が集約して管理されるのはメリットが大きい
- 他チームのコードを追いかけたりパッチを投げつけるのも簡単
- Microservices Platformはわりと使いやすくて必要なものが色々とある
- よく型付けされたスキーマの利用
- うちの場合 gRPC(Protocol Buffers)
- Go、TypeScript、Kotlin、Swiftのクライアントライブラリの自動生成は便利
- MSを横断したログ・トレースの出力
- もともとMicroservices Platformにあったやつ + シナリオ単位で追跡できるように自前でリクエストIDを制御できるように各所を改修
- HTTP / gRPCリクエストの自動的なログ出力
- クライアントとして、サーバとして、双方あると便利
- 各MSのAPIを叩いた結果の監視・統計
- DatadogにDashboardを作らないといけない…
- 仕組みはあるけど僕が好きな作業じゃないので滞ってる
- 他MSのログレベルをリクエスト単位で再設定できる機能
- うちからのリクエストのときだけは可能な限り詳細なログを出してほしい…!
- なんならMSの間に挟まってるproxy系もログ吐いてほしい
- 非同期処理を同期的に処理し完了通知を外部から観測できる手法
- あったら魔法では??
- user-tkool以外での需要がなさすぎるわりに必要な変更が多大にすぎる
しめくくり
というわけで、メルペイではProductivity向上のために、色々な人が色々な方法で戦っている最中です。興味のある方はメルペイバックエンドエンジニアの募集から、僕らの仲間に加わりにきてください!すでに社内にいる人もuser-tkoolの開発に参加しにきてください!
ご連絡お待ちしてます!!
適当なJDなんか無いかなと言ったらなんでもするからAndroidの募集も貼ってくれと言われたので貼っておきます。
1月27日に開催されるイベントでも何かしらuser-tkoolの話をする予定なので、登録よろしくおねがいします!
明日のMerpay Advent Calendar 2020 執筆担当は、Android Engineerで幻のポケモンゲットチャレンジ2020のシリアルコードを僕に分けてくれるhideyさんです。引き続きお楽しみください。