TECH PLAY

SQLite

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

該圓するコンテンツが芋぀かりたせんでした

技術ブログ

本蚘事は「 Merpay & Mercoin Tech Openness Month 2026 」の17日目の蚘事です。 この蚘事は新しいロヌルであるPdE (Product Engineer)ずいうClient / Backend の境界をたたぐ「越境開発」ロヌルの取り組みに぀いお、@anzai, @victoria Li, @ninnin, @panoramaの4名でお送りしたす。蚘事本文は、そのうちの1人である anzai が、自分の䜓隓を䞀人称で振り返る圢で曞いおいたす。 はじめに 「Client ゚ンゞニアが Backend を曞き、Backend ゚ンゞニアが Client を曞く」——そんな䜓制は実際に成立するのか。Q4 に詊した小さな実隓を玹介したす。 ひずこずでたずめるず、Android ゚ンゞニアが Postgres のデヌタベヌスDB蚭蚈ずサヌバヌ実装を曞き、Backend ゚ンゞニアが iOS/Android の画面を䜜りたした。やっおみお成立はしたものの、楜な道ではありたせん。䜕が効いお、どこで詰たったのか。本蚘事では「越境開発」ずいうテヌマに絞っお、その実際を共有したす。 越境開発の背景 私は普段メルペむでClientAndroid / iOSのチヌムを芋おいる Engineering Manager です。今回はManagerずしおではなく、自分の手でコヌドを曞く䞀員ずしお KYC本人確認領域のAI pod (小芏暡な開発チヌム)に参加したした。 このチヌムでは、Product ManagerPdMを眮かず、゚ンゞニアが1人で1プロゞェクトを仕様策定からデリバリヌたで䞀気通貫に持぀1 Person 1 Release、ずいう䜓制を詊しおいたす。 そしおこの䜓制を回そうずするず、避けお通れない課題が1぀出おきたす。それは「1人で End-to-EndE2Eに持぀なら、Clientも Backend も自分で曞くこずになる」ずいうこずです。 KYC のプロゞェクトは、ほずんどの堎合 iOS / Android のClientず、サヌバヌ偎の API・DB の䞡方に手を入れたす。埓来はここをクラむアント担圓ずサヌバヌ担圓で分けおいたした。1人1プロゞェクトにするなら、その境界をたたぐ必芁がありたす。E2Eで開発する䞭で「Client ゚ンゞニアが Backend も、Backend ゚ンゞニアが Client も開発できるか」を、実プロゞェクトで怜蚌するこずにしたした。 いく぀かのプロゞェクトで Client-Backend を䞀気通貫で開発した結果、今期はどちらも成立したした。Client ゚ンゞニアがサヌバヌの DB ず API を曞いおリリヌスし、Backend ゚ンゞニアがモバむルの画面を出す。これ自䜓が、たず確かめたかったこずです。 以䞋では、私がどう開発を進めたかを時系列で振り返り、そのあずで、どこで詰たったかを共有したす。 AI を掻甚した越境開発の進め方 私はClient゚ンゞニアです。今回担圓したプロゞェクトで最終的に必芁ずしおいたアりトプットは、具䜓的には2぀でした。1぀はお客さたに芋せる UI/UX、もう1぀は、その埌の業務報告に䜿うレポヌトです。この2぀の具䜓的なアりトプットから逆算しお、「では、その裏偎でどんな仕組みを実装しなければならないか」を決めおいく必芁がありたした。そしおその仕組みの倧郚分が、私にずっお初めおのサヌバヌサむドGo / Postgresです。 そこでたず、既存の実装を AI Agent に読み蟌たせ、「この2぀のアりトプットを満たすには、どんな蚭蚈・実装が必芁か」を AI に怜蚎しおもらうずころから始めたした。芁件は手元にあるので、あずはそれを初めおの蚀語ず環境にどう萜ずすか。 この蚘事のここから先は、その道のりを時系列でたどりたす。 AI の説明もコヌドも、最初はわからない 最初にぶ぀かったのは、コヌドを曞く以前の問題でした。AI Agent が返しおくる説明そのものが、䜕を蚀っおいるのかわからないのです。 たずえば「Postgres を起動しお、goose で既存の migration を流しお、psql で確認しお」ず AI に蚀われおも、最初は䜕を指しおいるのか、たったく理解できたせんでした。goose ずは䜕か、psql で䜕を確かめればいいのか ── そのひず぀ひず぀が、Client 開発しかしおこなかった私には初めおの蚀葉です。AI は正しいこずを蚀っおいるのかもしれないけれど、こちらにそれを受け取る前提知識がない、ずいう状態からのスタヌトでした。 ここでやったのは、ひたすら AI に問い返すこずです。「それはどういう意味か」「図にしお説明しおくれ」ず、いろいろなパタヌンで噛み砕いおもらう。そしお自分が玍埗できたら、その理解を「こういうこずですよね」ず、今床は別のBackend゚ンゞニアに確認しに行く。これを繰り返すこずで、環境がどう動いおいお、䜕をすればテストが回るのか、開発の前提条件をたず頭に入れおいきたした。 前提が芋えおきたずころで、いよいよ実装です。さきほどの芁件をもずに「蚭蚈しお実装しおみお」ず AI Agent にお願いし、コヌドを曞いおもらいたす。するず今床は、出おきたコヌドそのものが読めたせん。 なぜここで defer を呌んでいるのか。なぜ cancel() しなければならないのか。ここで context を受け取っおいるのは、぀たりどういうこずなのか。Go のむディオムが、こずごずくわからないのです。 そこで最初は、䜜っおもらったコヌドを䞀行䞀行、すべお AI に解説しおもらいたした。 context のキャンセルでリ゜ヌスを解攟しないず goroutine が挏れる、だからこの䜍眮で defer cancel() する。そうした説明を1぀ず぀受けながら、文法曞ではなく目の前の実コヌドを教材にしお読み解いおいきたす。 なお、DB に぀いおはたったくのれロからではありたせんでした。モバむルでも端末䞊の SQLite でテヌブルを蚭蚈し、ク゚リを曞く機䌚はありたす。正芏化やむンデックスずいった基瀎抂念そのものは持っおいたので、サヌバヌの Postgres は「知っおいる抂念を別のコンテキストに翻蚳する」䜜業に近く、そこは助けになりたした。 チャンクごずの䞊走型にたどり着く ただ、「党郚曞いおもらっおから䞀行ず぀解説」では、どうしおも効率が良くありたせん。これを倉えたのが、チヌムのふりかえりでした。 私たちは週に1回レトロスペクティブを開き、チヌムの進め方を少しず぀改善しおいたした。その䞭で、メンバヌの䞀人が「チャンク意味のある塊ごずの䞊走型」ずいうやり方を持ち蟌みたす。AI に䞀気に党郚を生成させるのではなく、意味のあるコヌドブロック単䜍で実装させる。そのブロックが「なぜ必芁なのか」を自分が理解できればそのたた進め、理解できなければきちんず問い返す。「ここは A ず B のやり方がありそうだけれど、なぜ A を遞んだのか」ず郜床たずねおいくこずで、コヌドの䞀行ず぀の意図を理解しながら前に進みたす。 このやり方だず、巚倧な生成物を䞊から順に読み䞋す必芁がなくなり、開発の流れを「意味のある順序」で理解できたす。機械的な行順ではなく、蚭蚈の意図に沿った順序で頭に入っおいく感芚です。質問ず回答はログずしお残し、読み返せば「今日は䜕を孊んだか」の埩習にもなりたした。 遞んだ理由を残し、AI のコヌドを自分で理解する この進め方には、思わぬ副産物もありたした。「いく぀かの遞択肢のなかで、なぜこの A を遞んだのか」を開発の過皋ですでに蚀語化しおいるので、それをそのたた Pull RequestPRの説明に曞けるのです。結果ずしお、レビュヌはそれほど詰たるこずなく埗られたした。初めおの領域でも、遞択の根拠を添えられればレビュアヌは刀断しやすいですし、「ここたで考えた䞊でのPRなんだな」ずいう信頌も埗られたす。ビギナヌのPRを読むこずはコヌドオヌナヌにずっお倧倉な負担ですので、このような越境開発においお信頌を䜜るための調査は必芁な工皋だったず思いたす。 ここで1぀、立ち止たっお考えるべき論点がありたす。AI が曞いたコヌドを、人間がわざわざ読んで理解する必芁はあるのか。生成しお、テストが通っお、動けばよいのではないか。これはこれから重芁になる議論だず思いたす。 私の珟時点の答えは「理解すべき」です。 これからの生産性は、曞いたコヌド量ではなく、意思決定の回数ず質でほが決たっおいくず考えおいたす。そしお意思決定の質ず回数を䞊げるには、ドメむンの理解が必芁です。「このバック゚ンドの蚭蚈は、これで本圓に正しいのか」を刀断する堎面で、いたのずころ最終的な刀断は人間がしおいたす。その刀断を䞋せるだけの理解を持っおいないず、意思決定の回数も質も䞊がっおいきたせん。だからこそ、AI が曞いたコヌドでも䞭身を理解しおおく䟡倀がある、ずいうのが今の立堎です。 たたAIの仕組み的に、氞遠にそのPRに察しお改善ポむントを考え出すこずができたす。たずえば、あるPRに぀いお1回目のセッションでAIに聞くず A・B・C の3点を盎すよう蚀われ、その修正結果を別のセッションで聞くず、今床は E・F・G の3点を盎すよう蚀われる、ずいうこずが起こりたす。それを党郚反映するず、最終的にはオヌバヌ゚ンゞニアリングした膚倧なPRになりがちなので、珟状は「どこたでが適切か」を人が刀断する必芁があるでしょう。 もしこの「理解する」のに2〜3幎かかる長期投資なら、孊ぶ理由はもっず厳しく問われるでしょう。ですが実際はそうではありたせんでした。いたの AI Agent によるオンボヌディングは本圓にしやすく、いわば優秀な指導圹が隣に぀いお、い぀でもペアプロに付き合っおくれるような状況です。この環境であれば、3ヶ月もあれば、いた開発しおいる領域の䞀通りの知識は埗られるずいう手応えがありたした。もちろん、もずもずシニア゚ンゞニアずしおの経隓がある、ずいう条件付きではありたす。投資回収が数幎ではなく数ヶ月の単䜍に瞮んでいるのなら、理解する偎を遞ぶのが合理的だず考えおいたす。 蚭蚈の最終確認はシニア゚ンゞニアず ずはいえ、AI に聞けばそのたた採甚、ずはしたせんでした。象城的だったのがむンデックスの蚭蚈です。 「このカラムにむンデックスを匵るべきか」を、AI の提案を鵜呑みにするのではなく、なぜ必芁なのか䞍芁なのかを自分で根拠を持っお調べたした。どんなク゚リパタヌンで匕かれるのか、カヌディナリティはどうか、読み取りが速くなるぶん曞き蟌みコストずのトレヌドオフはどうなるのか。こうした芳点を1぀ず぀確かめお、「この蚭蚈にはこういう理由がある」ず説明できる状態にしたす。 それでも、最埌はシニア゚ンゞニアず䞀緒にレビュヌしたした。正盎に蚀えば、これは自分の自信のなさを埋めるためでもありたした。AI が生成したものが本圓に正しいのか、その最終的な刀断が、私䞀人ではどうしおも぀かなかったからです。 このレビュヌには、䞍安を消す以䞊の䟡倀がありたした。シニア゚ンゞニアが、考え埗るパタヌンをいく぀も挙げおくれたうえで「では、この方法でいきたしょう」ず意思決定でき、いく぀かの改善点も芋぀かりたした。よりベタヌな やり方にたどり着くうえで、人ず䞀緒に芋おもらう工皋はやはり必芁だったように思いたす。こちらは Backend ゚ンゞニアが Client 開発をする堎合も同様でした。 AI で䞋曞きず理解を加速し、自分で根拠を固め、最終的には人ずレビュヌする。この3段構えが、初めおの領域で品質を担保し、か぀自分が安心しお前に進むうえで、珟実的なやり方でした。AI は出発点ず䌎走者ずしおは非垞に匷力でしたが、蚭蚈の最終的な劥圓性を芋極め、遞択肢を広げおくれるのは、ただ人間のレビュヌだった、ずいうのが実感です。 なお、今回曞いた DB 蚭蚈は2テヌブルだけのシンプルな構成で、本栌的な分散やシャヌディングの考慮たでは芁りたせんでした。テヌブルが増え、耇雑なむンデックス蚭蚈が絡む芏暡で、AI ずこの3段構えがどこたで通甚するのかは、ただ怜蚌できおいたせん。「シンプルだったから回った」可胜性は十分にありたす。 最埌に補足するず、こうしお進められた背景には、組織図䞊で「越境させた」のではなく、同じチヌムの䞭で互いの領域をペアプロで教え合える環境があったこずが倧きいです。AI に聞いおもわからないこず、そもそも䜕を聞けばいいかわからないこずは、隣にいる詳しいメンバヌにその堎で聞く。AI ず人、䞡方に頌れる盞手がいたこずが、越境のコストを最も䞋げたした。 ぀たずいたポむントず察策 ここたでは「どう乗り越えたか」を䞭心に曞いおきたしたが、実際には数倚くの詰たりどころがありたした。そしおその倚くは蚭蚈や実装の難しさではなく、環境・ツヌル・運甚、぀たりコヌドを曞く以倖の党郚にありたした。Client しか曞いおこなかった人間が Backend に入るず、ここでこずごずく足を取られたす。代衚的なものを課題ごずに玹介したす。 珟状の開発スタむルがわからない 最初の壁は、開発スタむルそのものの違いでした。 Client゚ンゞニアの感芚ずしお、たずロヌカルでビルドしお動䜜を確認しようずしたした。ずころが、このコヌドをもずもずメンテナンスしおいたチヌムは、開発環境devにたずデプロむしおから動かす、ずいうスタむルを取っおいたした。぀たり、ロヌカルの docker compose は、実のずころほずんど䜿われおいなかったのです。 私はそれを知らないたた、ロヌカルの docker compose を立ち䞊げようずしお、「Postgres のバヌゞョンが合わない」「環境倉数が無効だ」ず、動かない環境を前に四苊八苊したした。結果ロヌカルでテストできるようになったので良かったのですが、リポゞトリ固有のこうした暗黙知は、AI ではどうにもならない郚分です。 enum を䞀぀増やしたら、芋づる匏にバヌゞョンが䞊がる 次に぀たずいたのは、䟝存関係の曎新でした。やりたかったのは、protobuf の定矩に enum を䞀぀増やし、新しく远加された定数を参照するこずだけです。ずころが、その定矩を取り蟌もうず go mod tidy を実行したずたん、盎接は觊っおいないはずのラむブラリのバヌゞョンが䞀斉に䞊がっおしたいたした。gRPC たわりから、最終的には Go 本䜓の芁求バヌゞョンたで動いおしたう。たった䞀぀の enum のために、なぜここたで広がるのか、最初はたったく芋圓が぀きたせんでした。 やっかいだったのは、その「なぜ」に察しお、もっずもらしい説明がいく぀も出おきお、しかもそれが間違っおいたこずです。AI に理由を聞くず、それらしい仮説、たずえば「䜙蚈な曎新を巻き蟌んでいるだけだから、最小限に戻せる」ずいった答えを返しおきたす。ですが、その通りに戻そうずしおも差分は収たりたせんでした。 ひたすらAIず問答し、ようやく分かりたした。原因は䟝存が構造的に噛み合っおいたこずでした。新しい生成ラむブラリが新しい gRPC 系を芁求し、それがさらに別の基盀ラむブラリを匕き、最終的に Go 本䜓の䞋限たで抌し䞊げおいる構造だったのです。本圓にそうなのかの䟝存関係のグラフを図瀺し、それでも自信が持おなかったのでPR Reviewでシニア゚ンゞニアにレビュヌいただきたした。 ロヌカルでのテストず Lint DB アクセス局DAO: Data Access Objectのテストをロヌカルで回そうずするず、ただ実行するだけでは通りたせんでした。テスト甚の Postgres を専甚ポヌトで立お、 PGPORT を明瀺的に指定する、ずいった、チヌムでは圓たり前すぎお誰もドキュメントに曞かない䜜法を、1぀ず぀螏みながら知っおいきたす。 たずえば DAO テストは、 5556 のような専甚ポヌトでテスト甚の Postgres を立お、 PGPORT でそこを向けお初めお通りたす。これを知らないず、テストはロヌカルの既定のデヌタベヌスに接続しようずしお、原因の芋えないたた倱敗し続けたす。どこにも曞かれおいないこの䞀手にたどり着くたで、゚ラヌメッセヌゞずにらめっこする時間が続きたした。 Lint も同様でした。ロヌカルで走らせるず、蚭定のバヌゞョン差v1 系ず v2 系の非互換でうたく通らず、CIContinuous Integrationに任せるずいう割り切りに萜ち着きたした。「ロヌカルで党郚緑にしおから push する」ずいう前提が、たず厩れたす。 E2E 開発のマシン芁件 1人で Client も Backend も1台で回すず、マシンぞの負荷が䞀気に䞊がりたす。実際、Android ビルド゚ミュレヌタ、iOS ビルドシミュレヌタ、Docker コンテナ3぀を同時に動かしお、メモリを90GB䜿う堎面がありたした。スワップなしで E2E 開発をするなら、96GB は欲しいずころです。 特にBackendのEngineerは元々高いスペックのPCを持っおおらず、Client開発でたず最初のロヌカルビルドを詊す段階で躓いおしたいたした。ここからロヌカルビルドに耐えるPCを支絊しおもらうたでClient開発に着手できないずいうこずが起きおしたっおいたした。 越境しお E2E を1人で持぀ずいうこずは、ツヌルチェヌンも党郚抱えるずいうこずでもありたす。ハヌドりェアは目立ちたせんが、無芖できない条件でした。チヌム内でも「越境する人ほどマシン芁件が䞊がる」ずいう前提を共有し、開発機の遞定では倚めのメモリを芋蟌んでおく必芁がある、ずいう話になりたした。 振り返っお これらの課題に共通しおいたのは、詰たったポむントのほずんどが、蚭蚈や実装の難しさではなく、環境・ツヌル・運甚の暗黙知だったこずです。コヌドを曞く力そのものよりも、その手前のずころで足を取られおいた、ずいうのが実感でした。 ここで効いおくるのが、もずもず人間のオンボヌディングでも重芁だった条件です。「DXDeveloper Experienceが敎っおいる」「オンボヌディング資料や開発ドキュメントが敎備されおいる」ずいう、人にずっおの敎備状況が、そのたた AI にずっおの敎備状況でもありたした。ドキュメントが薄く暗黙知に頌っおいる領域では、人も AI も同じように迷いたす。 今のずころは、やっおみお初めおわかる問題を螏んでは1぀ず぀朰しおいく、いわば「悲鳎駆動」で進めるしかなく、チヌムを立ち䞊げおから数ヶ月は生産性を䞊げるのが難しいのが正盎なずころです。逆に蚀えば、ここをドキュメントずセットアップスクリプトであらかじめ朰しおおけば、越境のコストは倧きく䞋げられる、ずいう改善の的もはっきり芋えたした。次に越境に挑むなら、最初に着手するのはこの敎備だろうず考えおいたす。 たずめ KYC で詊した範囲では、Client ⇄ Backend の越境開発は成立したした。Client ゚ンゞニアがサヌバヌを曞き、Backend ゚ンゞニアが iOS/Android を出せおいたす。 それを支えたのは、いく぀かの条件でした。たず、小芏暡な開発チヌムずしお䞀䜓で動き、ペアプロやオンボヌディングセッションをしながら互いの領域を孊べたこず。次に、AI Agent が初芋の蚀語やコヌドを䞀文ず぀理解する䌎走者になっおくれたこず。ただし、蚭蚈の最終的な劥圓性を芋極め、そしお開発者の䞍安を払拭するのは、いたも人間のシニアレビュヌでした。環境構築やツヌルのバヌゞョン、ロヌカルテストずいった暗黙知を埋めるには、オンボヌディング環境ずドキュメントが芁りたす。䞀方で、遞択の根拠を開発の過皋で蚀語化し、それを残しおおけば、専門倖の領域でもレビュヌは回りたした。そしお最埌に、これらすべおを1台で回すには、メモリ96GB玚の開発機が珟実的に必芁でした。 そしお、これらが揃っおいおも、最初の数ヶ月は生産性が萜ちたす。越境は成長痛ずセットでやっおくる、ずいうのが䞀番の孊びでした。逆に蚀えば、その成長痛をチヌムずしお匕き受ける芚悟ず、AI を含めたオンボヌディングの仕組みがあれば、「クラむアント゚ンゞニア」「サヌバヌ゚ンゞニア」ずいう肩曞きの境界は、思っおいたより動かせたす。 次は、もっず耇雑な DB 蚭蚈を含むプロゞェクトで、AI がどこたで越境を支えられるのかを確かめおいきたす。゚ンゞニア䞀人ひずりが領域をたたいで動けるようになるこずは、巡り巡っお、より早く・より確かな䟡倀をお客さたに届けるこずに぀ながるず考えおいたす。これからもこういった挑戊を続けおいきたいず思いたす。 次の蚘事は yutaroさんです。匕き続きお楜しみください。
本蚘事は 2026 幎 4 月 17 日 に AWS Migration & Modernization Blog で公開された「 Modernize VB6 Applications at Scale with AWS Transform Custom  」を翻蚳したものです。 想定所芁時間 : 90 〜 120 分 レベル : 侊箚 (400) Microsoft は Visual Basic 6.0 (VB6) ã®å»¶é•·ã‚µãƒãƒŒãƒˆã‚’ 2008 å¹Žã«çµ‚了 (*) したしたが、金融サヌビス、保険、ヘルスケア、補造業など、数千ものミッションクリティカルなアプリケヌションが䟝然ずしお VB6 に䟝存しおいたす。これらのアプリケヌションには数十幎分のビゞネスロゞックが含たれおいたすが、幎々メンテナンスが困難になっおいたす。VB6 開発者は劎働垂堎に残る人数が枛少しおいるため採甚コストが䞊昇し、パッチ未適甚の脆匱性はコンプラむアンス違反のリスクを高め、モノリシックなアヌキテクチャは AI、アナリティクス、クラりドサヌビスずの統合を困難にしおいたす。 * 蚳泚厳密には、VB6 の IDE のサポヌトは終了しおたすが、VB6 のランタむムはただサポヌトはされおいたす。ランタむムは Windows のラむフタむムに合わせおサポヌト継続されおいたすが、察応は重倧なセキュリティ問題等に限定されおいたす。詳现は こちら を参照しおください。 これらの課題は、AWS Transform custom でカスタム倉換プランを䜜成するこずで解決できたす。 この蚘事では、AWS Transform custom の゚ヌゞェンティック AI 機胜を掻甚しお、組織固有のビゞネスルヌルを維持しながら VB6 アプリケヌションを倧芏暡にモダナむズする方法を玹介したす。 VB6 ãƒ¢ãƒ€ãƒŠã‚€ã‚ŒãƒŒã‚·ãƒ§ãƒ³ã®èª²é¡Œ VB6 ã‚¢ãƒ—リケヌションのモダナむれヌションには、単玔な構文倉換を超えた固有の課題がありたす。 AWS Transform for .NET  ã¯ .NET Framework アプリケヌションの自動ポヌティングを提䟛しおいたすが、VB6 には固有の特性があるため、異なるアプロヌチが必芁です。 VB6 ã®ãƒ¢ãƒ€ãƒŠã‚€ã‚ŒãƒŒã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒ¬ã‚¬ã‚·ãƒŒãƒ—ラットフォヌムずモダンな .NET の間にある根本的なアヌキテクチャの違いに察凊する必芁がありたす。蚀語レベルでは、VB6 ã®æ‰‹ç¶šãåž‹ãŠã‚ˆã³ COM ãƒ™ãƒŒã‚¹ã®ãƒ‘タヌンをオブゞェクト指向の C# æ§‹é€ ã«ãƒžãƒƒãƒ”ングする必芁がありたす。ナヌザヌむンタヌフェヌスも、ActiveX ã‚³ãƒ³ãƒˆãƒ­ãƒŒãƒ«ã‚’䜿甚した VB6 ãƒ•ォヌムから Blazor や ASP.NET Core MVC ãªã©ã®ãƒ¢ãƒ€ãƒ³ãª Web ãƒ•レヌムワヌクぞの倉換が必芁です。デヌタアクセスパタヌンはレガシヌな ADO や DAO ã‹ã‚‰ Entity Framework Core の async/await ãƒ‘タヌンに移行し、COM äŸå­˜é–¢ä¿‚は .NET ãƒã‚€ãƒ†ã‚£ãƒ–の代替手段や NuGet ãƒ‘ッケヌゞに眮き換える必芁があり、゚ラヌハンドリングは On Error Resume Next や On Error GoTo ãƒ‘タヌンから構造化された try-catch äŸ‹å€–凊理に移行したす。 サンプルアプリケヌションの玹介 Salmon King Seafood (SKS)  ずいう VB6 Multiple Document Interface (MDI) アプリケヌションを䜿っお AWS Transform custom を解説したす。これは兞型的な゚ンタヌプラむズモダナむれヌションの課題を衚すアプリケヌションです。SKS は以䞋の特城を持぀氎産物受泚管理システムです。 15 以䞊の VB6 フォヌム – 受泚、顧客管理、商品カタログ、圚庫管理、承認ワヌクフロヌを含む 3 ぀の VB6 モゞュヌル (modConnection.bas、modFunctions.bas、modMain.bas) – 共有ビゞネスロゞックずデヌタベヌス接続を含む SQLite デヌタベヌス (Orders.db) – ADO デヌタコントロヌルずデヌタバむンディングを通じおアクセス 暙準 VB6 コントロヌル – MSFlexGrid、ListView、Toolbar、ImageList、ComboBox、Control Arrays を含む MDI ã‚¢ãƒŒã‚­ãƒ†ã‚¯ãƒãƒ£  â€“ ãƒ¡ã‚€ãƒ³ã‚³ãƒ³ãƒ†ãƒŠãƒ•ォヌムずメニュヌからトリガヌされる子フォヌム このアプリケヌションは、゚ンタヌプラむズアプリケヌションでよく芋られる VB6 パタヌンを実装しおいたす。 むベントハンドラを持぀フォヌムベヌスの UI デヌタバむンディングを䜿甚した ADO デヌタアクセス COM ベヌスのコントロヌル モゞュヌル内の手続き型ビゞネスロゞック これらの芁玠により、SKS ぱンタヌプラむズ VB6 モダナむれヌションで遭遇する耇雑さを代衚するものずなっおいたす。 ゜リュヌション抂芁 VB6 ã‹ã‚‰ C# ãžã®ãƒ¢ãƒ€ãƒŠã‚€ã‚ŒãƒŒã‚·ãƒ§ãƒ³ã«ã¯ã€AWS Transform custom ã®è€‡é›‘な倉換パタヌンの孊習・適甚機胜を掻甚できたす。゚ンドツヌ゚ンドのプロセスは以䞋のステヌゞに埓いたす。 評䟡 – VB6 アプリケヌションポヌトフォリオのスコヌプず耇雑さを評䟡する 定矩 – VB6 から C# ぞの倉換パタヌン、ビゞネスルヌル、コヌディング暙準を含むカスタム倉換を定矩する 実行 – 倧芏暡に倉換を実行する レビュヌず反埩 – フィヌドバックルヌプによる継続的な改善を行いながらレビュヌず反埩を行う このアヌキテクチャにより、倉換定矩を䞀床䜜成しおテストし、数癟のアプリケヌションに適甚できたす。 前提条件 開始する前に、以䞋を確認しおください。 AWS Transform Custom ぞのアクセス暩を持぀ AWS アカりント 。珟圚の料金の詳现に぀いおは、AWS Transform の料金ペヌゞをご芧ください。 ATX CLI (Command Line Interface) がむンストヌルされた MacOS たたは Linux 環境。詳现なセットアップ手順に぀いおは、 AWS Transform custom 前提条件ガむド を参照しおください。 **Windows 開発者の堎合** : WSL2 (Windows Subsystem for Linux) をむンストヌルし、Ubuntu たたはその他の Linux ディストリビュヌションから ATX CLI を実行しおください。CLI は `/mnt/c/` パスを通じおロヌカルコヌドベヌスを盎接操䜜したす。 倉換埌のアプリケヌションをテストするための .NET 10 SDK 以降 コヌドレビュヌ甚の Visual Studio 2022 以降たたは Visual Studio Code VB6 および .NET の開発知識 有効な認蚌情報が蚭定されおいる Git があるこず 環境の準備 Salmon King Seafood (SKS)  ã‚µãƒ³ãƒ—ルアプリケヌションをダりンロヌドしたす。これには、兞型的な゚ンタヌプラむズ VB6 ワヌクロヌドを代衚する VB6 MDI アプリケヌションが含たれおいたす。 リポゞトリをロヌカルマシンにクロヌンしたす。 git clone https://github.com/GAPVelocityAI/SKSVB6.git  cd SKSVB6  Windows で WSL2 ã‚’䜿甚しおいる堎合は、䞡方の環境からアクセス可胜なパスにクロヌンしたす。 git clone https://github.com/GAPVelocityAI/SKSVB6.git /mnt/c/Projects/SKSVB6  cd <path-to-repository>  リポゞトリの内容を確認したす。VB6 ãƒ—ロゞェクトファむル (SKS.vbp)、フォヌムファむル (.frm/.frx)、モゞュヌル (.bas)、SQLite ãƒ‡ãƒŒã‚¿ãƒ™ãƒŒã‚¹ (Orders.db) ãŒè¡šç€ºã•れたす。 ls -la *.vbp *.frm *.bas *.db  倉換远跡甚にリポゞトリを初期化したす。 git add .  git commit -m "Baseline before VB6 to C# transformation"  次に、リファレンスドキュメントを含むリポゞトリをクロヌンしたす。このリポゞトリには、AWS Transform ã«ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãšã—お枡すビゞネスルヌルず倉換䟋が含たれおおり、組織の暙準に合ったコヌドを生成したす。 git clone -b dotnet-transform-custom https://github.com/aws-samples/dotnet-genai-samples.git  りォヌクスルヌ 以䞋のセクションでは、AWS Transform CLI を䜿甚しお VB6 コヌドをモダンな C# プロゞェクトに倉換する手順を説明したす。 ステップ 1: VB6 アプリケヌションを評䟡する 倉換定矩を䜜成する前に、VB6 ポヌトフォリオのスコヌプず耇雑さを把握したす。SKS リポゞトリをクロヌンした状態で、ATX CLI を起動しお評䟡を開始したす。 atx custom def exec -p <path-to-repository> \  -n 'AWS/early-access-comprehensive-codebase-analysis' \  -t  パラメヌタ : -p: ゜ヌスプロゞェクトのパス (クロヌンした SKS リポゞトリ) -n: 倉換定矩名 -t: å€‰æ›ã«é–¢ã‚ã‚‹ã™ã¹ãŠã®ãƒ„ヌルを信頌し、実行䞭に AWS Transform ãŒèš±å¯ã‚’求めお䞀時停止するのを防ぐ 泚意 2026 幎 5 月 1 日時点では、倉換定矩名は AWS/early-access-comprehensive-codebase-analysis から AWS/comprehensive-codebase-analysis に倉曎になっおいたす AWS Transform custom ã¯ã€ã‚·ã‚§ãƒ«ã‚¹ã‚¯ãƒªãƒ—トなどの特定のアクションを実行するために蚱可を必芁ずしたす。䞊蚘のコマンドの â€“t åŒ•数により、ツヌルはナヌザヌに継続的にプロンプトを衚瀺するこずなく実行できたす。 評䟡では SKS プロゞェクトを分析し、フォヌム数 (15 以䞊)、モゞュヌル数 (3)、COM コンポヌネントの䟝存関係 (MSFlexGrid、ListView)、デヌタベヌスアクセスパタヌン (ADO with SQLite)、掚定倉換耇雑床スコアを含む包括的なレポヌトを生成したす。 この評䟡レポヌトを䜿甚しお、VB6 アプリケヌションを倉換する際に AWS Transform custom に远加のコンテキストを提䟛したす。 ステップ 2: VB6 から C# ぞのカスタム倉換定矩を䜜成する 次に、VB6 からモダンな C# ぞの倉換パタヌンずルヌルをキャプチャするカスタム倉換定矩を䜜成したす。AWS Transform custom は、提䟛された䟋、ドキュメント、ビゞネスルヌルから孊習し、これらのパタヌンを䞀貫しお適甚したす。 察話型 CLI を起動したす。 atx -t  プロンプトが衚瀺されたら、倉換の説明ずしお VB6 to C# ASP.NET Core web application migration ず入力したす。AWS Transform custom は既存の倉換を怜玢し、この特定のシナリオに該圓するものが芋぀からない堎合、カスタム倉換を䜜成するかどうかを尋ねたす。「create a new one」ず入力しお確認したす。 図 1 – atx cli の起動 倉換コンテキストずビゞネスルヌルの提䟛  AWS Transform custom ã¯ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã€ç§»è¡Œã‚¬ã‚€ãƒ‰ã€ã‚µãƒ³ãƒ—ルコヌドの提䟛を求めたす。ここで組織固有の芁件を远加したす。SKS ã‚¢ãƒ—リケヌションに぀いおは、そのアヌキテクチャに関するコンテキストを提䟛したす。 Salmon King Seafood (SKS) ずいう VB6 MDI アプリケヌションがありたす。゜ヌスコヌドは <path-to-repository> にありたす。泚文受付、顧客管理、補品カタログ、圚庫管理、承認ワヌクフロヌなど、15 以䞊のフォヌムがありたす。3 ぀のモゞュヌル (デヌタベヌス接続甚の modConnection.bas、ナヌティリティ関数甚の modFunctions.bas、アプリケヌションの゚ントリ ポむント甚の modMain.bas) を䜿甚しおいたす。デヌタベヌスは SQLite で、デヌタ バむンディングを䜿甚した ADO デヌタ コントロヌルを介しおアクセスしたす。コントロヌルには、MSFlexGrid、ListView、Toolbar、ImageList、およびコントロヌル アレむが含たれたす。これを .NET 10 をタヌゲットずする ASP.NET Core Blazor Server アプリケヌションに倉換しおください。 組織向けの移行パタヌンのカスタマむズ  移行の粟床を向䞊させるために、組織固有のマッピングルヌルを提䟛したす。これらはナヌザヌが䜜成したマヌクダりンファむルで、AWS Transform custom からプロンプトが衚瀺された際に参照したす。AWS Transform custom はこれらを倉換プランに組み蟌みたす。プロンプトが衚瀺されたら、察話型セッション䞭に VB6 ゜ヌスコヌドずずもにこれらのファむルを参照したす。 図 2 – 倉換プランぞのビゞネスルヌルやその他のコンテキストの远加 倉換䟋の参照 <path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/example-transformations.md ファむルを確認したす。ATX ゚ヌゞェントがサンプル倉換を求めるプロンプトを衚瀺したら、以䞋のように参照したす。 倉換前埌の䟋は、<path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/example-transformations.md にありたす。 䌁業コヌディング芏玄の参照 AWS Transform custom ã§ã¯ã€çµ„織のコヌディング芏玄を倉換に䜿甚するこずでコヌド生成を制埡できたす。これには特定の C# ã®æ©Ÿèƒœã‚„芏玄を含めるこずができたす。AWS Transform custom はこれらを䜿甚しお、チヌムのスタむルに合ったコヌドを生成したす。<path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/coding-standards.md ファむルを確認したす。組織のプラクティスに合わせお独自の芏玄を䜜成できたす。 䟋 : <path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/coding-standards.md で定矩されおいるコヌディング芏玄を適甚しおください。 タヌゲットアヌキテクチャ仕様の参照 オプションずしお、 <path-to-repository>/dotnet-genai-samples/src/Amazon.GenAI.TransformCustom/vb6-csharp-references/target-architecture.md にあるような、望たしい出力アヌキテクチャを蚘述したドキュメントを䜿甚できたす。 AWS Transform custom ã¯å‚照されたすべおのファむルを読み取り、組織のパタヌン、芏玄、アヌキテクチャに合った倉換プランを生成したす。 生成された倉換定矩 あなたの入力に情報に基づいお、AWS Transform custom はフェヌズごずに敎理された包括的な倉換定矩を生成したす。 フェヌズ 1 – 分析 : VB6 コンポヌネントのむンベントリ、䟝存関係の特定、䟝存関係グラフの䜜成 フェヌズ 2 – プロゞェクト構造 : ASP.NET Core Blazor Server プロゞェクトの生成、NuGet パッケヌゞの蚭定、䟝存性泚入のセットアップ フェヌズ 3 – デヌタレむダヌ : ADO/DAO から Entity Framework Core ぞの倉換、DbContext ず゚ンティティモデルの生成 (適切な堎合は record 型を䜿甚) フェヌズ 4 – ビゞネスロゞック : モゞュヌルからサヌビスクラスぞの倉換 (プラむマリ コンストラクタヌを䜿甚)、関数から async メ゜ッドぞの倉換 フェヌズ 5 – UI レむダヌ : VB6 フォヌムから Blazor コンポヌネントぞの倉換、むベントハンドラの倉換 フェヌズ 6 – æ€œèšŒ : ビルド成功の確認、ナニットテストの生成、機胜的等䟡性のテスト 倉換定矩をすぐに適甚するか、レビュヌしお修正するか、レゞストリに公開しお再利甚するか、新しいプランを開始するかを遞択できたす。次のステップでは、倧芏暡に再利甚できるように倉換定矩を公開したす。 AWS Transform custom は倉換プランの名前ず説明を提案しおきたす。そのたた受け入れるか、必芁に応じお修正できたす。これで倉換定矩がチヌム党䜓で利甚可胜になりたす。 カスタム倉換定矩の衚瀺ず管理  公開埌、察話型゚ヌゞェントたたは以䞋の CLI コマンドを䜿甚しお、カスタム倉換定矩ず利甚可胜なすべおの AWS マネヌゞド倉換を衚瀺できたす。 atx custom def list 図 3 – ナヌザヌが䜜成したカスタム倉換プランの䞀芧 このコマンドは、AWS マネヌゞド倉換 (AWS/ プレフィックス付き) ずカスタム定矩の倉換の䞡方を衚瀺したす。カスタム定矩の䞋に VB6-to-CSharp-Blazor-Migration 倉換プランが衚瀺されたす。 ステップ 3: 倉換を実行する カスタム倉換定矩を公開したら、VB6 アプリケヌションのモダナむれヌションを実行できたす。プロンプトが衚瀺されたら、プロゞェクトに察しお倉換プランを実行したす。リポゞトリぞのパスず、倉換埌にプロゞェクトをビルドするためのビルドコマンドを䞎える必芁がありたす。 図 4 – 倉換を怜蚌するためのビルドコマンドの远加 以䞋のコマンドを䜿甚しお倉換プランを盎接タヌミナルから実行するこずもできたす。 atx custom def exec -p <path-to-repository>\  -n 'VB6-to-CSharp-Blazor-Migration' \  -t  AWS Transform custom が認識すべき远加のコンテキストを提䟛するかどうかを尋ねられたす。これは、保存された倉換定矩には含たれないその堎限りのコンテキスト (コヌド分析で生成されたドキュメントなど) を提䟛する堎合に䟿利です。 図 5 – 倉換プラン生成前の远加コンテキストの远加 プロンプトに回答するず、AWS Transform は実行たたはレビュヌ・修正するための倉換プランを生成したす。 図 6 – 倉換プランのレビュヌたたは続行 倉換プランの内容に問題なければ 続行する 倉換゚ヌゞェントは SKS プロゞェクトの構造を分析し、MDI コンテナ (frmMain.frm)、子フォヌム、モゞュヌル、デヌタベヌスパタヌンを特定しおから、倉換定矩を適甚したす。゚ヌゞェントは以䞋を倉換したす。 frmMain.frm (MDI コンテナ) → ナビゲヌションメニュヌ付きの Blazor MainLayout.razor frmCustomers.frm、frmProviders.frm など → 個別の Blazor ペヌゞコンポヌネント modConnection.bas → Entity Framework Core ず SQLite プロバむダヌを䜿甚した SksDbContext.cs modFunctions.bas → ドメむンごずに敎理された拡匵メ゜ッドクラス MSFlexGrid デヌタグリッド → デヌタバむンディング付きの Blazor テヌブルコンポヌネント ADO ãƒ‡ãƒŒã‚¿ã‚³ãƒ³ãƒˆãƒ­ãƒŒãƒ« â†’ async/await ã‚’䜿甚した Entity Framework Core ã‚¯ã‚šãƒª ステップ 4: ãƒ¬ãƒ“ュヌ、テスト、反埩 倉換が完了するず、AWS Transform custom は倉換されたコヌドを新しいブランチたたはディレクトリに出力し、倉換レポヌトず手動修正の次のステップを提瀺したす。 倉換結果のレビュヌ  倉換レポヌトには、以䞋を含む終了基準の怜蚌が含たれたす。 dotnet build が゚ラヌれロで成功 すべおの VB6 フォヌムが Blazor コンポヌネントに倉換枈み (䟋: frmCustomers.frm → Customers.razor、frmOrderReception.frm → OrderReception.razor) デヌタアクセスレむダヌが Entity Framework Core ず SQLite プロバむダヌおよび async パタヌンを䜿甚 (ADO/ADODC デヌタコントロヌルを眮換) COM 䟝存関係の排陀 — MSFlexGrid は Blazor テヌブルコンポヌネントに、Toolbar/ImageList は Blazor ナビゲヌションに眮換 ゚ラヌハンドリングが On Error 文から構造化された try-catch 䟋倖凊理に倉換 仕様に埓ったモダンな C# 機胜の適甚 (レコヌド型、プラむマリコンストラクタヌ、パタヌンマッチング) modConnection.bas が IDbContextFactory<SksDbContext> を䜿甚した登録枈み Dependency Injection (DI) サヌビスに倉換 AWS Transform は 1 回の実行で怜蚌基準を満たさない堎合がありたす。倉換の実行埌、成功した郚分ず倱敗した郚分のサマリヌを含む郚分的な倉換結果が埗られるこずがありたす。以䞋に倉換結果を瀺したす。 図 7 – 完了した倉換結果 フィヌドバックプロンプトから、未達成の基準に察凊するために倉換を再実行できたす。倉換された SKS ã‚¢ãƒ—リケヌションを怜蚌するには、タヌミナルに切り替えお以䞋を実行したす。 cd <path-to-your-project>  dotnet build  dotnet run  ブラりザで https://localhost:<port> ã«ã‚¢ã‚¯ã‚»ã‚¹ã—、以䞋に瀺すように Blazor ã‚¢ãƒ—リケヌションが受泚、顧客管理、商品カタログのペヌゞを正しくレンダリングするこずを確認したす。 図 8 – 請求曞䜜成ペヌゞ 図 9 – 泚文䜜成ペヌゞ 機胜が䞍足しおいる堎合は、CLI ã«ãƒ•ィヌドバックを返しお倉換結果を繰り返し改善したす。 Transform ã‚³ãƒžãƒ³ãƒ‰ã®ãƒ‘フォヌマンス Transform custom コマンドは、倉換察象のコヌドベヌスのサむズに応じお、完了たでに最倧 60 åˆ†ã‹ã‹ã‚‹å ŽåˆãŒã‚りたす。コヌドファむルや䟝存関係が倚い倧芏暡なプロゞェクトでは、圓然ながらより倚くの凊理時間が必芁になりたす。 倉換の制限事項に぀いお Transform custom の機胜では、VB6 アプリケヌションのすべおの機胜を自動的に倉換できるずは限りたせん。倉換完了埌、゜ヌスの VB6 ã‚¢ãƒ—リケヌションず倉換先の C# ã‚¢ãƒ—リケヌション間の機胜を比范・怜蚌する必芁がありたす。倉換されなかった䞍足機胜に぀いおは、 Kiro  ã‚„  Amazon Q Developer  ãªã©ã® AI 搭茉ツヌルを䜿甚しお、゜ヌスから倉換先のコヌドベヌスぞの倉換・移怍を支揎できたす。 ナニットテストの重芁性 ナニットテストは、倉換プロセス党䜓を通じお機胜の正圓性を怜蚌したす。倉換されたコヌドが元の VB6 アプリケヌションず同䞀の動䜜をするこずを確認し、倉換䞭に導入された䞍䞀臎やリグレッションを迅速に特定するのに圹立ちたす。倉換前に䞀連のテストを敎備しおください。これがリグレッションテストの基準ずなり、倉換埌も同等に動䜜するこずを怜蚌できたす。 たずめ 組織固有のパタヌン、ビゞネスルヌル、モダンな C# æ©Ÿèƒœã®èš­å®šã‚’含むカスタム倉換定矩を䜿甚するこずで、組織に蓄積された知芋を維持しながら数癟の VB6 ã‚¢ãƒ—リケヌションを䜓系的にモダナむズできるようになりたした。 倉換を䞀床定矩すれば、アプリケヌションポヌトフォリオ党䜓に適甚できたす。これにより、再利甚可胜な倉換定矩に組織に蓄積された知芋が保存されたす。フィヌドバックルヌプによる継続的な改善により、各倉換はより掗緎され、レコヌド型、プラむマリコンストラクタヌ、パタヌンマッチングなどのモダンな C# æ©ŸèƒœãŒã‚³ãƒŒãƒ‰ãƒ™ãƒŒã‚¹ã«è‡ªå‹•的に適甚されたす。モダナむズされたアプリケヌションは Linux ず AWS Graviton äžŠã§å‹•䜜し、むンフラストラクチャコストを削枛できる可胜性がありたす。 AWS Transform custom ã‚’䜿甚しお VB6 ã‚¢ãƒ—リケヌションポヌトフォリオのモダナむれヌションを始めたしょう。セットアップ手順に぀いおは、 AWS Transform custom Getting Started Guide  ã‚’ご芧ください。 远加リ゜ヌス AWS Transform custom Getting Started Guide AWS Transform custom Product Page AWS Transform custom Documentation AWS Transform custom Command Reference AWS Transform for .NET .NET on AWS Developer Center 翻蚳は゜リュヌションアヌキテクトの Yoshinori Sawada が担圓したした。原文は こちら です。 著者に぀いお David Kilzer David Kilzer は、AWS ゚コシステム内での Microsoft ワヌクロヌドの最適化を専門ずする゜リュヌションアヌキテクトです。C#、SQL Server、そしお AWS サヌビスを甚いた最新の゜フトりェア゜リュヌション構築に関する専門知識を有しおいたす。 Ashish Bhatia Ashish Bhatia は、AWS のシニア゜リュヌションアヌキテクトで、゚ンタヌプラむズのお客様のクラりドゞャヌニヌのガむドに泚力しおいたす。AWS のクラりドネむティブサヌビスを䜿甚しお最新の゜フトりェア゜リュヌションを構築するお客様を支揎するこずに情熱を泚いでいたす。たた、圌は Amazon Web Services のスペシャリスト゜リュヌションアヌキテクトです。最先端の生成 AI ゜リュヌションの䜜成に取り組み、お客様䞭心のアプロヌチを優先しおいたす。 Ty Augustine Ty Augustine は、.NET、SQL Server、コンテナを専門ずする Microsoft スペシャリスト゜リュヌションアヌキテクトです。ニュヌペヌクを拠点に、様々な業界の䌁業ず緊密に連携し、AWS クラりドぞの移行ずモダナむれヌションを加速させおいたす。AWS に入瀟する前は、20 幎以䞊にわたり Microsoft スタックの゜フトりェアアヌキテクトずしお掻躍しおいたした。
はじめに こんにちは、Checkout Reliabilityチヌムでバック゚ンド゚ンゞニアをしおいるかがの @ykagano です こちらは、「継続的な負荷テスト環境をBASEに構築したした」の第3回の蚘事です。 先に第1回、第2回を読んでいただくのをおすすめしたす。 継続的な負荷テスト環境をBASEに構築しました 〜 第1回: 負荷テストの全体像 - BASEプロダクトチームブログ 継続的な負荷テスト環境をBASEに構築しました 〜 第2回: 負荷生成ツールの構築と運用 - BASEプロダクトチームブログ こちらは第1回から玹介しおいるBASEの負荷テスト環境の構成図です。 負荷テスト環境の構成図 本蚘事では、モックツヌルずしお採甚したWireMockの遞定理由から、実際の構築・運甚方法たでを玹介したす。 モックツヌルの遞定 モックツヌルも芁求事項は負荷生成ツヌルず基本的には同じでした。 以䞋は第2回の蚘事からの芁求事項の匕甚です。 OSSである クラりドはコストずセキュリティの䞡面でハヌドルが䞊がるため 分散実行が可胜である 継続的負荷テスト環境ずしおスケヌリングは必芁 Web UIがある レポヌト品質が高い 孊習コストが䜎い メンバヌの誰もが利甚できるようにしたい 実瞟が豊富である OSSが今埌も保守される可胜性が高い こちらもOSSの比范衚を参考ずしお敎理したした。 ツヌル 分散実行可胜 Web UI 孊習コスト 実瞟が豊富 特城 WireMock △自前スクリプトが必芁 △暙準UIなし ○機胜が豊富 ◎ 業界暙準。機胜は匷いが、UIず分散は独自実装が必芁 MockServer △状態は共有できない ○ ○機胜が豊富 ○ UIあり・機胜も豊富 Smocker △分散は想定されおいない ○ ○YAML/JSON定矩が盎感的 △ UI特化・軜量。個人/小芏暡チヌム向け モックツヌルは他にも倚数あるのですが、実瞟や保守性がWireMockずMockServerが突出しおいるように感じたため、たずこの2぀を候補ずしたした。 そしお他のツヌルもWeb UIをそれぞれ実際に觊っおみた結果、SmockerのUIが䜿いやすく思えたため候補に加えた圢です。 しかし保守性を考えるず実瞟の豊富なWireMockが良いず思っおおり、UIの課題ず分散実行の郚分をクリアできないかず調査を進めたした。 継続的な負荷テストを実斜するためには、耇数のモックサヌバヌに察しお、スタブの蚭定を容易か぀即時で倉曎できるUIが必芁ず考えおいたためです。 WireMockのサヌドパヌティのUIも探したしたが、耇数のWireMockむンスタンスに即時で反映できるようなUIはありたせんでした。 そのため、個人的にWireMock HubずいうOSSを䜜るこずにしたした。 ykagano.github.io スタブの線集がUIから行え、耇数のWireMockむンスタンスに即時で反映できる機胜をメむンに実装しおいたす。 WireMockず組み合わせるこずで、䜿い勝手の良い負荷テスト甚のモックツヌルずなりたす。 wiremock.org WireMockの構築 ECSに構築したした。 䞋図では負荷テスト甚にWireMockを2台起動しおいたす。 Nginxは倖郚APIのRate-Limiter流量制限を再珟するために䜿甚しおいたす。 ECSでのWireMockの構成 たたその埌ろにWireMock HubのAll-in-One版を起動しおいたす。 1぀のコンテナの䞭にNginx + WireMock Hub + WireMockを内包しおいたす。 負荷テストのために、Web UIを持぀WireMock Hubがスタブデヌタの管理ずWireMockぞの同期を行いたす。 負荷テスト甚のWireMockは負荷テスト利甚時にだけ起動しおいたすが、WireMock Hubだけを日垞的に起動しおおくこずもできたす。 こうするこずで負荷テスト以倖の堎面でも、倖郚APIの異垞系のテストなどでWireMock Hubの内包するWireMockをUI付きで日垞的に䜿甚するこずができたす。 今回負荷テスト環境を構築したしたが、副産物ずしお、日垞的にWireMockを䜿甚できるようになったものずなりたす。 WireMock Hubの構成 WireMock HubはSQLiteのDBを持っおいたす。 プロゞェクトの配䞋にWireMockのむンスタンスずスタブが玐付く構造にしおいたす。 そのため、プロゞェクトの持぀スタブをむンスタンスに察しお入れ替えるこずも可胜になっおいたす。 プロゞェクト ├─ むンスタンス └─ スタブマッピング 実際にWireMock Hubに登録しおいるプロゞェクトです。 WireMock Hubのプロゞェクト画面 次はむンスタンスです。 WireMock Hubのむンスタンス画面 䟋えば、過去のプロゞェクトで䜿甚したスタブをもう䞀床䜿いたいずいう時に、プロゞェクトの持぀スタブを同期させお入れ替えるこずも、远蚘しお他のプロゞェクトで同期したスタブず同居するこずもできたす。 このように、WireMock HubはWireMockを1台だけ利甚したい堎合にも䟿利に䜿えるようになっおいたす。 WireMock Hubからのスタブ登録 WireMock Hubからのスタブの登録方法は以䞋の3皮類がありたす。 UIでのスタブ線集䞋図 Create Newボタンや線集アむコンボタン スタブファむルのむンポヌト機胜䞋図 Importボタン プロキシ機胜を䜿ったレコヌディング機胜䞋図サむドメニュヌのRecording WireMock Hubのスタブマッピング画面 このうち、負荷テスト環境の構築時は、䞻にレコヌディング機胜ずむンポヌト機胜を䜿っおいたした。 レコヌディング機胜 レコヌディング機胜はWireMockが暙準搭茉しおいる機胜です。 ただ䜕もスタブに登録しおいない堎合、レコヌディング機胜はずおも圹に立ちたす。 WireMock Hubのレコヌディング画面 レコヌディング画面でTarget URLを指定しお開始するず、WireMockが察象のURLに察するプロキシ䞭継サヌバになりたす。 この状態でBASEシステムず倖郚システムの間にWireMockを挟んで通垞のリク゚ストを通すこずができたす。 図にするずこのように右䞊から通垞の賌入リク゚ストがBASEシステムに入っおきたすが、 BASEシステムが巊のWireMockに倖郚サヌビスぞのリク゚ストを投げお、結果、倖郚サヌビスにリク゚ストが到達したす。 WireMockがプロキシずしお倖郚サヌビスに通信しおいる図 こうするこずで、WireMockに実リク゚ストが蚘録されたす。 レコヌディングを停止するずWireMockには蚘録された実リク゚ストがスタブずしお登録されたす。 WireMockのリク゚ストログにも蚘録されおいるため、リク゚ストログからWireMock Hubにスタブ登録するこずも可胜です。 その埌、汎甚的なスタブにするための調敎は必芁ですが、レコヌディング機胜を䜿えば、スタブデヌタを手で曞くこずなく登録できたす。 むンポヌト機胜 むンポヌト機胜はWireMock HubからWireMockのJSON圢匏ずOpenAPI圢匏の䞡方がむンポヌトできたす。 WireMock圢匏のJSON䟋 { " mappings ": [ { " request ": { " method ": " GET ", " url ": " /test " } , " response ": { " status ": 200 , " headers ": { " Content-Type ": " application/json " } , " body ": " { \" message \" : \" success \" } ", " fixedDelayMilliseconds ": 2000 } , " priority ": 5 , " persistent ": true , " name ": " テストだよ ", " scenarioName ": " test ", " requiredScenarioState ": " Started ", " newScenarioState ": " Step_2 ", " metadata ": { " hub_isActive ": true } } ] , " meta ": { " total ": 1 } } 䟋えばレコヌディング機胜で蚘録したスタブを、WireMockのJSON圢匏で゚クスポヌトしおおけば、以降はClaude Codeで線集するこずができたす。 䟋えばモニタリングツヌルに蚘録された倖郚APIの通信時間の平均をスタブの遅延時間fixedDelayMillisecondsに䞀埋で蚭定するずいったこずもできたすし、実際にこうしたスタブの蚭定調敎をClaude Codeを通しお行っおいたす。 WireMock HubからWireMockぞの自動同期 WireMock HubはWireMockずは疎結合なアプリケヌションずしお蚭蚈しおいたす。 そのため、ECSでWireMockを再デプロむした堎合、WireMock Hubに登録しおいたWireMockむンスタンスのIPアドレスが倉わっおしたうこずになりたす。 毎回、WireMockむンスタンスのIPアドレスを調べお再登録せずに枈むように、WireMock Hubにはむンスタンスの再登録APIを甚意しおいたす。 䞋図が同期凊理のシヌケンス図ずなりたす。 LambdaのAPI経由でむンスタンスIPリストを取埗し、WireMock HubのAPIに枡すこずで、むンスタンスIPアドレスを曎新し、WireMock Hubのプロゞェクトに玐付くスタブをWireMockに自動同期したす。 import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs'; mermaid.initialize({ startOnLoad: true }); sequenceDiagram participant gha as GitHub Actions participant tf as Terraform participant ecs as ECS Fargate<br/>(WireMock Worker) participant sd as Service Discovery<br/>(Cloud Map) participant lambda as Lambda<br/>(wiremock-sync) participant hub as WireMock Hub %% Phase 1: Terraform デプロむ Note over gha, ecs: Phase 1: Terraform デプロむ gha ->> tf : wiremock-hub apply activate tf tf ->> hub : WireMock Hub デプロむ activate hub tf -->> gha : apply 完了 deactivate tf gha ->> tf : wiremock apply activate tf tf ->> ecs : WireMock Worker デプロむ activate ecs ecs ->> sd : タスクIP自動登録HEALTHY note right of sd : wiremock-worker.cart-load-test.local<br>→ 172.20.10.x tf -->> gha : apply 完了 deactivate tf %% Phase 2: GitHub Actions による Lambda invoke Note over gha, lambda: Phase 2: Lambda invoke gha ->> lambda : aws lambda invoke activate lambda %% Phase 3: Lambda 凊理 Note over lambda, sd: Phase 3: Service Discovery からむンスタンス取埗 lambda ->> sd : discover_instancesHEALTHY のみ activate sd sd -->> lambda : むンスタンスIPリスト返华 deactivate sd %% Phase 4: Hub API → スタブ配信 Note over lambda, hub: Phase 4: Hub API 呌び出し → スタブ配信 lambda ->> hub : POST /hub/api/projects/{id}/instances/bulk-update note right of hub : {"instances": [...], "syncStubs": true} hub ->> hub : むンスタンスIP曎新 hub ->> hub : プロゞェクトのスタブ定矩を取埗 hub ->> ecs : POST /__admin/mappings各 Worker ecs -->> hub : スタブ登録完了 hub -->> lambda : 同期結果 lambda -->> gha : 完了 deactivate lambda deactivate ecs deactivate hub この仕組みによっお、WireMock偎の再デプロむをしおも、負荷テストに必芁なスタブは垞に担保されたす。 おわりに WireMockはノヌコヌドでスタブが䜜れたすので、開発䞭APIの代替や異垞系の通信テストなどにも䟿利です。 今回䜜ったWireMock環境は、カヌト機胜だけでなく、瀟内で誰でも䜿えるモックツヌルずしお日垞的に䜿っおいければず思いたす。 å…š3回の蚘事を最埌たでお読みいただきありがずうございたした モックを䜿ったテストに興味がありたしたらぜひ採甚情報をご芧ください binc.jp

動画

該圓するコンテンツが芋぀かりたせんでした

曞籍