TECH PLAY

SCSKクラりド゜リュヌション

SCSKクラりド゜リュヌション の技術ブログ

å…š1268ä»¶

LifeKeeperの『困った』を『できた』に倉えるサポヌト事䟋から孊ぶトラブルシュヌティング再発防止策 こんにちは、SCSKの前田です。 い぀も TechHarmony をご芧いただきありがずうございたす。 システムのリプレヌスやハヌドりェア曎新のタむミングで蚪れる、「ミドルりェアのバヌゞョンアップ」。 「サポヌト切れEOS察応」や「魅力的な新機胜の远加」など、OSのパッチ適甚ずはたた違った、期埅ず緊匵が入り混じる䞀倧むベントではないでしょうか。 しかし、HAクラスタヌ゜フトりェアであるLifeKeeperにおいお、この「バヌゞョンアップ」は単なるファむルの眮き換えではありたせん。 「むンストヌラヌを実行しお、バヌゞョン番号が䞊がれば完了」   そう思い蟌んで䜜業を進めた結果、再起動埌に蚭定ファむルが初期倀に戻っおいたり、長幎動いおいたスクリプトが突然゚ラヌを吐き始めたりずいった、予期せぬトラブルに盎面するこずがありたす。 本連茉䌁画「LifeKeeper の『困った』を『できた』に倉えるサポヌト事䟋から孊ぶトラブルシュヌティング再発防止策」では、サポヌトセンタヌに蓄積された「生のトラブル事䟋」を元に、安定運甚のための実践的な知恵を共有しおいきたす。 はじめに成功ぞのロヌドマップを描く 連茉第2回ずなる今回は、LifeKeeper本䜓やDataKeeperのバヌゞョンアップに焊点を圓おたす。 バヌゞョンアップ䜜業においお、最も怖いのは 「芋えない倉化」 です。 むンストヌラヌは䟿利ですが、それが裏偎でどの蚭定を匕き継ぎ、どの蚭定をリセットするのか、たた新しいバヌゞョンが叀い蚭定をどう解釈するのかは、リリヌスノヌトの现郚を読み蟌たない限り芋えおきたせん。 今回は、実際にサポヌトぞ寄せられた「バヌゞョンアップ倱敗事䟋」を以䞋の3぀の「萜ずし穎Trap」に分類したした。 蚭定ず環境の「サむレント倉化」 過去の「たあいいか」が牙をむく 近道は「急がば回れ」 これらの事䟋から「なぜ倱敗したのか」を孊び、確実に成功させるためのチェックポむントロヌドマップを解説したす。 その他の連茉䌁画は以䞋のリンクからどうぞ 【リ゜ヌス起動・フェむルオヌバヌ倱敗の深局 #1】EC2リ゜ヌスが起動しないクラりド連携の盲点ずデバッグ術 – TechHarmony 【リ゜ヌス起動・フェむルオヌバヌ倱敗の深局 #2】ファむルシステムの思わぬ萜ずし穎゚ラヌコヌドから原因を読み解く – TechHarmony 【リ゜ヌス起動・フェむルオヌバヌ倱敗の深局 #3】蚭定ミス・通信障害・バヌゞョン違いの深局ず再発防止策 – TechHarmony 【OS・LKバヌゞョンアップで泣かないために #1】OSバヌゞョンは倉えおいないのにカヌネル曎新の「萜ずし穎」ず互換性の真実 – TechHarmony 【実録】LifeKeeperバヌゞョンアップの「困った」事䟋ファむル ここからは、実際のサポヌト問い合わせをベヌスにしたケヌススタディです。 「自分の環境でも起こりうるかもしれない」 ずいう芖点でご芧ください。 Trap 1蚭定ず環境の「サむレント倉化」 バヌゞョンアップによっお、今たで䜿っおいた蚭定や環境が 「静かに」 倉わっおしたう ケヌスです。 ■ケヌスAアップデヌトしたら蚭定が消えたLinux版 「v9.5.2からv9.9.1ぞアップデヌトしたした。゚ラヌなく完了したのですが、再起動埌になぜかプロキシ蚭定などが効かなくなっおいたす 」 発生状況:  ã‚¢ãƒƒãƒ—デヌト䜜業自䜓は成功したものの、LifeKeeperの動䜜蚭定ファむル /etc/default/LifeKeeper に蚘述しおいたカスタム蚭定が消倱しおいたした。 原因: LifeKeeperの仕様により、曎新むンストヌル時に 䞀郚の蚭定ファむルがデフォルト倀に戻る䞊曞きされる 挙動ずなっおいたした。 教蚓:  ã€Œèš­å®šã¯ã™ã¹ãŠè‡ªå‹•的に匕き継がれるはず」ずいう思い蟌みは危険です。特にメゞャヌバヌゞョンをたたぐ曎新では、バックアップず埩元手順が必須です。 ■ケヌスBスクリプトが動かないPerlの眠Windows版 「v8.9からv8.10.2ぞ䞊げようずしおいたす。パラメヌタ倉曎は䞍芁ず聞きたしたが、本圓にそのたた䞊げお倧䞈倫でしょうか」 リスク:  èª¿æŸ»ã®çµæžœã€LifeKeeperに同梱されおいるPerlのバヌゞョンが、v8.10.1以降で「5.8系」から「5.32系」ぞず䞀気にアップグレヌドされおいるこずが刀明したした。 教蚓:  Genericリ゜ヌスなどでPerlスクリプトを䜿甚しおいる堎合、蚀語仕様の倉曎によりスクリプトが動䜜しなくなる可胜性がありたす。アプリケヌションだけでなく、ミドルりェアが䟝存する 「蚀語環境」の倉化 も重芁なチェックポむントです。 Trap 2過去の「たあいいか」が牙をむく 叀いバヌゞョンでは蚱容されおいたあるいは無芖されおいた蚭定の䞍備が、新しいバヌゞョンの「厳栌なチェック」によっお゚ラヌずしお顕圚化するケヌスです。 ■ケヌスC亡霊IPがアラヌトを匕き起こす 「OSずLifeKeeperを曎新した埌、ログに failed quickCheck due to ALRM signal ずいう゚ラヌが倚発するようになりたした。以前は出おいなかったのですが 」 原因:  IPリ゜ヌスの監芖リスト pinglist に、既に撀去枈みで疎通できない叀いIPアドレスが残っおいたした。 なぜ今:  ãƒãƒŒã‚žãƒ§ãƒ³ã‚¢ãƒƒãƒ—に䌎い チェック凊理やリトラむの挙動が倉化厳栌化 し、叀いIPぞの応答埅ちが積み重なった結果、タむムアりトALRM signalが発生しおいたした。 教蚓:  ã€Œä»Šã¯äœ¿ã£ãŠã„ないけど残っおいる蚭定」は、バヌゞョンアップ時の最倧の敵です。曎新䜜業はゎミ掃陀の絶奜の機䌚ず捉えたしょう。 ■ケヌスDディスクに名前がないUUID問題 「バヌゞョンアップ埌、DataKeeperリ゜ヌスで『䞀意の識別子がない』ずいう譊告が出たり、パヌティション情報が正しく取埗できなくなりたした」 原因:  LifeKeeper/DataKeeperの新しいバヌゞョンでは、ディスクを䞀意に特定するために 「UUID」の䜿甚が必須化たたは厳栌化 されたした。叀い環境で「MBR圢匏」のパヌティションを䜿っおいたため、UUIDを持たず、新しいバヌゞョンの芁件を満たせなくなっおいたした。 教蚓:  ã‚œãƒ•トりェアの進化に合わせお、むンフラ偎パヌティションテヌブル等もGPT圢匏ぞのモダン化が必芁になるこずがありたす。 Trap 3近道は「急がば回れ」 手順を省略したり、無理なアップデヌトパスを通ろうずしお倱敗するケヌスです。 ■ケヌスE飛ばしすぎたバヌゞョンアップ 「v9.6.xからv9.8.1ぞ䞀気にアップデヌトしようずしたら倱敗したした。2䞖代前からの曎新はサポヌトされおいるはずですが 」 原因:  åŸºæœ¬çš„には盎接アップデヌトが可胜ですが、 この特定のバヌゞョンv9.8.1においおは 内郚パッケヌゞの倧幅な構成倉曎 があったため、䟋倖的にv9.7やv9.8.0を経由する「ステップアップグレヌド」が必芁でした。 教蚓:  ã€Œã„぀ものルヌルN-2たでOKなどが今回も適甚される」ずは限りたせん。リリヌスノヌトには必ず 「アップグレヌドの泚意点」や「䟋倖的なパス」 が蚘茉されおいたすので、慣れおいる䜜業でも必ず目を通したしょう。 ■ケヌスFGUIの衚瀺がおかしい 「DataKeeper曎新埌、GUI䞊でゞョブ情報が衚瀺されなくなりたした」 解決策: 調査の結果、内郚情報の䞍敎合が起きおいたした。このケヌスでは、無理に修正するよりも「再むンストヌルしおゞョブを再䜜成」した方が、結果ずしお早く、確実に解消したした。 教蚓:   バヌゞョンが倧きく離れおいる堎合や挙動がおかしい堎合 は、䞊曞きアップデヌトに固執せず、蚭定バックアップをずった䞊での「䜜り盎し再䜜成」が最短ルヌトになるこずがありたす。 「再発させない」成功ぞのチェックリスト 䞊蚘の倱敗事䟋から導き出した、バヌゞョンアップ䜜業前に確認すべき「転ばぬ先の杖」チェックリストです。蚈画段階でぜひご掻甚ください。 ■LifeKeeper/DataKeeper バヌゞョンアップ事前確認シヌト [  ] 【パスの確認】 珟圚のバヌゞョンからタヌゲットバヌゞョンぞ「盎接」アップデヌト可胜ですか䞭継バヌゞョンが必芁ありたせんか [  ] 【蚭定ファむルのバックアップ】 曎新時に初期化されるファむル /etc/default/LifeKeeper 等を特定しおいたすか それらの手動バックアップを取埗し、曎新埌に埩元する手順を組み蟌みたしたか [  ] 【蚀語・環境の差異】 PerlやPythonなど、LifeKeeperが利甚するランタむムのバヌゞョンに倉曎はありたせんか自䜜スクリプトぞの圱響確認 ディスクのパヌティション圢匏は新しいバヌゞョンの芁件UUID必須/GPT掚奚などを満たしおいたすか [  ] 【䞍芁蚭定の削陀ゎミ掃陀】 IPリ゜ヌスの pinglist に、珟圚疎通できない「亡霊IP」が残っおいたせんか [  ] 【OSずの敎合性】 OS自䜓のカヌネルアップデヌトを行う堎合、LifeKeeperの再むンストヌルやモゞュヌル再コンパむルの手順を確認したしたか [  ] 【リカバリプラン】 曎新むンストヌルが䞍敎合を起こした堎合に備え、䞀床アンむンストヌルしお「新芏むンストヌル蚭定埩元たたは再䜜成」に切り替える刀断基準を持っおいたすか ベストプラクティス成功ぞの近道 トラブルを防ぐために、明日からできる「ベストプラクティス」を3぀提案したす。 「リリヌスノヌト」は宝の地図 リリヌスノヌトを「バグ修正のリスト」だず思っおいたせんか 本圓に芋るべきは「制限事項 (Known Issues)」 ず 「倉曎点 (Migration/Changes)」です。ここには「蚭定ファむルが初期化される」「UUIDが必須になる」ずいった重芁情報が必ず曞かれおいたす。 ステヌゞング環境でのリハヌサルは必須 机䞊の確認だけでは、「pinglistのタむムアりト」や「Perlの互換性」ずいった環境䟝存のトラブルは芋抜けたせん。本番環境のクロヌンたたは同等構成を甚意し、実際にバヌゞョンアップ手順を流すリハヌサルを行っおください。 倧幅な曎新は「再䜜成」も芖野に 数幎前のバヌゞョンから䞀気に最新版にするような堎合、継ぎ接ぎのアップデヌトを繰り返すより、「蚭定情報を控えお、クリヌンむンストヌル埌に再蚭定する」方が、朜圚的なゎミが残らず、結果的に安定皌働に぀ながるこずが倚々ありたす。「䞊曞き」にこだわらない柔軟性も重芁です。 たずめ バヌゞョンアップ時のトラブルは、倚くの堎合「準備䞍足」や「思い蟌み」の隙間に入り蟌むものです。 しかし、今回ご玹介した事䟋のように、事前に 「䜕が倉わるのか」「䜕が消えるのか」「今の蚭定にゎミはないか」 を確認しおおけば、そのほずんどは防げたす。 「LifeKeeperの『困った』を『できた』に倉える」 今回のロヌドマップを参考に、ぜひ安心・安党なバヌゞョンアップ蚈画を立おおください。 次回予告 次回からは新章に突入 テヌマは「クラりド環境特有の萜ずし穎AWS/Azure連携でハマるポむント」です。 クラりドならではの「オンプレミスず同じ感芚で蚭定したら動かない」ずいうトラブル。 その第䞀匟ずしお、 AWS環境でのLifeKeeper安定皌働術 にフォヌカスしたす。 「Route53のDNSが切り替わらない」「䟿利なはずの『Auto Recovery』がLifeKeeperず喧嘩する」ずいったAWS特有の事䟋ず、EC2・S3連携の泚意点を培底解説したす。お楜しみに 詳しい内容をお知りになりたいかたは、以䞋のバナヌからSCSK LifeKeeper公匏サむトたで
こんにちは。SCSK志村です。 Azure SQL Database で SQL Server を構成する際の蚭定項目に「接続ポリシヌ」がありたす。 蚭定倀は「既定倀」「リダむレクト」「プロキシ」の3皮類から遞択したすが、この「既定倀」蚭定における挙動特に Private Endpoint 利甚時に぀いお、私がドキュメントを読み間違えお悩んでしたったため、備忘録ずしお蚘事にしたした。 1. ドキュメントの蚘茉 接続ポリシヌは以䞋の公匏ドキュメントに蚘茉されおいたす。 接続のアヌキテクチャ – Azure SQL Database | Microsoft Learn ドキュメントによるず、遞択できるポリシヌは以䞋の3぀のオプションで構成されおいたす。 リダむレクト (掚奚): クラむアントは、デヌタベヌスをホストしおいるノヌドぞの盎接接続を確立したす。これにより、埅機時間が短瞮され、スルヌプットが向䞊したす。 ※ポヌト 11000 - 11999 および 1433 の蚱可が必芁です。 プロキシ: すべおの接続が Azure SQL Database ゲヌトりェむ経由でプロキシ化されたす。埅機時間が長くなりスルヌプットが䜎䞋する可胜性がありたすが、必芁なポヌトは 1433 のみです。 既定倀: 明瀺的に接続ポリシヌを倉曎しない限り有効になる蚭定です。接続元に応じお、自動的に以䞋の挙動を䜿い分けたす。             Azure 内からの接続䟋Azure VM → Redirect ずしお動䜜 倖郚からの接続䟋ロヌカルPC → Proxy ずしお動䜜 こちらの蚘事を読んで、私は最初、以䞋のような解釈をしおいたした。 圓初の私の解釈 「Azure内仮想マシンから発信する接続は『Redirect』だから、VMからSQL Databaseぞの接続Private Endpoint経由も、リダむレクトになるはずだ。」 しかし、実際には Private Endpointプラむベヌト゚ンドポむント接続の堎合、 既定倀は「プロキシ」ずなりたす。 この事実は別のドキュメントに蚘茉しおありたした。 Azure Private Link – Azure SQL Database | Microsoft Learn クラむアントは明瀺的に リダむレクト接続ポリシヌを遞択する 必芁がありたす。 既定 の接続ポリシヌを䜿甚する既存のプラむベヌト ゚ンドポむントでは、ポヌト 1433 でプロキシ接続ポリシヌを䜿甚したす。 これを行う理由は、リダむレクトに必芁なポヌト範囲が開いおいないこずが原因でクラむアントのトラフィックが SQL Database に到達できなくなる状況を回避するためです。 Private Endpoint 経由では、リダむレクト接続ポリシヌを明瀺的に指定する必芁があるずいうこずですね。 リダむレクトに必芁なポヌト範囲が開いおいないこずに察するケアずしお、既定倀がプロキシになっおいるようです。 事実はドキュメントからわかりたしたが、せっかく調べたので実機怜蚌もしおみたした。 2. 実機怜蚌 VMから Private Endpoint 経由で SQL Database ぞ接続した時の 接続ポヌト を比范しおみたした。 確認方匏 SSMSで Azure SQL Database に接続し、 netstat コマンドで接続ポヌトを確認 怜蚌結果サマリ たずめるず以䞋の通りです。「既定倀」は「プロキシ方匏」で通信しおいるこずがわかりたす。 蚭定倀 接続ポヌト 通信方匏 リダむレクト 1433以倖 (䟋: 12119) リダむレクト接続 プロキシ 1433 プロキシ接続 既定倀 1433 プロキシ接続  å‚考コマンド実行結果クリックで展開 コマンド実行結果です。 ① リダむレクト蚭定の堎合 â–Œ netstat 結果ポヌト 12119 (Redirect) TCP 10.0.0.4:53852 10.x.x.x:12119 ESTABLISHED ② プロキシ蚭定の堎合 â–Œnetstat 結果ポヌト 1433 (Proxy) TCP 10.0.0.4:53855 10.x.x.x:1433 ESTABLISHED ③ 既定倀の堎合         â–Œ netstat 結果ポヌト 1433 (Proxy) VMからの接続ですが、ポヌトは1433ずProxyず同じポヌトになっおいたす。 TCP 10.0.0.4:53860 10.x.x.x:1433 ESTABLISHED 3. たずめ Azure SQL Database ぞの接続は、Microsoft ずしおはリダむレクトを掚奚しおいたす。 ※2026幎2月時点でプロキシ掚奚ず読み取れる蚘述もありたすが、恐らく自動翻蚳によるミスです。 それにも関わらず既定倀がプロキシなのは、ナヌザヌが耇雑なネットワヌク芁件を意識せずずも繋がるこずを優先した安党偎の蚭蚈思想だず思われたす。あくたで所感ですが 接続方匏の違いはパフォヌマンスに盎結するため、この仕様は蚭蚈時にしっかり把握しおおきたいポむントです。 この蚘事が、Azure における SQL Database 蚭蚈のご参考になれば幞いです。
こんにちは、SCSKの坂朚です。 AWS環境でのシステム監芖においお、暙準機胜である Amazon CloudWatch を利甚されおいる方は倚いず思いたす。CloudWatchのアラヌムは通垞メヌルSNS等で通知されたすが、運甚が倧芏暡になるず「倧量のメヌルに埋もれる」「察応状況がわからない」ずいった課題が発生しがちです。 そこで、むンシデント管理ツヌルである PagerDuty ず連携するこずで、以䞋のような運甚の䞀元化・効率化によるメリットが生たれたす。 アラヌトの集玄ず䞀元管理 CloudWatchだけでなく、オンプレミスのZabbixやAzureなど、様々な監芖ツヌルからのアラヌトをPagerDutyに集玄できたす。 柔軟なオンコヌル管理 「平日日䞭は担圓者A、倜間䌑日は担圓者B」「15分反応がなければマネヌゞャヌぞ゚スカレヌション」ずいった柔軟な通知ルヌルを、AWS偎の蚭定を倉曎せずにPagerDuty偎だけで管理できたす。 ステヌタスの同期自動Resolve CloudWatchでアラヌム状態ALARMになったらPagerDutyでむンシデント起祚、CloudWatchが正垞OKに戻ったらPagerDutyも自動クロヌズResolve、ずいうようにステヌタスを同期させるこずで、手動でのチケットクロヌズ䜜業をなくすこずができたす。 今回は、この連携の䞭栞ずなる CloudWatchからPagerDutyぞむベントを送り、自動埩旧させる蚭定 にフォヌカスしお解説したす。   連携の仕組み 本蚘事で構築する連携フロヌは以䞋の通りです。 CloudWatchのアラヌム状態の倉化をトリガヌに、Amazon SNSぞメッセヌゞを送信し、それをPagerDutyのHTTPS゚ンドポむントが受け取る圢になりたす。 [CloudWatch Alarm] –(状態倉化)–> [Amazon SNS] –(HTTPS)–> [PagerDuty] –(通知)–> [運甚担圓者] 特に重芁なのが、 障害怜知(ALARM) だけでなく 埩旧(OK) の通知も送る 点です。これにより PagerDuty䞊のむンシデントが自動的に解決枈み になりたす。   PagerDuty偎の蚭定 たずは受け皿ずなるPagerDuty偎の蚭定を行い、通知先ずなるURLを取埗したす。 PagerDutyのメニュヌから  [Services] > [Service Directory]  ã‚’開き、 [+ New Service] をクリックしたす。     Serviceの名称䟋: CloudWatchAlertsなどを入力し、Integrationの蚭定画面たで進みたす。 Integration Typeの遞択で、 Amazon CloudWatch  ã‚’怜玢しお遞択チェックしたす。 [Create Service]  ã‚’クリックしおサヌビスを䜜成したす。   サヌビス䜜成埌に衚瀺される画面で、 Integration URL  https://events.pagerduty.com/integration/xxxxxxxx... をコピヌしおおきたす。このURLがAWS偎からの通知先ずなりたす。   AWS偎の蚭定SNSトピックの䜜成 次にAWSマネゞメントコン゜ヌルで、PagerDutyぞ通知を送るためのSNSトピックを䜜成したす。 Amazon SNS  ã‚³ãƒ³ã‚œãƒŒãƒ«ã‚’開き、 トピックの䜜成 ぞ進みたす。 タむプは ã‚¹ã‚¿ãƒ³ãƒ€ãƒŒãƒ‰ã‚’遞択し、名前䟋:  pagerduty-cloudwatch-topic を入力しおトピックを䜜成したす。   䜜成したトピックの画面で  [サブスクリプションの䜜成] をクリックしたす。以䞋の通り蚭定し、䜜成したす。 プロトコル :  HTTPS ゚ンドポむント : 先ほどPagerDutyで取埗した  Integration URL を貌り付け これで、このSNSトピックにメッセヌゞが飛ぶず、自動的にPagerDutyぞ連携されるパむプラむンが完成したした。 ※PagerDutyの連携URLは自動的にサブスクリプションの確認Confirmを行うため、手動での承認䜜業は䞍芁です。   AWS偎の蚭定CloudWatchアラヌムの蚭定 最埌に、CloudWatchのアラヌム蚭定で、先ほどのSNSトピックをアクションに指定したす。 CloudWatchのアラヌム䜜成 たたは線集画面の「アクションの蚭定」にお、以䞋の2぀の通知を蚭定したす。 ① 障害発生時の通知Trigger アラヌム状態トリガヌ: アラヌム状態 を遞択 SNSトピックの遞択: 䜜成した pagerduty-cloudwatch-topic を遞択 ② 埩旧時の通知Resolve   ここが自動埩旧を実珟するための肝ずなる蚭定です。 アラヌム状態トリガヌ: OK を遞択 SNSトピックの遞択: ①ず同じ pagerduty-cloudwatch-topic を遞択   このように「アラヌム状態」ず「OK状態」の䞡方で同じPagerDuty連携甚トピックぞ通知するように蚭定するこずで、 PagerDuty偎がメッセヌゞの内容AlarmかOKかを刀別し、むンシデントの起祚ずクロヌズを自動で行っおくれるようになりたす 。   動䜜確認 蚭定が完了したら実際に動䜜を確認しおみたしょう。   障害発生Trigger 察象のメトリクスが閟倀を超えるように調敎したす。   CloudWatchアラヌムが「アラヌム状態」になるず、PagerDuty䞊でむンシデントが Triggered状態になるこずを確認 できたした。   自動埩旧Resolve その埌、CloudWatchアラヌムを「OK」状態に遷移させたす。 するず、PagerDutyのアクティビティログに “Resolved through the integration API” ず衚瀺され、 むンシデントステヌタスが自動的に Resolved解決枈み に倉わるこずを確認したした 。   たずめ Amazon CloudWatchずPagerDutyを連携するこずで、単なるメヌル通知では難しかった「むンシデントの䞀元管理」ず「ステヌタスの自動同期」が実珟できたす。 特にCloudWatchの OKアクション を蚭定しおおくこずで、倜間に䞀時的な高負荷でアラヌトが鳎ったずしおも、負荷が䞋がれば自動でクロヌズされるため、運甚担圓者が手動で「解決枈みにする」ずいうオペレヌションから解攟されたす。 Zabbixずの連携ず合わせお導入するこずで、ハむブリッド環境でも迷うこずなくPagerDutyだけを芋おいれば良い状態を䜜り出せるため、ぜひ導入を怜蚎しおみおください。   â–Œ AWSに関するおすすめ蚘事 Gemini掻甚フロヌチャヌトからチャットボット(Amazon Lex)を自動構築しおみた Geminiを掻甚しExcelからAWS LexのTerraformコヌドを自動生成する手法を解説。IAMロヌルや䌚話分岐の自埋的な刀断など、AIによる開発効率化の実䟋を玹介。むンフラ構築の工数削枛に圹立぀゚ンゞニア必芋の掻甚術です。 blog.usize-tech.com 2026.01.22 Terraformで実装するAWSファむルストレヌゞ入門EFSずFSxを構築しおみた Terraformを䜿い、AWSのファむルストレヌゞであるEFSずFSx for Windowsの構築手順を解説したす。Linux/Windowsそれぞれに最適なストレヌゞをIaCでコヌド管理。むンフラ構築の再珟性を高め、効率化を実珟したい方はぜひご芧ください。 blog.usize-tech.com 2025.12.15 【Amazon Bedrock】ナレッゞベヌスを甚いた瀟内資料管理ヌめざせ生産性向䞊ヌ 瀟内資料の管理、効率的ですか様々な圢匏の文曞が散圚し、必芁な情報を探すのに時間を取られおいたせんか ファむルサヌバヌの奥底に埋もれどこにあるか分からない、バヌゞョン管理が混乱する、などずいった課題を抱えおいたせんかこれらの非効率は、業務の生産性䜎䞋に盎結したす。 今こそ、瀟内資料の䞀元管理䜓制を芋盎したしょうずいうこずで、AWS Bedrockのナレッゞベヌスを甚いた資料の䞀括管理およびその怜玢方法をご玹介したす blog.usize-tech.com 2025.02.14
SCSKの畑です。 初投皿以来ほが Web アプリケヌション開発およびサヌバレスアヌキテクチャの話しかしおこなかったのですが、別の案件で最近にしおは珍しくデヌタベヌス関連のサヌビスAmazon RDS/Amazon ElastiCacheを扱っおいたりするので、ボチボチそちらの話題に぀いおも曞いおいこうず思いたす。たあ Elasticache は KVS (Key-Value Storeでデヌタベヌス関連のサヌビスずたずめおしたうべきではないず思い぀぀も、文章的にそうした方が楜なので芋逃しおください。 ちなみに同案件における RDS は Aurora MySQL 及び RDS for MySQL あたりが䞭心です。ずいうこずで最初は小ネタから。   本題 RDS にはマネヌゞドな PITR (Point-In-Time Recovery機胜がありたす。マネゞメントコン゜ヌル䞊では「特定時点ぞの埩旧」メニュヌが該圓したす。 同案件では MySQL のレプリケヌションを䜿甚しおいるのですが、特定の障害パタヌンにおけるMySQL のレプリケヌションの埩旧手順においお同機胜を䜿甚する予定で、マネゞメントコン゜ヌルから䜿い方や機胜を怜蚌しおいたした。その際、トヌタルでの埩旧時間を短瞮するために「 PITR 可胜な最新の時刻たで PITR する 」手順にしようず考えおいたした。ただ、同機胜における RPO は 以䞋 URL の通り最倧 5 分ずなっおいたす。 Amazon RDS の DB インスタンスを特定の時点に復元する - Amazon Relational Database Service Amazon RDS DB むンスタンスを特定の時点に埩元したす。 docs.aws.amazon.com RDS は、DB むンスタンスのトランザクションログを 5 分ごずに Amazon S3 にアップロヌドしたす。 Amazon RDS を䜿った灜害埩旧戊略の実装 | Amazon Web Services Amazon RDS (Relational Database Service) は、リレヌショナルデヌタベヌ aws.amazon.com ご䜿甚の DB むンスタンスで自動バックアップが有効化されおいるず、Amazon RDS は 1 日の党デヌタをスナップショットずしお自動的に保存したす。このスナップショットは、蚭定されたバックアップりィンドりの間に実行されたす。同時にこの凊理は、Amazon S3 ぞのトランザクションログを、(DB むンスタンスが曎新される) 5 分間に䞀床キャプチャヌしたす。 基本的に RDBMS における PITR は、特定断面のバックアップをリストアした埌に、デヌタベヌスに察する曎新内容ず時刻情報がセットで蚘録されおいるトランザクションログREDOログ、バむナリログなど呌び方は補品によっお異なりたすをロヌルフォワヌドリカバリするこずで実珟したす。぀たり䞊蚘泚釈の文蚀に埓っお蚀い換えるず、トランザクションログがどの時点たで S3 にキャプチャヌされおいるのかによっお、どの時点たで DB をリカバリできるのかが倉わっおくるずいうこずになりたす。そしお取埗間隔は5分間であるため、RPO も最倧5分ずなりたす。 䞊蚘のような仕組みであるが故に、どの時刻たで PITR できるのかをどうやっお確認するのかなず圓初考えおいたのですが、以䞋のように「埩元可胜な最新時刻」ずいう項目があり時刻情報も衚瀺されおいるため、この項目を遞択しお RDS を埩旧すれば PITR 可胜な最新の時刻たで PITR するこずが可胜 ず考えたした。 念のため、察象の RDS に察しお 0.1 – 0.2 秒ごずにレコヌドを INERT しおいる状態で、先述の通り「埩元可胜な最新時刻」を遞択した䞊で PITR の動䜜を怜蚌しおみたずころ、以䞋のように想定通りの時点たでデヌタがリカバリされおいるこずを確認したした。なお、仕様䞊手順怜蚌時の状況を再珟できないので、今回の゚ントリ甚に再珟詊隓したものを茉せおいる点ご了承ください。 PITR の期埅動䜜は 「指定した時刻」の盎前の曎新たでがリカバリされおいるこず です。䞊蚘䟋のように 2026-02-08 14:34:21 を指定しお PITR した堎合は、2026-02-08 14:34:20.999… たでの曎新がリカバリされ、DB 䞊に反映されおいるこずが期埅されたす。 なお、補品やサヌビスによっおは異なる挙動をする可胜性も0ずは蚀えないですが、私が今たで觊っおきた RDBMS では党お同じ挙動をしおいたしたので基本的には共通認識のはず・・です。 mysql> select * from record_table order by id; +------+---------------------+ | id | updated_at | +------+---------------------+ | 9309 | 2026-02-08 14:34:20 | | 9308 | 2026-02-08 14:34:20 | | 9307 | 2026-02-08 14:34:20 | | 9306 | 2026-02-08 14:34:20 | | 9305 | 2026-02-08 14:34:20 | | 9304 | 2026-02-08 14:34:20 | | 9303 | 2026-02-08 14:34:20 | | 9302 | 2026-02-08 14:34:19 | | 9301 | 2026-02-08 14:34:19 | | 9300 | 2026-02-08 14:34:19 | 䞭略 9310 rows in set (0.03 sec) そこで改めお MySQL のレプリケヌション埩旧も含めた䞀連の埩旧手順をテストしおみたずころ・・なんず埩旧した MySQL のレプリケヌションにおデヌタの䞍敎合が発生し、゚ラヌで停止しおしたいたした。具䜓的には、レプリケヌションにお本来䌝播されるべき曎新が PITR におリカバリしたデヌタに既に含たれおおり、デヌタの䞍敎合重耇が発生しおしたったのが原因でした。䞀連の手順におけるオペミスはなかったこずから、先般 PITR によりリカバリしたデヌタに問題があるのではないかず考えたした。 蟌み入った話になるので今回の障害パタヌンにおける䞀連の埩旧手順に぀いおは深堀したせんが、ものすごく簡単に説明するず「MySQL のデヌタをマネヌゞド PITR で特定時刻の断面にリカバリした埌、その時刻以降のトランザクションログを察象ずしおレプリケヌションするこずで埩旧する」ずいう手順でした。 このため、PITR が先述したような期埅動䜜をしないず、レプリケヌションによる曎新デヌタの欠損ないしは重耇が発生し、デヌタの䞍敎合が発生しおしたいたす。今回発生した事象は埌者曎新デヌタの重耇ですね。 そこで、改めおリカバリ盎埌のデヌタ断面を芋たずころ・・なんず、以䞋のように 2026-02-08 14:34:21 の曎新デヌタが含たれおおり、想定より先の時点たでデヌタがリカバリされおしたっおいるこずが発芚したした。2026-02-08 14:34:21 の曎新デヌタが4件含たれおいる分、合蚈のレコヌド数も1回目のリカバリデヌタず比范しお増えおいたす。 なお「埩元可胜な最新時刻」の仕様䞊同じ条件でのリトラむができないため、以䞋デヌタ䟋は1回目のリカバリ操䜜においお異なる結果ずなったデヌタを想定しお蚘茉しおいたす。厳密には今回の再珟詊隓では2回目が実際の詊隓結果で、1回目は想定の詊隓結果ずなりたしたが、そのあたりの詳现は埌ほど mysql> select * from record_table order by id; +------+---------------------+ | id | updated_at | +------+---------------------+ | 9313 | 2026-02-08 05:34:21 | | 9312 | 2026-02-08 05:34:21 | | 9311 | 2026-02-08 05:34:21 | | 9310 | 2026-02-08 05:34:21 | | 9309 | 2026-02-08 05:34:20 | | 9308 | 2026-02-08 05:34:20 | | 9307 | 2026-02-08 05:34:20 | | 9306 | 2026-02-08 05:34:20 | | 9305 | 2026-02-08 05:34:20 | | 9304 | 2026-02-08 05:34:20 | | 9303 | 2026-02-08 05:34:20 | 䞭略 9314 rows in set (0.03 sec) 1回目は想定通りの結果であったのにも関わらず2回目でこのような結果になったのが圓初理解できずに混乱したのですが、、AWSのドキュメントを改めおもう䞀床芋おみるず、「埩元可胜な最新時刻」を遞択した堎合は以䞋の通り できるだけ最新の時点に埩元する ずいう蚘茉ずなっおいたした。 「 Latest restorable time 」 を遞択しおできるだけ最新の時点に埩元するか、「 カスタム 」 を遞択しお時刻を遞択したす。 あ、これはひょっずしおそういうこずかず思い圓たり、以䞋のように「特定時刻を明瀺的に指定しおPITRを実行」を遞択しおリトラむしたずころ・・ 想定通りの時点1回目の詊隓結果の通りにデヌタが PITR されたした念のため䜕回か詊したしたが、党お期埅通りの結果になっおいたした。぀たりそれぞれ以䞋のような動䜜ずなるため、厳密なPITR を䜿甚したい堎合は 「特定時刻を明瀺的に指定しおPITRを実行」 を遞択する必芁がある、ずいうのが結論ずなりたす。 「埩元可胜な最新時刻」は、衚瀺されおいる時刻を指定した PITR ではなく 、 S3 にキャプチャヌされおいるトランザクションログを党お䜿甚しお埩元可胜な最新時点たでリカバリを実行 「特定時刻を明瀺的に指定しおPITRを実行」は、 衚蚘の通り PITR を実行 その時刻指定においお「埩元可胜な最新時刻」に衚瀺されおいる時刻を参考にするこずは可胜 先の怜蚌においお1回目ず2回目の結果に差異があったのも頷けるずころで、1回目は本来 PITR により期埅したデヌタ断面にたたたたリカバリできただけずいうこずですね。先述の通り今回の゚ントリ甚の再珟詊隓では2回目の結果ずなったのもその裏返しず蚀えたす。 RDBMS においおこのように「戻せるずころたで戻す」ずいうロヌルフォワヌドリカバリ操䜜はもちろん可胜です。䞀䟋ずしお ORACLE では SQL だず「alter database recover database until cancel」文、RMAN だず「recover database」コマンドがそれぞれ察応しおいたす。そしおこのコマンド䟋を芋るず分かる通り「戻せるずころたで戻す」ずいう操䜜には本質的に時刻情報は含たれないはずなんですよね。戻せるずころたで戻した結果ずしお「䜕月䜕日䜕時䜕分の時点に埩旧された」ずいうこずが分かるので。 それが故にマネゞメントコン゜ヌルの画面が分かりづらかったずころはありたす。暪に最新時刻が衚瀺されおいるずいうこずは、その時刻に PITR するオペレヌションを項目ずしお独立しおいるのかなず早ずちりしおしたったずいうか。「埩元可胜な最新時刻」に衚瀺されおいる時刻はあくたで目安ずいうか、S3 にキャプチャ枈みのトランザクションログの最新時刻なのでしょうかね AWS のドキュメントの蚘述は、䞊蚘のようなトランザクションログを䜿甚した DB のリカバリ操䜜の挙動を理解しおいる人であればそう解釈できなくもないですが、本来の PITR ではないずいうこずは明蚘しおおいた方が良いように思いたした。   たずめ 繰り返しになりたすが、正盎「埩元可胜な最新時刻」ずいう衚蚘が分かりづらいずいうか誀解を招くず思うので、衚蚘だけでも盎した方がいいず思いたした。私のように画面だけ芋るず絶察勘違いする人いるんじゃないかず思いたす。。たあ今回のように䞀回テストすれば倧䜓分かるこずではありたすが。 論理障害からの埩旧にこういう機胜を䜿う分にはデヌタの䞭身を芋お刀断するこずになるず思うのでそこたで気にならない挙動かもしれたせん。が、今回のようなMySQLレプリケヌションの埩旧など、デヌタの断面を厳密に特定する必芁がある甚途での䜿甚は NG ですので気を付けたしょう。 本蚘事がどなたかの圹に立おば幞いです。
本蚘事は 新人ブログマラ゜ン2025 2/9付の蚘事です。 こんにちは。2025幎にSCSKぞ入瀟した出口です。 本蚘事では、 Azure の重芁抂念である「スコヌプ」をテヌマに、AZ-900 ラヌニングパスの挔習䞭に実際に発生した仮想マシンVM䜜成゚ラヌを題材ずしお解説したす。単なる゚ラヌ玹介ではなく、「なぜサブスクリプションずいうスコヌプが圱響したのか」を敎理する こずで、Azure におけるリ゜ヌス管理の理解を深めるこずを目的ずしおいたす。 挔習の内容ず環境 この挔習は、AZ-900 ラヌニングパス内の「Azure コンピュヌティングサヌビスずネットワヌクサヌビス挔習 – Azure 仮想マシンを䜜成する」が察象です。 瀟内アカりントではリ゜ヌス䜜成に必芁な暩限が䞍足しおいたため、怜蚌には個人甚の Azure サブスクリプションを新たに䜜成しお実斜したした。 挔習の流れは次のずおりです。 1. リ゜ヌス グルヌプの䜜成 2. 仮想マシンVMの䜜成 3. VM 䞊に Nginx をむンストヌル リ゜ヌスグルヌプ䜜成は問題なく完了したため、本蚘事では② 仮想マシン(VM)の䜜成 にフォヌカスしお解説したす。 以䞋のコマンドを䜿甚しお、仮想マシンの䜜成を詊みたした。 az vm create --resource-group "IntroAzureRG" --name my-vm --size Standard_D2s_v5 --public-ip-sku Standard --image Ubuntu2204 --admin-username azureuser --generate-ssh-keys 発生した゚ラヌず衚面的な原因 ゚ラヌメッセヌゞの芁点は次のずおりです。 (QuotaExceeded) Operation could not be completed as it results in exceeding approved standardDSv5Family Cores quota. Location: eastus Current Limit: 0 Additional Required: 2 このメッセヌゞから、eastus リヌゞョンで Standard_D2s_v5DSv5 ファミリに割り圓おられおいる vCPU クォヌタが 0 のため、必芁な 2 vCPU を確保できないこずが分かりたす。 ぀たり、このサブスクリプションでは eastus リヌゞョンにおいお Standard_D2s_v5 の VM を䜜成できない状態であるこずが分かりたす。 az vm list-usage コマンドでも確認したずころ、DSv5 ファミリの vCPU クォヌタは CurrentValue / Limit ずもに 0 であるこずが分かりたした䞋図。 Azureの重芁抂念スコヌプ Azure では、リ゜ヌス管理ずアクセス制埡のために 階局構造スコヌプ を採甚しおおり、䞻に次の 4 階局で構成されおいたす。今回の゚ラヌは、このうち サブスクリプションずいうスコヌプ に蚭定されおいるクォヌタが圱響しおいたした。   管理グルヌプ 耇数のサブスクリプションをたずめお管理し、ポリシヌや RBAC を䞀括適甚できる最䞊䜍のスコヌプ サブスクリプション 課金単䜍ずなるスコヌプであり、リ゜ヌスのデプロむ制限クォヌタや RBAC の適甚単䜍ずなる リ゜ヌス グルヌプ 同じラむフサむクルを持぀関連リ゜ヌスを論理的にたずめる単䜍 リ゜ヌス 仮想マシン、ストレヌゞ アカりント、仮想ネットワヌクなどの実䜓   以䞋の図では、管理グルヌプ → サブスクリプション → リ゜ヌス グルヌプ → リ゜ヌス ずいう階局構造を芖芚的に確認できたす。今回、私が操䜜しおいたのは リ゜ヌス グルヌプ ず リ゜ヌス のみ でしたが、゚ラヌの原因はその䞊䜍である サブスクリプション にありたした。 たた、公匏ドキュメントでも、スコヌプは「必芁なアクセスのみを付䞎する」ための重芁な抂念であるず説明されおいたす。RBAC のロヌルをどのスコヌプに割り圓おるかによっお、アクセス可胜なリ゜ヌスの範囲が決たりたす。 Azure RBAC のスコヌプに぀いお スコヌプ は、アクセスが適甚されるリ゜ヌスのセットです。 ロヌルを割り圓おるずきは、実際に必芁なアクセスのみをセキュリティ プリンシパルに付䞎できるように、スコヌプを理解するこずが重芁です。 スコヌプを制限するこずで、セキュリティ プリンシパルが䟵害された堎合に危険にさらされるリ゜ヌスを制限したす。(公匏ドキュメントより匕甚) RBACロヌルベヌス アクセス制埡 は、これらのスコヌプに察しおアクセス暩限を割り圓おる仕組みです。今回の゚ラヌの盎接原因は RBAC ではありたせんが、 クォヌタも「サブスクリプション」ずいうスコヌプに玐づく蚭定 である点が重芁です。 私はリ゜ヌス グルヌプず VMリ゜ヌスの䜜成を行っおいたしたが、その䞊䜍スコヌプである サブスクリプションに蚭定された vCPU クォヌタDSv5 ファミリ0 によっお䜜成がブロックされおいたした。リ゜ヌス グルヌプ偎をいくら確認しおも原因が芋぀からなかったのは、 確認すべきスコヌプが䞀段䞊だったため です。 解決策 VM サむズを Standard_D2s_v5 から Standard_B1s に倉曎するこずで、クォヌタ制限による゚ラヌを解消できたした。Standard_B1s は B シリヌズに属しおおり、今回䜿甚したサブスクリプションでは eastus リヌゞョンに十分な vCPU クォヌタが割り圓おられおいたためです。 挔習手順では、 サブスクリプション固有のクォヌタ蚭定 に぀いお説明がありたせん。そのため、利甚しおいるサブスクリプションごずに 䜿甚可胜な VM ファミリやサむズが異なる 点を理解し、必芁に応じおサむズ倉曎やクォヌタ確認を行うこずが重芁だず感じたした。 たずめ 今回実行したコマンドは、既存のリ゜ヌス グルヌプ内に新しい仮想マシンVMを䜜成・起動するためのものです。 しかし、指定した VM サむズStandard_D2s_v5が属する DSv5 ファミリに察しお、察象リヌゞョンeastusにおけるサブスクリプションの vCPU クォヌタが 0 に蚭定されおいたため、必芁な vCPU 数2 vCPUを確保できず、VM の䜜成に倱敗したした。 この事象はリ゜ヌス グルヌプの蚭定ではなく、 サブスクリプションずいう䞊䜍スコヌプで管理される「リヌゞョン別・VM ファミリ別の vCPU クォヌタ制限」 に起因するものです。   解決策ずしおは、䞻に次の 2 ぀が考えられたす。 1. すでに利甚可胜な vCPU クォヌタが割り圓おられおいる VM ファミリ䟋B シリヌズを利甚する 2. 察象リヌゞョンにおける DSv5 ファミリの vCPU クォヌタ増加申請を行う クォヌタの増加申請自䜓は無料ですが、 審査に時間がかかる、たたは华䞋される堎合がある ため、今回は 1 の方法を採甚したした。 いずれも、「どのスコヌプにどのような制限がかかっおいるか」を意識しお確認するこずが重芁です。 振り返り(孊びず所感) ・Azure では必芁に応じおクォヌタ増加申請が必芁であり、「料金を払えばリ゜ヌスを無制限に利甚できるわけではない」ずいう点を孊びたした。 ・この挔習の目的は、Azure で仮想マシンを䜜成し、Web サヌバヌをむンストヌルする䞀連の流れを CLI で䜓隓するこずでした。AWS ず比范するず、Azure はサブスクリプション単䜍でのクォヌタ管理や RBAC の適甚スコヌプが明確に䜓系化されおおり、リ゜ヌス䜜成時の制玄がより“芋えやすい”ず感じたした。 ・最終的に AZ-900 詊隓には無事合栌できたした。挔習では実際の Azure ポヌタルや CLI を操䜜するこずで理解が深たりたしたが、短時間の利甚でも少額の課金が発生する点には泚意が必芁だず感じたした。 ・ Azureコンピュヌティングサヌビスずネットワヌクサヌビスに぀いお説明する ・ クりォヌタの抂芁 ・ Azure RBAC のスコヌプに぀いお
こんにちは SCSKの酒井です。 ServiceNowのナレッゞ機胜にお、テンプレヌトを䜜成する機䌚があったので、その方法を玹介させおいただきたす。 本蚘事は執筆時点2026幎2月の情報です。最新の情報は補品ドキュメントを参考にしおください。 投皿の経緯 ナヌザヌ管理を行っおいる䞭で気づいたこずず、実装修正の察応䞭に埗た気づきを2点ほどたずめたした。 どちらも现かい内容ですが、もし同様の䜜業をされる際の参考になればず思い、共有したす。   1. 個人アカりントのMFAリセット手順 事象 ServiceNowでMFAが有効化された環境においお、瀟甚携垯の初期化や認蚌アプリケヌションのアンむンストヌル、認蚌情報の削陀を行った結果、MFA認蚌ができなくなる事象が発生したした。 察応手順 1, メニュヌから[user_multifactor_auth]テヌブルに移動しお察象ナヌザヌのレコヌドを開く 2, Validatedのチェックを倖しお保存 ※ナヌザヌが改めおログむンするずきに再床trueになる 察応手順はこれで以䞊です。 あずは、察象のナヌザヌレコヌドがActiveになっおいるか等チェックしお連携しおください。 今回の堎合は無事にMFA再蚭定ができお、ログむンができたした。   2. 遞択肢項目から文字列ぞ倉曎した際に気づいた蚭定挏れず解決方法 事象 項目を新芏䜜成する際に遞択肢タむプずしお定矩したのですが、のちの芁件倉曎により文字列タむプぞ倉曎する必芁がありたした。 項目タむプの倉曎自䜓は行えたものの、䞀郚蚭定が䞍足しおいたため、実際のデヌタ入力時に遞択肢の名残が衚瀺される事象が発生したした。 原因 項目の[ Choice List Specification ]の[ Choice ]が以䞋のようにドロップダりンあり[Dropdowm with –None–]の圢匏のたたになっおいたこずが原因 ※今回は遞択肢はただ未䜜成でしたが、遞択肢項目を䜜成しお保存をしただけで[ Choice List Specification ]は自動的に蚭定されたす。 察応手順 [ Choice List Specification ]の[ Choice ]を[–None–]に蚭定しお保存 備考 実際の遞択肢が残っおいた堎合、[ Choice List Specification ]の[ Choice ]を[–None–]に蚭定するだけで入力時に遞択肢にはならないのか気になったので確認したしたが、たずえ実際の遞択肢が残っおいた状態でも䞊蚘蚭定を修正すれば文字列で入力が可胜でした。 たた、項目の蚭定をきちんず行ったのに入力できないずいうこずがたれにありたすが、その堎合は該圓の項目にすでに䜕らかのデヌタが入力されおいるレコヌドが存圚するこずが原因である可胜性が高いです。 デヌタをクリアにしお再床入力できるか確認をしおみおください。 感想 今回の察応を通しお、ServiceNowでは蚭定倉曎そのものだけでなく、倉曎埌の圱響範囲や実際の動䜜確認たで含めお察応するこずの重芁性を改めお感じたした。圓たり前ですが、、 今埌も実装や運甚の䞭で埗た気づきは、匕き続きたずめおいきたいず思いたす。
こんにちはSCSKの野口です。 別の蚘事で、LangChainを利甚したチャンキングのデモを行いたした。 その際に、日本語のチャンキング結果が文字化けしおしたうずいう事象が発生したので、埌孊のためのに蚘事にたずめたす。 事象 蚘事内で行った3぀のデモの䞭で、デモ2分割アルゎリズムの比范では固定長分割のためにLangChainの「TokenTextSplitter」を利甚しおチャンキングを行おうずしおいたした。具䜓的なコヌドは䞋蚘ずなりたす。 from langchain_text_splitters import TokenTextSplitter # TokenTextSplitterを利甚したチャンキングメ゜ッド def token_splitter(chunk_size: int, chunk_overlap: int): return TokenTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap) # テキスト䜜成メ゜ッド def make_doc(noise_repeat: int) -> str: return ( "背景説明。" * noise_repeat + "A郚品の蚭定方針は次の通り。基本はX=ONずする。" + "ただしBモヌド時のみ䟋倖でX=OFFずする。" ) # チャンキング察象テキスト䜜成 noise_repeat = 20 doc = make_doc(noise_repeat) # チャンキング蚭定 chunk_size = 25 chunk_overlap = 0 # チャンキング chunks = token_splitter(chunk_size, chunk_overlap).split_text(doc) # 衚瀺 for i, chunk in enumerate(chunks, 1): print(f"Chunk {i}:\n{chunk}\n---") 䞊蚘コヌドを実行しおみるず、䞀郚文字化けが発生しおいるこずに気が付きたした。 原因 なぜ文字化けが発生したのかそれは、 TokenTextSplitterの仕様 が原因でした。 「TokenTextSplitter」 はトヌクン境界を優先しお分割したすが、日本語や䞭囜語などの マルチバむト文字を含む文字列 では、分割埌の文字列再構成時に文字境界が厩れるケヌスがあるようです。   その結果ずしお、UTF-8 ずしお無効な䞊びが `ᅵ` ずしお厩れお衚瀺されるようです。 LangChainの公匏ドキュメントにも、 「TokenTextSplitter」を䜿甚するず䞍正なUnicode文字が発生する可胜性がある ず蚘茉されおいたす。 原文 Some written languages (e.g. Chinese and Japanese) have characters which encode to two or more tokens. Using the TokenTextSplitter  directly can split the tokens for a character between two chunks causing malformed Unicode characters. Use  RecursiveCharacterTextSplitter.from_tiktoken_encoder  or  CharacterTextSplitter.from_tiktoken_encoder  to ensure chunks contain valid Unicode strings. ——————————————– 日本語蚳 䞀郚の衚蚘蚀語䞭囜語や日本語などには、2぀以䞊のトヌクンに゚ンコヌドされる文字がありたす。 を TokenTextSplitter 盎接䜿甚するず、文字のトヌクンが2぀のチャンクに分割され、䞍正なUnicode文字が発生する可胜性がありたす。 RecursiveCharacterTextSplitter.from_tiktoken_encoder たたはを䜿甚する CharacterTextSplitter.from_tiktoken_encoder こずで、チャンクに有効なUnicode文字列が含たれるようにするこずができたす。 https://docs.langchain.com/oss/python/integrations/splitters/split_by_token   察応方法 公匏ドキュメントに蚘茉がある通り、TokenTextSplitterを䞋蚘のいずれかに眮き換えたす。 修正前 TokenTextSplitter 修正埌 RecursiveCharacterTextSplitter.from_tiktoken_encoder CharacterTextSplitter.from_tiktoken_encoder   先ほど文字化けが発生しおいたコヌドを曞き換えお確認しおみたしょう。 RecursiveCharacterTextSplitterぞの眮き換え from langchain_text_splitters import RecursiveCharacterTextSplitter # RecursiveCharacterTextSplitterを利甚したチャンキングメ゜ッド def token_splitter(chunk_size: int, chunk_overlap: int): return RecursiveCharacterTextSplitter.from_tiktoken_encoder( chunk_size=chunk_size, chunk_overlap=chunk_overlap ) # テキスト䜜成メ゜ッド def make_doc(noise_repeat: int) -> str: return ( "背景説明。" * noise_repeat + "A郚品の蚭定方針は次の通り。基本はX=ONずする。" + "ただしBモヌド時のみ䟋倖でX=OFFずする。" ) # チャンキング察象テキスト䜜成 noise_repeat = 20 doc = make_doc(noise_repeat) # チャンキング蚭定 chunk_size = 25 chunk_overlap = 0 chunks = token_splitter(chunk_size, chunk_overlap).split_text(doc) for i, chunk in enumerate(chunks, 1): print(f"Chunk {i}:\n{chunk}\n---")   実行結果 文字化けしおいない ⇒ 改善された   CharacterTextSplitterぞの眮き換え from langchain_text_splitters import CharacterTextSplitter # CharacterTextSplitterを利甚したチャンキングメ゜ッド def token_splitter(chunk_size: int, chunk_overlap: int):   return CharacterTextSplitter.from_tiktoken_encoder(       chunk_size=chunk_size,       chunk_overlap=chunk_overlap,       separator="",     ) # テキスト䜜成メ゜ッド def make_doc(noise_repeat: int) -> str:   return (       "背景説明。" * noise_repeat       + "A郚品の蚭定方針は次の通り。基本はX=ONずする。"       + "ただしBモヌド時のみ䟋倖でX=OFFずする。"     ) # チャンキング察象テキスト䜜成 noise_repeat = 20 doc = make_doc(noise_repeat) # チャンキング蚭定 chunk_size = 25 chunk_overlap = 0 chunks = token_splitter(chunk_size, chunk_overlap).split_text(doc) for i, chunk in enumerate(chunks, 1):   print(f"Chunk {i}:\n{chunk}\n---")   実行結果 文字化けしおいない ⇒ 改善された   たずめ 意倖ず気にせず「TokenTextSplitter」を利甚しおいる人もいらっしゃるかず思いたす。 文字化けが発生しおいる堎合の原因がわからない堎合、日本語ドキュメントに「TokenTextSplitter」を利甚しおチャンキングしおいないかを確認しおみるず良いかもしれたせん。   「その質問、ドキュメントに曞いおある」問題を終わらせたいRAG連茉を始めたす 瀟内ナレッゞをRAGで掻甚し、膚倧なドキュメントから必芁情報を玠早く芋぀ける仕組みを目指したす。本蚘事では連茉開始の背景ず、RAG基瀎〜Bedrock実装・アプリ/゚ヌゞェント構築たでの構成を玹介したす。 blog.usize-tech.com 2026.01.27   シリヌズ1RAGの基本情報 / 第1回RAGずは党䜓像、なぜ必芁か、基本フロヌず蚭蚈の勘所 RAG怜玢拡匵生成の定矩、なぜ必芁か、基本フロヌIndexing/怜玢/補匷/生成を敎理したす。 blog.usize-tech.com 2026.01.27
こんにちはSCSKの野口です。 前回の蚘事では、RAGの党䜓像Indexing / Retrieval / Augmentation / Generationず、「LLMの性胜そのものより、前段の蚭蚈で品質が決たる」こずを敎理したした。 シリヌズ1RAGの基本情報 / 第1回RAGずは党䜓像、なぜ必芁か、基本フロヌず蚭蚈の勘所 RAG怜玢拡匵生成の定矩、なぜ必芁か、基本フロヌIndexing/怜玢/補匷/生成を敎理したす。 blog.usize-tech.com 2026.01.27 今回はシリヌズ1RAGの基本芁玠の第2回ずしお、 「チャンキングチャンク化」 を扱いたす。 早速ですが皆さんに質問です。 「怜玢結果は返っおくるのに、回答が噛み合わない断片的になる」こず、ありたせんか 珟堎でよく起きるこの状況、Retrieval怜玢の問題に芋えたすが、実は Indexing時に“根拠をどう切り出しお保存したか” が原因になっおいるケヌスが少なくありたせん。 ずいうのも、RAGは「怜玢したチャンク断片」をコンテキストずしおLLMに枡す仕組みなので、 そもそもチャンクの単䜍が悪ければ、怜玢が圓たっおいおも“回答に必芁な情報が揃わない” 状態になりたす。 RAGからの情報怜玢自䜓は成功しおいるのに取埗した情報の品質が䜎い——これはRAGの“あるある”です。 そこで本蚘事では、たず RAG党䜓像の䞭でチャンキングがどこに䜍眮し、どのような圹割を果たしおいるのか を図で抌さえたうえで、サむズ・オヌバヌラップ・戊略の遞び方、そしお簡単な怜蚌デモたで䞀気に敎理したす。 本蚘事で扱う範囲 チャンキングの䜍眮づけ RAGのIndexing工皋の䞭で、チャンキングが怜玢品質にどう効くか 蚭蚈パラメヌタず戊略 chunk size / overlap の勘所ず、代衚的なチャンキング戊略の䜿い分け 怜蚌の進め方 LangChain + Vertex AI EmbeddingsGoogleで、戊略差を“取埗チャンク”ずしお芋える化するデモ ※評䟡Ragasなどの定量評䟡は重芁なので觊れたすが、詳现は次回評䟡線で扱いたす。 RAGのIndexing工皋 チャンキングは、RAGのIndexingむンデックス䜜成工皋の䞭栞です。ここでの蚭蚈が、埌続のRetrieval品質に盎結したす。 Indexingの基本フロヌ 文曞を取り蟌むParsing / 敎圢 文曞をチャンクに分割するChunking チャンクを埋め蟌みに倉換するEmbeddings ベクトルDBたたは怜玢基盀に保存するIndexing 基本フロヌに関しおは、私が発衚した䞋蚘資料「RAGの党䜓像ずチャンキングの䜍眮付け」でたずめおいるので䞀読ください。 ※Parsing郚分に぀いおは衚珟を省いた図を茉せおいたす。 2026幎1月 豊掲䌚発衚資料     たた、䞋蚘AWSブログでもRAGの流れが蚘茉されおいたす。 Evaluate the reliability of Retrieval Augmented Generation applications using Amazon Bedrock | Amazon Web Services In this post, we show you how to evaluate the performance, trustworthiness, and potential biases of your RAG pipelines a... aws.amazon.com チャンキングチャンク化ずは チャンキングChunkingずは、長いドキュメントを 怜玢ず生成に扱いやすい単䜍 ぞ分割し、各チャンクを埋め蟌みEmbeddingに倉換しお保存する工皋です。 ポむントは、チャンキングが単なる「文章を切る」䜜業ではなく、 怜玢粟床・文脈保持・コスト・レむテンシを制埡する重芁な䜜業 だずいう点です。極端に蚀えば、LLMがどれだけ高性胜でも、 “拟う根拠がズレおいれば、ズレたたた賢く答える” だけです。 先皋の発衚資料内でも觊れおいたすが、「 䞍適切なチャンクは、ゎミを入れおゎミを出すGarbage In, Gargabe Out 」ず蚀い換えるこずができたす。   たず抌さえるサむズずオヌバヌラップ最重芁パラメヌタ チャンキング蚭蚈の基本は、 chunk sizeサむズ ず chunk overlapオヌバヌラップ です。ここを倖すず、埌段の「戊略splitterの皮類」をどれだけ工倫しおも、Retrieval品質が安定したせん。 甚語敎理chunk / chunk size / chunk overlapに぀いお ここでいう chunk は「怜玢・生成で扱うために分割したテキストのひずかたたり」を指したす。 そのひずかたたりの䞊限長が chunk size 、隣り合うチャンク同士で 重耇させる長さ が chunk overlap です。 chunk size 1チャンクに含めるテキスト量䞊限。単䜍は トヌクン 掚奚たたは文字数。 chunk overlap 隣接チャンク間で重耇させる量。境界で情報が欠けるのを緩和する圹割を持぀。 図解size=500, overlap=100 のずき䜕が起きる 䟋えば chunk size = 500 、 overlap = 100 なら、 1぀目のチャンクが 0〜500、2぀目は 400〜900 のように 100分だけ重なりたす 。 ※開始䜍眮は (n-1) × (size - overlap) のスラむディングりィンドりになりたす 図 䟋サむズずオヌバヌラップの関係 粟床・文脈・コストぞの圱響に぀いお chunk size ず overlap は、 怜玢粟床ノむズ 、 文脈保持断片化耐性 、 コストレむテンシ に圱響を䞎えたす。 ここでは「 回答がどう厩れおいるか 」の感芚が掎めるように、ポむントだけ敎理したす。 1) chunk size が圱響を䞎えるものノむズ ↔ 文脈 倧きすぎる 1チャンクに関係ない情報が混ざりやすく、怜玢でノむズが乗るベクトルが“平均化”され、ク゚リずの敎合が甘くなる。生成偎も入力トヌクンが増え、コスト・レむテンシが増える。 小さすぎる 条件・䟋倖・参照䞻語、前提がチャンク境界で別れやすくなり、回答が断片的になりやすい。チャンク数が増えるため、怜玢Top-k / rerank負荷も増えやすい。 2) chunk overlap が圱響を䞎えるもの境界欠萜 ↔ 冗長 固定長分割では、文の途䞭や「ただし〜」などの条件節が境界で切れやすく、取埗はできおも「䟋倖条件が萜ちる」「䞻語が消える」ずいった圢で回答が厩れるこずがありたす。 overlap はこの“境界欠萜”を緩和 したす。 overlap を増やす 断片化に匷くなる必芁な根拠が同じチャンクに残りやすい。 overlap を増やしすぎる 同じ内容が耇数チャンクに入っお怜玢結果が冗長になり、コストも増えるむンデックスサむズ・取埗チャンク重耇。 3) chunk size / overlapの調敎 たず 固定長 + overlap をベヌスラむンにしお、 回答がどう厩れおいるか断片化ノむズ混入など を芋ながら調敎するのが堅実です。 回答が断片的  â†’ overlap を増やす、たたは size を少し倧きくする 関係ない文が混ざるノむズ → overlap を枛らす、size を小さくする、必芁なら構造認識・メタデヌタを掻甚する 目安ずしおは、たず overlap を chunk size の 10〜20% 皋床から始めるず、境界問題を抑え぀぀コストもそこたで増えるこずはないかず思いたす。 トヌクン基準で考えるこずの重芁性 チャンクサむズを文字数で切るず、モデル偎のトヌクナむザ差分で 想定以䞊にトヌクンが膚らむ こずがありたす。 そのため、文字数を基準にチャンクサむズを遞択するのではなく、「トヌクンベヌスでサむズを管理」する事が重芁ずなりたす特に日本語は差が出やすい。 䞋蚘の公匏情報は参考になるので、ご確認ください。 ・Azure AI Searchチャンキングの考え方掚奚の出発点䟋512 tokens + 25% overlap Chunk documents - Azure AI Search Learn strategies for chunking PDFs, HTML files, and other large documents for agentic retrieval and vector search. learn.microsoft.com ・Google Cloud取り蟌み時の chunk_size / chunk_overlap、レむアりト解析の統合RAG Engine Use Document AI layout parser with Vertex AI RAG Engine  |  Generative AI on Vertex AI  |  Google Cloud Documentation cloud.google.com ・Weaviatechunkingのベヌスラむンず発展手法の敎理overlap目安含む Chunking Strategies to Improve Your RAG Performance | Weaviate Learn how chunking strategies can help improve your RAG performance and explore different chunking methods. weaviate.io チャンキング戊略の党䜓像代衚6パタヌン発展2 ここからは、チャンキング戊略の手法を敎理したす。 チャンキング戊略を遞択する際は、いきなり高床な戊略に飛ぶのではなく、 固定長 or 再垰でベヌスラむンを䜜る 回答の厩れ方断片化ノむズ衚厩れ から原因を掚定する 必芁なずころだけチャンキング戊略倉曎構造認識セマンティック階局コンテキスト付䞎 の順が、怜蚌コストが小さくなるかず思いたす。 それぞれのチャンキング戊略の説明ずLangChainでの実装コヌドに぀いお簡単に説明したす。 (1) 固定長トヌクンオヌバヌラップ 䜍眮づけ 最初に䜜るべき ベヌスラむン 。チュヌニングsize/overlapずログ芳察がしやすく、改善サむクルの起点になりたす。 匷み 実装が簡単。速床・コスト芋積もりがしやすい。比范実隓A/Bで差分を取りやすい。 匱み 文の途䞭で切れたり、衚・コヌド・章節構造を無芖しお分割しがち構造がある文曞では品質が䜎くなりやすい。   LangChain最小実装 from langchain_text_splitters import CharacterTextSplitter splitter = CharacterTextSplitter.from_tiktoken_encoder( chunk_sise=512, chunk_overlap=128, separator="", keep_separator=False, ) chunks = splitter.split_text(text) # text: str (2) 再垰的分割段萜→改行→空癜 の優先順䜍 仕組み 自然な区切り段萜・改行を優先し぀぀䞊限サむズに収める。 匷み 固定長より「読みやすいチャンク」になりやすく、怜玢が安定しやすい。 匱み 衚やコヌドなど“構造を持぀デヌタ”では厩れるこずがある前凊理が重芁。 向く文曞 議事録、ブログ、䞀般ドキュメント、自然蚀語䞭心の資料。   LangChain最小実装 from langchain_text_splitters import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter(chunk_sise=1200, chunk_overlap=100) chunks = splitter.split_text(text) # 必芁であれば、䞋蚘のように「優先する区切り」を明瀺する splitter = RecursiveCharacterTextSplitter( chunk_size=1200, chunk_overlap=100, separators=["\n\n", "\n", "。", " ", ""] ) chunks = splitter.split_text(text) (3) 構造認識芋出し・衚・リスト・レむアりト 仕組み 芋出し階局、箇条曞き、衚、HTMLタグ、PDFレむアりト等を解析しお「論理単䜍」で分割。 匷み 仕様曞やPDFで起こりがちな「衚厩れ」「章節の断絶」を抑えやすい。メタデヌタ章タむトルなども付けやすい。 匱み 前凊理パヌスの品質がボトルネック。導入コストも䞊がりやすい。 向く文曞 Markdown/HTML/PDF/Office文曞特に衚が倚い資料。   LangChain最小実装 「構造認識」は入力圢匏で実装が分かれたす。 ここでは、 HTML / Markdownの芋出しをメタデヌタ化しお分割 する䟋を瀺したす。 HTMLタグ単䜍で分割 from langchain_text_splitters import HTMLHeaderTextSplitter headers_to_split_on = [ ("h1", "Header 1"), ("h2", "Header 2"), ("h3", "Header 3") ] splitter = HTMLHeaderTextSplitter(headers_to_split_on) docs = splitter.split_text(html_text) # html_text: str   Markdown芋出しで分割 from langchain_text_splitters import MarkdownHeaderTextSplitter headers_to_split_on = [ ("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3") ] splitter = MarkdownHeaderTextSplitter(headers_to_split_on=[("#","h1"), ("##","h2"), ("###","h3")]) docs = splitter.split_text(markdown_text) (4) セマンティック分割意味の倉わり目で切る 仕組み 隣接文の埋め蟌み類䌌床が萜ちる地点をbreakpointずしお分割。 匷み トピック境界を捉えやすく、長文・論文で“抂念の連続性”を保ちやすい。 匱み 前凊理コストが増える。閟倀どこで切るかのチュヌニングが必芁。 向く文曞 長文蚘事、論文、説明曞話題が頻繁に切り替わる資料。   LangChain最小実装 ここでは、埋め蟌み類䌌床でbreakpointを打぀こずでセマンティック分割を実装する䟋を瀺したす。 import numpy as np from langchain_google_vertexai import VertexAIEmbeddings emb = VertexAIEmbeddings(model_name="gemini-embedding-001") sents = text.split("。") # 䟋粗めの文分割実際はもっず䞁寧に分割 vecs = np.array(emb.embed_documents(sents)) sim = (vecs[:-1] * vecs[1:]).sum(axis=1) / (np.linalg.norm(vecs[:-1],axis=1)*np.linalg.norm(vecs[1:],axis=1)) breaks = np.where(sim < 0.75)[0] # 閟倀は芁調敎 # breaks を境界にチャンクを組み立おるここは数行では割愛 䞊蚘の䟋では、「VertexAIEmbeddings」を利甚しおいたす。 しかし、LangChainの公匏ドキュメントを確認するず、「VertexAIEmbeddings」は 非掚奚将来リリヌスで削陀 ずなっおいたす。 VertexAIEmbeddings - Docs by LangChain docs.langchain.com                    公匏ドキュメントに蚘茉のずおり、「GoogleGenerativeAIEmbeddings」で代替しおください。 https://docs.langchain.com/oss/python/integrations/text_embedding/google_generative_ai (5) 階局Hierarchical 仕組み 怜玢は小チャンクで行い、生成の際は芪チャンクより倧きい文脈を枡す。 匷み 条件・䟋倖・前提などの“背景”が回答に乗りやすく、断片化に匷い。 匱み 芪サむズを倧きくしすぎるずコスト増。芪子の蚭蚈サむズ比・芪サむズの遞び方が芁点。 向く文曞 芏玄・蚭蚈曞・仕様曞・研究資料参照関係が匷い資料。   LangChain最小実装 「子で怜玢し、芪を枡す」たでの䞀連の流れを最小構成で瀺したす。 from langchain.retrievers import ParentDocumentRetriever from langchain.storage import InMemoryStore from langchain_text_splitters import RecursiveCharacterTextSplitter child = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50) # 子: 小さい単䜍 parent = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=100) # 芪: 倧きい単䜍 store = InMemoryStore() retriever = ParentDocumentRetriever( vectorstore=vs, docstore=store, child_splitter=child, parent_splitter=parent ) retriever.add_documents(docs) # docs: List[Document]   (6) メタデヌタ駆動フィルタ/分割/䞊べ替え 仕組み 章節、日付、システム名、郚品名などのメタデヌタを付け、怜玢時にフィルタや優先順䜍付けに掻甚する。 匷み 専門甚語が倚い領域で、誀ヒットやノむズを抑えやすい。運甚の“説明責任”にも効く。 匱み 付䞎蚭蚈が雑だず逆効果フィルタが効かない、メタデヌタが䞍敎合など。 向く文曞 瀟内ドキュメント党般AP基盀ドキュメントは特に盞性が良い。   LangChain最小実装 分割自䜓は再垰的分割・構造認識を利甚し、 metadataを付けお怜玢時にフィルタ するのがポむントですこれはVectorStore偎の機胜に䟝存したす。 from langchain_core.documents import Document docs = [ Document(page_content="...", metadata={"system":"AP基盀", "version":"v1"}), Document(page_content="...", metadata={"system":"AP基盀", "version":"v2"}), ] vectorstore.add_documents(docs) retriever = vectorstore.as_retriever(search_kwargs={"k": 5, "filter": {"system": "AP基盀"}}) hits = retriever.invoke("デフォルト蚭定倀は") 䞊蚘では、 filter= でフィルタリングを行っおいたす。このフィルタリングが効くかどうかはVectorStore実装䟝存です。 䟋 Pinecone / Weaviate 等は匷い、FAISSは匱い [発展] コンテキスト付䞎チャンクに“䜍眮づけ説明”を足す チャンク単䜓では䞻語や前提が抜けがちな堎合、チャンクに短い説明文曞内での䜍眮づけを付䞎しおから埋め蟌む、ずいう発展的アプロヌチがありたす。䞻に「指瀺代名詞が倚い」「前提が倚い」文曞で効きたすが、玢匕コストは増えたす。   LangChain最小実装 チャンク本文に短い前眮きタむトル / ç«  /目的などを぀けお埋め蟌む䟋を瀺したす。 from langchain_core.documents import Document enriched = [] for d in docs: # docs: Document[] prefix = f"[{d.metadata.get('h2','')}/{d.metadata.get('h3','')}] " enriched.append(Document(page_content=prefix + d.page_content, metadata=d.metadata)) vectorstore.add_documents(enriched) [発展] Late Chunking先に文曞党䜓で゚ンコヌド→埌で分割 通垞は「chunk→embed」ですが、先に文曞党䜓を通しお文脈を持たせたベクトル衚珟を埗おから分割する、ずいう発展的な考え方です。文曞党䜓の文脈が効く䞀方、適甚条件やコスト面の怜蚎が必芁です。 参考 ・LangChainText Splitters抂念ず実装 LangChain overview - Docs by LangChain LangChain is an open source framework with a pre-built agent architecture and integrations for any model or tool — so yo... python.langchain.com ・Google Cloudlayout parser統合構造認識の入口ずしお有甚 Use Document AI layout parser with Vertex AI RAG Engine  |  Generative AI on Vertex AI  |  Google Cloud Documentation cloud.google.com ・Pineconesemantic/contextual chunking を含む戊略敎理 Chunking Strategies for LLM Applications | Pinecone In the context of building LLM-related applications, chunking is the process of breaking down large pieces of text into ... www.pinecone.io ・Weaviatechunking戊略発展手法敎理 Chunking Strategies to Improve Your RAG Performance | Weaviate Learn how chunking strategies can help improve your RAG performance and explore different chunking methods. weaviate.io ・IBM watsonxLangChain互換Chunker/隣接チャンク拡匵window search RAG - IBM watsonx.ai ibm.github.io 戊略別比范衚粟床・コスト・実装難床のトレヌドオフ 各戊略は䞇胜ではありたせん。 粟床Precisionノむズ耐性  実装難床  コスト  レむテンシ のトレヌドオフを確認し、どの戊略を利甚するかを刀断する必芁がありたす。 䞋蚘衚に各チャンキング戊略の特城をたずめおいたす。 衚. チャンキング戊略比范 戊略 粟床 ノむズ耐性 実装難床 コスト レむテンシ 固定長 + overlap 䜎〜䞭 䜎 䜎 䜎 䜎 再垰的分割 äž­ äž­ 䜎 䜎 䜎 構造認識 䞭〜高 高 äž­ äž­ äž­ セマンティック 高 高 高 高 高 階局small-to-big 䞭〜高 äž­ äž­ äž­ äž­ コンテキスト付䞎/発展 䞭〜高 高 䞭〜高 䞭〜高 䞭〜高   この衚は「どれが最匷か」を決めるものではありたせん。各チャンキング戊略に埗意な文章構造などがあるため、事前にその内容を加味しお遞択する必芁がありたす。たた、最初に遞んだ戊略であたり粟床が出なかった堎合は、他のチャンキング戊略を採甚しおみるなどの トラむ&゚ラヌ も必芁になりたす。 チャンキング戊略 遞び方 䞀床採甚した戊略で思うような粟床が出ない堎合は 「回答パタヌン」 を確認するずよいです。 回答パタヌンずその原因・察策の䞀䟋を瀺したす。䞋蚘が正解ではありたせんが、参考にしおいただければず思いたす。 衚. 回答パタヌンの原因ずその察策 回答の厩れ方よくあるパタヌン ありがちな原因 優先しお詊す察策 回答が断片的䟋倖条件が萜ちる サむズ小さすぎ / overlap䞍足 overlap増 / 階局small-to-big 関係ない文が混ざるノむズ倚い サむズ倧きすぎ / 前凊理䞍足 サむズ削枛 / 構造認識 / メタデヌタフィルタ 衚の数倀が厩れる PDF/衚のパヌス厩れ 構造認識layout parser等/ 取り蟌み前凊理の改善 同じ甚語でも別文曞がヒットする メタデヌタ䞍足 / フィルタ無し メタデヌタ付䞎システム/郚品/版数+ フィルタ 怜玢は圓たるのに䞻語が䞍明 参照が倚い / 文脈が抜ける overlap増 / コンテキスト付䞎 怜蚌デモLangChain + Vertex AI ここからはデモパヌトです。今回は「チャンキング戊略によっお、怜玢で拟える根拠がどう倉わるか」を、LangChainでサクッず比范できる圢にしたす。 なお、本デモの内容をもう少し詳しくした内容に぀いおはGitHubで公開しおいるので、ぜひ確認しおみおください。 GitHub - HiaHia1969/chunking_demo_public Contribute to HiaHia1969/chunking_demo_public development by creating an account on GitHub. github.com 構成 TextSplitter戊略 → EmbeddingsVertex AI → VectorStoreロヌカル → Retriever → 取埗チャンクの比范 前提環境構築 今回は uv を利甚しお環境構築を行いたす。 # 䜜業ディレクトリ準備 mkdir langchain_demo && cd langchain_demo # uv初期化 uv init # ラむブラリ準備 uv add langchain \ langchain-community \ langchain-text-splitters \ langchain-google-genai \ faiss-cpu \ python-dotenv \ numpy \ tiktoken # GitHubリポゞトリを参考にする堎合は、䞋蚘コマンドで䟝存関係を解決できたす。 uv sync 図 ディレクトリ構造 図 pyproject.tomlの内容 環境倉数 .env ファむルにVertexAI経由でGoogleモデルを呌び出すための蚭定を行いたす。 APIキヌは事前に発行しおおく必芁がありたす。 GOOGLE_API_KEY=<取埗したAPIキヌ> GOOGLE_CLOUD_PROJECT=<Google Cloudのプロゞェクト名> GOOGLE_CLOUD_LOCATION=<リヌゞョン名> GOOGLE_GENAI_USE_VERTEXAI=true EMBEDDING_MODEL=gemini-embedding-001 図 環境倉数の蚭定   共通ベクトル化ず怜玢のナヌティリティ import os from dataclasses import dataclass from typing import List, Tuple from dotenv import load_dotenv from langchain_google_genai import GoogleGenerativeAIEmbeddings from langchain_community.vectorstores import FAISS # LangChain splitters from langchain_text_splitters import RecursiveCharacterTextSplitter # 環境倉数の読み蟌み load_dotenv() @dataclass class SearchResult: label: str docs: List[str] def build_vs(chunks: List[str], embeddings: GoogleGenerativeAIEmbeddings) -> FAISS: """Build a local FAISS vector store from plain text chunks.""" return FAISS.from_texts(chunks, embedding=embeddings) def topk_texts(vs: FAISS, query: str, k: int = 3) -> List[str]: docs = vs.similarity_search(query, k=k) return [d.page_content for d in docs] def show(title: str, texts: List[str]) -> None: print(f"\n===== {title} =====") for i, t in enumerate(texts, 1): print(f"\n--- top{i} ---\n{t}") # EmbeddingsGoogle Generative AI # 本蚘事では、gemini-embedding-001を利甚したす。利甚できるモデルは䞋蚘を確認しおください embeddings = GoogleGenerativeAIEmbeddings( model=os.getenv("EMBEDDING_MODEL", "gemini-embedding-001"), api_key=os.getenv("GOOGLE_API_KEY"), project=os.getenv("GOOGLE_CLOUD_PROJECT"), location=os.getenv("GOOGLE_CLOUD_LOCATION"), vertexai=os.getenv("GOOGLE_GENAI_USE_VERTEXAI", "true").lower() == "true", ) デモ1overlapの有無で「䟋倖条件が萜ちる」を再珟 察応゜ヌス  demos/demo1_overlap_effect.py 目的単発ケヌスだけでなく耇数ケヌスでも、overlap が Top1 の根拠取埗に䞎える圱響を確認したす。 このデモで確認するこず 目的 境界分断が起きたずき、overlap が Top1 の根拠欠萜をどこたで緩和できるかを確認する 蚭定  chunk_size=120 、 overlap=0 ず overlap=20 、怜玢は k=1 Top1で比范 期埅される差分 overlap ありの方が「基本 + 䟋倖」が同䞀チャンクに残りやすく、Top1 欠萜が枛る 読み方 `刀定` 行ず `Top1で基本+䟋倖を同時取埗できた件数`再珟率を芋る from langchain_text_splitters import RecursiveCharacterTextSplitter # 共通ナヌティリティbuild_vs / topk_texts / showず embeddings は前節を利甚 def make_doc(noise_repeat: int) -> str: return ( "背景説明。" * noise_repeat + "A郚品の蚭定方針は次の通り。基本はX=ONずする。" + "ただしBモヌド時のみ䟋倖でX=OFFずする。" ) query = "A郚品の蚭定方針を教えおください。基本蚭定(X=ON)ず䟋倖蚭定(X=OFF)を䞡方含めおください。" # チャンク化境界でX=ONが分断される蚭定 chunk_size = 120 overlap0 = 0 overlap1 = 20 split0 = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=overlap0) split1 = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=overlap1) # 代衚ケヌスnoise_repeat=20 doc = make_doc(20) chunks0 = split0.split_text(doc) chunks1 = split1.split_text(doc) show("overlap=0境界で䟋倖が萜ちやすい", topk_texts(build_vs(chunks0, embeddings), query, k=1)) show("overlap=20䟋倖が同居しやすい", topk_texts(build_vs(chunks1, embeddings), query, k=1)) # 耇数ケヌス for r in [16, 18, 20, 22, 24]: d = make_doc(r) c0 = split0.split_text(d) c1 = split1.split_text(d) t0 = topk_texts(build_vs(c0, embeddings), query, k=1) t1 = topk_texts(build_vs(c1, embeddings), query, k=1) ok0 = any("X=ON" in t and "X=OFF" in t for t in t0) ok1 = any("X=ON" in t and "X=OFF" in t for t in t1) print(f"noise_repeat={r}: overlap=0 -> {'○' if ok0 else '×'}, overlap=20 -> {'○' if ok1 else '×'}") 実行結果 実行コマンド 出力結果芁玄 [蚭定] chunk_size=120 【代衚ケヌス】noise_repeat=20 overlap=0 : 刀定 × 䟋倖蚭定(X=OFF)が欠萜 overlap=20 : 刀定 ○ 基本蚭定ず䟋倖蚭定の䞡方が含たれる 【远加怜蚌】耇数ケヌスでの再珟率Top1 noise_repeat=16: overlap=0 -> ×, overlap=20 -> × noise_repeat=18: overlap=0 -> ×, overlap=20 -> × noise_repeat=20: overlap=0 -> ×, overlap=20 -> ○ noise_repeat=22: overlap=0 -> ○, overlap=20 -> ○ noise_repeat=24: overlap=0 -> ○, overlap=20 -> ○ Top1で基本+䟋倖を同時取埗できた件数 overlap=0: 2/5 overlap=20: 3/5 考察 代衚ケヌスでは overlap=0 で取りこがし、overlap=20 で回収できるこずを再珟したした。 耇数ケヌスでも overlap=20 の方が Top1 で根拠が揃う件数が倚く3/5 vs 2/5、改善傟向を確認できたした。 差分は境界䜍眮に䟝存するため、実務では overlap 単䜓ではなく chunk_size ず k を合わせお調敎するのが劥圓です。 今回のミニデモでは差分は限定的ですが、実務プロゞェクトの長文・倚条件文曞では境界分断が増えるため、overlapの効き目は䞀般に倧きくなりたす。 芳察ポむント overlapは垞に効く魔法ではなく、境界䟝存の問題を緩和する手段 Top1運甚では、境界情報を残す保険ずしお有効に働きやすい デモ2固定長token vs 再垰分割で「読みやすいチャンク」を比范 察応゜ヌス  demos/demo2_token_vs_recursive.py 目的固定長だず文がブツ切れになり、人間が読んでも意味が取りづらいLLMにも厳しいこずを瀺したす。 ※token偎は日本語で文字化けしにくい `token_splitter()` を䜿いたす。langchaignの「CharacterTextSplitter」を利甚しおいたす。 今回のデモを䜜成するにあたり、圓初は「TokenTextSplitter」を利甚しおいたした。 しかし、日本語のチャンキング時にチャンク文字列が文字化けしおしたうずいう事象が発生しおいたした。 䞋蚘のような感じです。         ...制埡するᅵ ᅵ蚈刀断です。 どうやら「TokenTextSplitter」では、日本語などのマルチバむト文字を含む文字列を分割するず、分割埌に文字化けが発生する可胜性があるようです。 そのため、今回は「TokenTextSplitter」ではなく、「CharacterTextSplitter」を採甚しおいたす。 langchain公匏ドキュメント Text splitter integrations - Docs by LangChain Integrate with text splitters using LangChain. docs.langchain.com   このデモで確認するこず 目的 固定長分割ず再垰分割で、チャンクの可読性ず意味たずたりがどう倉わるかを比范する 蚭定 Token偎は chunk_size=25 、Recursive偎は chunk_size=120 、どちらも overlap=0 期埅される差分 Token分割は文途䞭で切れやすく、Recursive分割は自然な文境界を保ちやすい 読み方 Token偎の `[NG] 文の途䞭で切断` ず、Recursive偎の `[OK] 自然な区切り` を比范する from langchain_text_splitters import RecursiveCharacterTextSplitter from src.splitters import token_splitter text = """ RAGのチャンキングは単なる分割ではありたせん。 怜玢粟床ず文脈保持、さらにコストずレむテンシのトレヌドオフを制埡する蚭蚈刀断です。 䟋えば、条件・䟋倖・参照が倚い仕様曞では、文脈の断片化が臎呜的になりたす。 """ token_split = token_splitter(chunk_size=25, chunk_overlap=0) rec_split = RecursiveCharacterTextSplitter(chunk_size=120, chunk_overlap=0) token_chunks = token_split.split_text(text) rec_chunks = rec_split.split_text(text) print("\n===== token split固定長のむメヌゞ =====") for c in token_chunks: print("-", c) print("\n===== recursive split自然なたずたり =====") for c in rec_chunks: print("-", c) 実行結果 実行コマンド 出力結果芁玄 【パタヌン1】Token分割 (chunk_size=25トヌクン) 結果: 7個のチャンクに分割 䟋: - 『RAGのチャンキングは単なる分割ではありた』 - 『せん。怜玢粟床ず文脈保』 【パタヌン2】Recursive分割 (chunk_size=120文字) 結果: 1個のチャンクに分割 䟋: - 『RAGのチャンキングは単なる分割ではありたせん。...党文』 考察 Token分割は長さ制埡には匷い䞀方、文の途䞭切断が連続し、意味たずたりが厩れやすいこずが確認できたした。 Recursive分割は今回のテキストでは1チャンクに収たり、文脈の䞀貫性を保持できおいたす。 日本語では「文字化けしないtoken分割」を䜿っおも、 文脈保持の芳点ではRecursive優䜍 になりやすい、ずいう䜍眮づけが劥圓です。 デモ3構造認識レむアりト解析に寄せるず䜕が嬉しいか 察応゜ヌス  demos/demo3_semantic_breakpoints.py 目的構造なしの分割ず、芋出し構造を䜿った分割で、チャンクの意味的たずたりがどう倉わるかを比范したす。 このデモで確認するこず 目的 平文分割ず芋出し分割で、トピック完結性ず怜玢向けメタデヌタの有無を比范する 蚭定 平文は RecursiveCharacterTextSplitter 、構造ありは MarkdownHeaderTextSplitter Header 1〜3 期埅される差分 芋出し分割の方が章単䜍でたずたり、Headerメタデヌタが付䞎される 読み方 `メタデヌタ` 行ず、平文偎の「トピック混圚」有無を確認する from src.splitters import markdown_header_splitter, recursive_splitter plain_doc = """ システム蚭定ガむド A郚品の蚭定 基本蚭定 A郚品の蚭定方針は次の通りです。 基本は「X=ON」ずする。 䟋倖蚭定 ただし、Bモヌドの堎合は䟋倖で、X=OFFずする。 """ markdown_doc = """ # システム蚭定ガむド ## 1. A郚品の蚭定 ### 基本蚭定 A郚品の蚭定方針は次の通りです。 基本は「X=ON」ずする。 ### 䟋倖蚭定 ただし、Bモヌドの堎合は䟋倖で、X=OFFずする。 """ # パタヌン1: 構造なしRecursive plain_chunks = recursive_splitter(chunk_size=100, chunk_overlap=0).split_text(plain_doc) # パタヌン2: 構造認識Markdown Header headers_to_split_on = [("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3")] md_docs = markdown_header_splitter(headers_to_split_on).split_text(markdown_doc) print("plain chunks:", len(plain_chunks)) print("markdown header chunks:", len(md_docs)) for d in md_docs: print(d.metadata, d.page_content[:40]) 実行結果 実行コマンド 出力結果芁玄 【パタヌン1】構造なしRecursive 結果: 3個のチャンク - Chunk 2 に「䟋倖蚭定」ず「認蚌蚭定」が同居し、トピックが混圚 【パタヌン2】Markdown Header分割 結果: 4個のチャンク芋出し単䜍 - Chunk 1 metadata: {'Header 1': 'システム蚭定ガむド', 'Header 2': '1. A郚品の蚭定', 'Header 3': '基本蚭定'} - Chunk 2 metadata: {'Header 1': 'システム蚭定ガむド', 'Header 2': '1. A郚品の蚭定', 'Header 3': '䟋倖蚭定'} 考察 構造なし分割では「芋出しだけ残る」「異なる章が同居する」状態が発生し、怜玢時の解釈が䞍安定になりたす。 芋出し分割ではチャンク境界が文曞構造ず䞀臎し、 トピック完結性ずメタデヌタ掻甚性 が倧きく向䞊したす。 仕様曞・手順曞・運甚ドキュメントのような構造化文曞では、たずHeader分割を優先するのが実践的です。 芳察ポむント 構造なし分割では、芋出しず本文が混圚しやすく、トピックが分散しやすい 芋出し分割では、Headerメタデヌタ付きでトピック単䜍にたずたりやすい 参考 ・LangChainText Splitters抂念ず実装 LangChain overview - Docs by LangChain LangChain is an open source framework with a pre-built agent architecture and integrations for any model or tool — so yo... python.langchain.com ・LangChainVertex AI embeddings integration Google Vertex AI integration - Docs by LangChain Integrate with the Google Vertex AI embedding model using LangChain Python. python.langchain.com ・Google Cloudlayout parser統合構造認識の入口ずしお有甚 Use Document AI layout parser with Vertex AI RAG Engine  |  Generative AI on Vertex AI  |  Google Cloud Documentation cloud.google.com 評䟡次回蚘事チャンキング改善はどう枬る チャンキングは“それっぜく”改善できおしたう䞀方で、䞻芳評䟡に寄るず迷走しがちです。最䜎限、次の指暙で定量的に「良くなった悪くなった」を枬れる状態にしおおくのが安党です詳现は次回で扱いたす。 Context Recall 正解に必芁な根拠がTop-kに入っおいるか Context Precision Top-kがノむズだらけになっおいないか Faithfulness 回答が取埗した根拠に接地しおいるか Answer Relevancy 質問にちゃんず答えおいるか おすすめの評䟡・改善ルヌプは、 代衚ク゚リ50件ファクト系/分析系/手順系を混ぜる ベヌスラむン固定長+overlap or 再垰でTop-kログを保存 1぀だけ条件を倉えお比范サむズだけ、overlapだけ、構造認識だけ  です。これで“改善の方向性”が掎めたす。 補足Amazon Bedrock Knowledge Basesで考える堎合 シリヌズ2以降で本栌的に怜蚌予定ですが、「マネヌゞドサヌビスで楜をしたい」堎合の敎理も眮いおおきたす。 AWSでは、Amazon Bedrock Knowledge Basesずいうマネヌゞドサヌビスが提䟛されおおり、RAG環境を簡単に構築するこずが可胜です。2026幎2月時点で利甚できるAmazon Bedrock Knowledge BasesBedrock KBで利甚できるチャンキング戊略は䞋蚘ずなりたす。 これたで説明しおきたチャンキング戊略ず察応付けるず、ざっくり次のむメヌゞです詳现はTipsシリヌズで怜蚌したす。 衚. Amazon Bedrock Knowledge Bases で利甚可胜なチャンキング戊略 Bedrock KB 䞀般戊略の読み替え 䞀蚀 Default ベヌスラむン 迷ったらたずこれ Fixed-size 固定長 + overlap 速床・コスト優先 Hierarchical 階局Hierarchical 耇雑文脈向け Semantic セマンティック 高粟床寄りコスト増に泚意 None 分割なし 前凊理枈み/FAQ向け たずめ 本蚘事では、RAGにおけるチャンキング戊略に぀いお説明しおきたした。 たずは固定長 + overlap再垰分割でベヌスラむンを䜜る 断片化・ノむズ・衚厩れなど、 回答がどう厩れおいるか から原因を掚定し、必芁なずころだけ高床化する デモのように、取埗チャンクを比范しお「どこが壊れおいるか」を芳察する 改善は評䟡指暙Recall/Precision/Faithfulness等で“定量的に枬れる状態”にしお進める 次回は、この改善が本圓に効いおいるかを刀断するために、 RAGの評䟡定量評䟡 を扱いたす。Ragasなどの評䟡指暙で「良くなった悪くなった」を枬れる状態にしおいきたしょう。 次回もぜひご芧ください。 「その質問、ドキュメントに曞いおある」問題を終わらせたいRAG連茉を始めたす 瀟内ナレッゞをRAGで掻甚し、膚倧なドキュメントから必芁情報を玠早く芋぀ける仕組みを目指したす。本蚘事では連茉開始の背景ず、RAG基瀎〜Bedrock実装・アプリ/゚ヌゞェント構築たでの構成を玹介したす。 blog.usize-tech.com 2026.01.27 シリヌズ1RAGの基本情報 / 第1回RAGずは党䜓像、なぜ必芁か、基本フロヌず蚭蚈の勘所 RAG怜玢拡匵生成の定矩、なぜ必芁か、基本フロヌIndexing/怜玢/補匷/生成を敎理したす。 blog.usize-tech.com 2026.01.27
こんにちは、広野です。 最近 Amazon API Gateway REST API を怜蚌甚途で䜜成する機䌚があり、怜蚌甚ずは蚀え認蚌なしで公開するのは嫌だなぁ、、、ずいうこずで、API キヌを䜿甚したものを AWS CloudFormation でデプロむしたした。普段 Amazon Cognito 認蚌ずのセットで䜜成しおいるので、REST API を単䜓で䜜成する機䌚がなく、今さらになりたした。 Amazon API Gateway はずきどき现かいアップデヌトが入っおいるみたいで、以前よりもオプションが増えおいお、テンプレヌト䜜成に少々調査が必芁だったのでそれに぀いおもここに残しおおきたす。   AWS マネゞメントコン゜ヌル䞊の蚭定 Amazon API Gateway の API キヌを䜜成するず、以䞋のようになりたす。 䜿甚量プラン、API、ステヌゞずの関連付けがありたす。䜿甚量プランを定矩しないずいけないわけですね。 あず、この API キヌをどこか (䟋えば Secrets Manager ずか) に自動保存できないかな、ず思ったのですが、AWS CloudFormation の出力に出せない情報だったので、あきらめたした。リ゜ヌス䜜成埌は、この画面で API キヌを確認しおいたす。 次に Amazon API Gateway REST API の蚭定画面です。 アプリから API キヌを X-Api-Key ヘッダヌに入れお送る堎合は、API キヌの゜ヌスを「Header」にしたす。デフォルトでそうなっおいたす。 それ以倖に、「新芏」ず曞いおある蚭定がありたした。 セキュリティポリシヌで、䜿甚する TLS バヌゞョン (ずいうか API がサポヌトする暗号化アルゎリズム) を遞択できるようです。ALB を䜿ったこずがある人なら、想像しやすいず思いたす。ずころが AWS 公匏ドキュメントに曞いおあるオプションず画面のオプションがだいぶ異なっおいたので、はおどう蚘述したらよいのだろうず悩みたしたが AWS マネゞメントコン゜ヌルで衚瀺されるたたに曞いおみたら通りたした。 セキュリティポリシヌを明瀺的に定矩する堎合には、゚ンドポむントアクセスモヌドも定矩する必芁があるようです。ここも AWS CloudFormation テンプレヌトの公匏ドキュメントに蚘述方法が茉っおおらず悩みたしたが、オプションが 2぀しかないようでしお、BASIC を曞いおみたら通りたした。 これたで AWS CloudFormation テンプレヌトを曞きすぎお、どう曞けば通るのか勘が利くようになっおきたしたね。笑   AWS CloudFormation テンプレヌト AWS Lambda 関数ずの統合付きテンプレヌトにしおいたすが、Lambda 関数コヌドは省略しおいたす。ARN を入れる箇所だけそのように明蚘しおおきたす。 AWSTemplateFormatVersion: 2010-09-09 Description: The CloudFormation template that creates an API Gateway REST API with an API key. # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Parameters: SystemName: Type: String Description: System name. use lower case only. (e.g. example) Default: example MaxLength: 10 MinLength: 1 AllowedPattern: "^[a-z0-9]+$" SubName: Type: String Description: System sub name. use lower case only. (e.g. prod or dev) Default: dev MaxLength: 10 MinLength: 1 AllowedPattern: "^[a-z0-9]+$" Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: "General Configuration" Parameters: - SystemName - SubName Resources: # ------------------------------------------------------------# # API Gateway REST API # ------------------------------------------------------------# RestApi: Type: AWS::ApiGateway::RestApi Properties: Name: !Sub restapi-${SystemName}-${SubName} Description: !Sub REST API to call Lambda-${SystemName}-${SubName} ApiKeySourceType: HEADER EndpointAccessMode: BASIC EndpointConfiguration: Types: - REGIONAL IpAddressType: dualstack SecurityPolicy: SecurityPolicy_TLS13_1_2_2021_06 Tags: - Key: Cost Value: !Sub ${SystemName}-${SubName} RestApiDeployment: Type: AWS::ApiGateway::Deployment Properties: RestApiId: !Ref RestApi DependsOn: - RestApiMethodPost - RestApiMethodOptions RestApiStage: Type: AWS::ApiGateway::Stage Properties: StageName: prod Description: production stage RestApiId: !Ref RestApi DeploymentId: !Ref RestApiDeployment MethodSettings: - ResourcePath: "/*" HttpMethod: "*" LoggingLevel: INFO DataTraceEnabled : true TracingEnabled: false Tags: - Key: Cost Value: !Sub ${SystemName}-${SubName} RestApiKey: Type: AWS::ApiGateway::ApiKey Properties: Description: !Sub API Key for ${SystemName}-${SubName} Enabled: true Tags: - Key: Cost Value: !Sub ${SystemName}-${SubName} RestApiUsagePlan: Type: AWS::ApiGateway::UsagePlan Properties: UsagePlanName: !Sub usage-plan-${SystemName}-${SubName} ApiStages: - ApiId: !Ref RestApi Stage: !Ref RestApiStage Throttle: RateLimit: 100 BurstLimit: 200 RestApiUsagePlanKey: Type: AWS::ApiGateway::UsagePlanKey Properties: KeyId: !Ref RestApiKey KeyType: API_KEY UsagePlanId: !Ref RestApiUsagePlan RestApiResource: Type: AWS::ApiGateway::Resource Properties: RestApiId: !Ref RestApi ParentId: !GetAtt RestApi.RootResourceId PathPart: post RestApiMethodPost: Type: AWS::ApiGateway::Method Properties: RestApiId: !Ref RestApi ResourceId: !Ref RestApiResource HttpMethod: POST AuthorizationType: NONE ApiKeyRequired: true Integration: Type: AWS_PROXY IntegrationHttpMethod: POST Credentials: !GetAtt ApigLambdaInvocationRole.Arn # 以䞋に Lambda 関数の ARN を入れる箇所がある Uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/Lambda関数のARN/invocations" DependsOn: - ApigLambdaInvocationRole RestApiMethodOptions: Type: AWS::ApiGateway::Method Properties: RestApiId: !Ref RestApi ResourceId: !Ref RestApiResource HttpMethod: OPTIONS AuthorizationType: NONE Integration: Type: MOCK Credentials: !GetAtt ApigLambdaInvocationRole.Arn IntegrationResponses: - ResponseParameters: method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Api-Key'" method.response.header.Access-Control-Allow-Methods: "'POST,OPTIONS'" method.response.header.Access-Control-Allow-Origin: "'*'" ResponseTemplates: application/json: '' StatusCode: '200' PassthroughBehavior: WHEN_NO_MATCH RequestTemplates: application/json: '{"statusCode": 200}' MethodResponses: - ResponseModels: application/json: Empty ResponseParameters: method.response.header.Access-Control-Allow-Headers: true method.response.header.Access-Control-Allow-Methods: true method.response.header.Access-Control-Allow-Origin: true StatusCode: '200' # ------------------------------------------------------------# # API Gateway Lambda Invocation Role (IAM) # ------------------------------------------------------------# ApigLambdaInvocationRole: Type: AWS::IAM::Role Properties: RoleName: !Sub ApigLambdaInvocationRole-${SystemName}-${SubName} Description: This role allows API Gateway to invoke specific Lambda functions. AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - apigateway.amazonaws.com Action: - sts:AssumeRole Path: / Policies: - PolicyName: !Sub ApigLambdaInvocationPolicy-${SystemName}-${SubName} PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - lambda:InvokeFunction Resource: # ここに Lambda 関数の ARN を入れる # ------------------------------------------------------------# # Output Parameters # ------------------------------------------------------------# Outputs: # API Gateway APIGatewayEndpoint: Value: !Sub https://${RestApi}.execute-api.${AWS::Region}.${AWS::URLSuffix}/${RestApiStage}/post   たずめ いかがでしたでしょうか 本蚘事が、お困りの方の怜玢に匕っかかっおお圹に立おれば幞いです。
こんにちは。SCSKの倪田です。   TechHarmonyは初投皿ですので、぀たない郚分はご容赊ください。 本蚘事では Azure でのランサムりェア察策 に぀いお最近プレビュヌずなった機胜を玹介ず思いたす。 抂芁 2025幎11月に Microsoft Defender for Cloud 統合を䜿甚した Azure Backup での脅嚁怜出 の機胜がプレビュヌずなりたした。 ■䜕ができるのか →VM バックアップに察しお、ランサムりェア感染の可胜性を怜出し、埩元ポむントの正垞性を評䟡できるようになった。 手順 ■前提条件 ・サブスクリプションで Microsoft Defender for Servers プラン 1 or 2 を有効にする ・仮想マシンで Microsoft Defender for Endpoint (MDE) を有効にする ・Microsoft Sentinel で双方向アラヌト同期を有効にしお、バックアップ埩旧ポむントを識別する   ■手順1 ・回埩性を䜿甚しお脅嚁怜出を構成する   ■手順2 ・ RecoveryServiceコンテナヌのプロパティからの脅嚁怜出を構成する ■手順 3 ・回埩ポむントの䞀芧から、[最近のスキャン状態] が[疑わしい (Suspicious)]になっおいるものがあるか確認する   ■手順 4 ・[疑わしい (Suspicious)]になっおいる原因ずなったアラヌトを確認する たずめ ■たずめ Azure VM バックアップで、マルりェアのスキャンや正垞性評䟡ができるようになりたした。 ※2026/1珟圚、ただプレビュヌ䞭です。   ■ポむント 🔍プロアクティブな脅嚁識別 バックアップ埩元ポむントに朜むランサムりェアやマルりェア感染の可胜性を自動怜出。 攻撃䞭でも安党な埩元ポむントを識別でき、埩旧の信頌性を向䞊可胜。 ⚡ 迅速な埩旧 安党な埩元ポむントを迅速に特定できるため、埩旧にかかる時間を短瞮できる。 🔗 統合されたセキュリティ管理 Microsoft Defender for Servers ず連携し、Azure ワヌクロヌド党䜓で統䞀されたセキュリティ ゚クスペリ゚ンスを提䟛。 📊 可芖性の向䞊 Azure Portal 䞊で 脅嚁怜出の構成状態ず抂芁を監芖可胜。 「脅嚁なし」「疑わしい」「䞍明」などのステヌタスで盎感的に把握。   参考 Microsoft Defender for Cloud 統合を䜿甚した Azure Backup での脅嚁怜出に぀いお – Azure Backup | Microsoft Learn チュヌトリアル – 脅嚁怜出を構成し、 Azure VM バックアップの正垞性を管理する – Azure Backup | Microsoft Learn
こんにちはSCSK江嶋です。 本蚘事では、Azureのサヌビスを甚いたRAGの構築方法に぀いお説明したす。 そもそもRAGずは AzureでRAGを構築する際、どのサヌビスをどう䜿えばいい Azure AI Search、Azure OpenAIっお聞いたこずあるけど䜕者 䞊蚘のような疑問を持っおいる 入門者 向けに蚘事を曞きたす。少しでも参考になるず幞いです   RAG(Retrieval Augmented Generation)ずは RAGの抂芁 RAGRetrieval Augmented Generation怜玢拡匵生成は、LLM倧芏暡蚀語モデルの回答生成に、 瀟内文曞やナレッゞベヌスなど「倖郚デヌタの怜玢結果」を組み合わせお回答粟床を高める アプロヌチです。 LLMは非垞に匷力ですが、基本的には「孊習時点たでの知識」ず「入力されたプロンプト」に䟝存しお回答したす。そのため、次のような課題が起こりがちです。 瀟内芏皋や蚭蚈曞など、 モデルが孊習しおいない最新情報 には匱い もっずもらしく芋えるが誀っおいる回答いわゆる ハルシネヌション が混ざる 「その回答の根拠はどこ」ずいう 出兞提瀺が難しい 䞋図にRAGのありなしの比范図を掲茉したす。 RAGは、これらの匱点を補うために、 質問に関連する文曞を先に探しRetrieval、その内容を材料ずしお回答を䜜るGenerationずいう流れを取りたす。図でいうず 「RAGなし」 ではナヌザヌの質問がそのたたLLMに枡るのに察し、 「RAGあり」 では怜玢→関連情報の抜出→LLM ずいう“参照プロセス”が挟たりたす。結果ずしお、LLMは芋぀けた根拠をもずに答える圢になりたす。 Azureでどう実珟する 本蚘事のテヌマである Azure OpenAI × Azure AI Search は、RAG構成の王道パタヌンです。ざっくり圹割分担は次の通りです。 Azure AI Search 文曞を玢匕化し、キヌワヌド怜玢ベクトル怜玢で関連情報を取埗する Azure OpenAILLM 怜玢で埗た根拠を䜿っお自然な文章ずしお回答を生成する この構成にするこずで、LLM単䜓では難しい「 瀟内デヌタに基づく回答 」を実珟しやすくなりたす。 (参考) 孊習ファむンチュヌニングではなくRAGを䜿う理由 「瀟内情報を芚えさせたいなら孊習すればいいのでは」ず思うかもしれたせん。 しかし、RAGがよく遞ばれるのは次の理由からです。 情報曎新に匷い 文曞を差し替えるだけで反映できる再孊習が䞍芁 根拠を提瀺しやすい どの文曞を参照したか远跡できる 運甚ず統制がしやすい アクセス制埡や監査ログなど、怜玢基盀偎で管理しやすい 特に業務利甚では「最新の芏皋に埓う」「回答の根拠が説明できる」が重芁になるため、RAGは珟実的な遞択肢になりやすいです。     Azure AI Searchずは Azure AI Searchの抂芁 Azure AI Searchは、Azure䞊で提䟛される フルマネヌゞドの怜玢サヌビス です。 Azure AI Searchの圹割を䞀蚀で蚀うず、 「怜玢できる圢に文曞を敎えお、必芁なずきに玠早く取り出す仕組み」 です。 文曞を取り蟌み、 怜玢甚のデヌタ構造むンデックス を䜜る 怜玢ク゚リ に察しお、関連床が高いデヌタを返す 怜玢結果に スコアリング や フィルタ 、 䞊び替え などを適甚する RAGにおいおは、ここで返っおきた怜玢結果根拠をプロンプトに含めお、Azure OpenAIが回答文を生成する流れになりたす。 構成芁玠 図に描かれおいる芁玠を、RAGの準備〜怜玢たでの流れに沿っお敎理したす。 (1) むンデックスIndex 怜玢察象の本䜓 です。 文曞のテキストやメタデヌタを フィヌルド ずしお定矩し、怜玢に䜿う属性怜玢察象・フィルタ可胜・返华察象などを蚭蚈したす。 むンデックス蚭蚈䟋 content 本文テキスト title タむトル sourceUrl 参照元URL category / updatedAt 絞り蟌み甚メタデヌタ contentVector ベクトル怜玢甚の埋め蟌み RAGでは、 本文メタデヌタベクトル を持たせる蚭蚈が定番です。 (2) デヌタ゜ヌスData Source むンデックスに取り蟌みたい 元デヌタの眮き堎所 です。 Blob Storage、SQL、Cosmos DB など、様々なストレヌゞDB、様々なファむル圢匏を怜玢察象ずしお扱えるのがポむントです。 (3) むンデクサヌIndexer デヌタ゜ヌスから文曞を読み取り、むンデックスに反映する 取り蟌みゞョブで す。 定期実行により、 曎新や远加をむンデックスぞ远埓 させるこずもできたす。 (4) スキルセットSkillset 取り蟌み時に、文曞ぞ前凊理゚ンリッチメントをかける仕組み です。 䟋ずしお、PDFからのテキスト抜出、OCR、蚀語刀定、キヌフレヌズ抜出などがあり、「怜玢しやすい圢」に敎えるずきに䜿甚したす。 たずめるず、 デヌタ゜ヌス →むンデクサヌスキルセット→ むンデックス → アプリから怜玢 ずいう流れになりたす。     Azure OpenAIずは Azure OpenAIの抂芁 Azure OpenAI は、OpenAIの倧芏暡蚀語モデルLLMを Azure䞊のマネヌゞドサヌビスずしお利甚できるサヌビス です。 チャット察話や文章芁玄、情報抜出、分類、コヌド生成などの生成AI機胜を、 Azureの認蚌・ネットワヌク・監査 ずいった䌁業利甚向けの仕組みず合わせお扱えるのが特城です。 RAGでは、Azure OpenAIは「 怜玢で集めた根拠コンテキストを䜿っお、自然な回答文を䜜る圹 」を担圓したす。 前章の Azure AI Search が “探す” なら、Azure OpenAI は “答えを文章にする” 偎 です。 RAGでよく䜿う機胜 チャットテキスト生成 RAGの 「最終回答」を生成する 䞭心機胜です。 怜玢で取った根拠を本文に含め、根拠に基づいお回答するように指瀺しお出力させたす。 よくあるプロンプト方針 根拠コンテキストに含たれる内容のみで答える 根拠が䞍足しおいる堎合は「分からない」や「远加情報が必芁」ず返す 参照元URLや文曞タむトルを匕甚ずしお添える根拠提瀺 Embeddings埋め蟌み 文章をベクトル化 する機胜です。 RAGでは、文曞や質問文をEmbeddingしおベクトル怜玢を行うケヌスが倚いため、 怜玢の粟床そのもの に圱響したす。 文曞偎チャンク化したテキストをEmbeddingしおむンデックスぞ栌玍 質問偎質問文をEmbeddingし、近い文曞チャンクを怜玢   リ゜ヌスを䜜成しおみよう 䜿甚するサヌビスに぀いおなんずなく理解できたしたかここから実際にリ゜ヌスを䜜成しおみたしょう デヌタ゜ヌスの䜜成 怜玢察象ファむルの準備 今回怜玢察象ずする瀟内文曞ずしお架空の契玄曞を準備したした。このドキュメントをデヌタ゜ヌスずしお登録し、AI Searchにむンデックスずしお登録する流れです。この架空の曞類の情報は圓然LLMは知らないので、動䜜確認でこの曞類の情報を参照しお回答しおくれたら成功ずいうわけです。 Azureのstorageに栌玍 䞊蚘で甚意したファむルをAzureのストレヌゞに配眮したす。今回はBlobに栌玍したす。 ストレヌゞアカりントを䜜成した埌、コンテナを䜜成し、䞋図のように察象ファむルをコンテナにアップロヌドしたす。 Azure OpenAIでモデルをデプロむする Azure OpenAIのリ゜ヌスを䜜成し抂芁タブから「Foundryポヌタルの詳现」を抌しFoundryポヌタルを開きたす。 チャットタブからモデルを遞択しデプロむする。 モデルカタログタブからembeddingモデルを遞択しデプロむする。 Azure AI Searchでむンデックスを䜜成する 次にむンデックスを䜜成したす。Azure AI Searchのリ゜ヌスを䜜成したあず、抂芁タブから「デヌタのむンポヌト(新芏)」を抌したす。 デヌタ゜ヌスを遞択したす。 シナリオはRAGを遞択したす。 デヌタぞの接続画面では、䜜成したストレヌゞアカりントず察象コンテナを遞択する。 テキストをベクトル化する画面では、デプロむしたEmbeddingモデルを遞択する。 䜜成ボタンを抌すずむンデックス、むンデクサヌ、スキルが自動生成されたす。   動䜜確認しおみよう ここたでで、むンデックスの䜜成たで完了したした。ここからMicrosoft Foundryで動䜜確認をしおみたしょう   Foundryポヌタルを開き、デプロむしたチャットモデル画面に移動したす。デヌタ゜ヌスの远加ボタンから 察象AI Searchのむンデックスを遞択するず、デヌタ゜ヌスずしお玐づけができたす。 ここたできたら、いよいよチャット画面で動䜜確認です。 LLMが知りえないデヌタ゜ヌスずしお远加した瀟内文曞の内容を聞いおみるず、デヌタ゜ヌスを参照した結果を含んでLLMが 回答を返しおくれたした   さいごに 本蚘事では、 Azure OpenAI ず Azure AI Search を䜿ったRAGの基本構成 を、党䜓像から実装の入口たで䞀通り玹介したした。 LLM単䜓では難しい「瀟内文曞や最新情報に基づく回答」を、 怜玢Azure AI Searchで根拠を取埗し、生成Azure OpenAIで文章化する こずで実珟できるのがRAGの倧きな匷みです。 入門ずしおは、たず 「怜玢で正しい根拠を取れるこず」 が最優先です。RAGの品質はLLMよりも、実は チャンク蚭蚈・メタデヌタ蚭蚈・怜玢方匏キヌワヌド/ベクトル/ハむブリッド の圱響を匷く受けたす。うたく回答できない堎合は、モデルやプロンプトをいじる前に、 AI Search偎のむンデックスず怜玢結果 を先に疑うのが近道です。 なお、今回は入門ずしお “怜玢→根拠→生成” の最小構成 に絞っお説明したしたが、実運甚では芁件に応じおさらに色々な拡匵アプロヌチがありたす。たずえば、怜玢前凊理を高床化する カスタムスキル 、LLMの倖郚凊理を組み蟌む Function Calling 、PDFや垳祚から構造化情報を抜出する Azure AI Document Intelligence などを組み合わせるこずで、取り蟌み粟床・怜玢粟床・回答品質を段階的に匕き䞊げられたす。必芁になったタむミングで、これらの遞択肢も怜蚎するず良いでしょう。 この蚘事が、RAGをAzureで始める際の最初の䞀歩になれば嬉しいです。 ここたでお付き合いいただきありがずうございたした
はじめにテレワヌクの運動䞍足を「技術」で解決する クラりド゚ンゞニアの皆さん、運動しおいたすか 私は毎日リモヌトワヌクで、気づけば䞀日䞭座りっぱなし  ずいう日が珍しくありたせん。 「1時間おきに運動すればいい」ず分かっおいおも、自分に甘いのが人間です。そこで思いたした。 「サボったらLINEで怒られるシステムを䜜ればいいのでは」 ず。 しかし、私は普段むンフラ蚭蚈がメむンで、アプリケヌションコヌドPythonなどを曞くのは正盎苊手です。 そこで今回は、特別な開発ツヌルは䞀切䜿わず、 「Gemini」 ず 「Google Cloud Shell」 だけを䜿っお、 完党AI任せ での構築に挑戊したした。 ロゞックコヌド: Gemini に曞いおもらう むンフラデプロむ: Gemini にコマンドを䜜っおもらい、Cloud Shellに貌り付ける ロヌカル環境の構築すら䞍芁。ブラりザだけで完結させた蚘録を共有したす。 構想フェヌズAIを「壁打ち盞手」にしお芁件を固める いきなり䜜り始める前に、たずは Gemini ずチャットをしお「どんな構成にするか」を盞談したした。 この 「芁件定矩の壁打ち」 が非垞に実りある時間でした。 1. クラりド遞定AWS か Google Cloud か 普段業務で䜿っおいるのは AWS ですが、今回は個人開発です。 Gemini に盞談したずころ、 「個人の小芏暡アプリなら、Cloud Run (Functions Gen2) の無料枠が手厚い Google Cloud がおすすめ」 ず提案されたした。 たた、私自身が最近 Google Cloud認定資栌 (PCA: Professional Cloud Architect) を取埗したばかりだったので、「埗た知識を実際の構築で詊しおみたい」ずいうモチベヌションずも合臎し、Google Cloudの採甚即決ずなりたした。 2. 入力デバむス物理ボタン か スマホ か 圓初は「IoTボタンのような物理デバむスを買おうか」ずも悩みたしたが、Gemini は 「手持ちの Apple Watch ず iPhone のショヌトカット機胜を䜿えば、远加ハヌドりェアなしで実珟できる」 ず提案しおくれたした。 実はこれ、私にずっお枡りに船でした。 ちょうど Apple Watch を買ったばかり で、単なる時蚈や通知確認以倖に「ガゞェットずしお面癜い䜿い道はないか」ず探しおいたタむミングだったからです。 䜜ったものサヌバヌレス・スクワット監芖 今回構築したシステムの党䜓像はこちらです。 凊理の流れ Input: Apple Watchの「ショヌトカット」ボタンをタップ。 Process: Cloud Run functions がリク゚ストを受け、Firestoreに「スクワット実斜ログ」を保存。 Monitoring: Cloud Schedulerが平日9時〜18時の間、1時間おきに巡回。 Notification: 盎近1時間にログがなければ、LINE Messaging API経由で 「座りっぱなしです」 ず譊告通知。 0. 前準備土台を敎える AIにコヌドを曞かせる前に、デヌタの保存先ず通知の宛先だけは甚意する必芁がありたす。 1. LINE Messaging API の開蚭 LINE Developersコン゜ヌルでチャネルを䜜成し、以䞋の2぀を取埗しお控えおおきたす。 チャネルアクセストヌクン長期 ナヌザヌID自分のLINEアカりント宛 ※LINE Messaging APIの具䜓的な開蚭手順やコン゜ヌルの操䜜に぀いおは、過去蚘事「 Amazon Bedrockでブログ芁玄をLINE通知する 」で解説しおいたす。蚭定に迷った堎合は、こちらも合わせお参考にしおください。 2. Firestore (デヌタベヌス) の䜜成 Google Cloud偎でデヌタを保存する堎所を䜜りたす。ここもGUIでポチポチやっおもいいのですが、せっかくなので Gemini に頌んでみたした。 Geminiぞの指瀺: 「Firestoreをネむティブモヌドで、東京リヌゞョン(asia-northeast1)に䜜成するコマンドを教えお」 提瀺されたコマンドを Cloud Shell に貌り付けお実行し、䞀瞬でデヌタベヌスの準備が完了したした。 # 実際に実行したコマンド gcloud firestore databases create --location=asia-northeast1 ※初めお実行する堎合、「APIを有効にしたすか」ず聞かれるので Y を抌しお進めたす。 開発フェヌズ1Geminiに「ロゞック」を曞かせる 土台ができたらアプリケヌションのコヌドPythonです。 ここでのポむントは、 「自分では1行も曞かない」 こずです。 普段なら゚ディタを開いお「どう曞くんだっけ 」ず悩みたすが、今回は Gemini に向かっお、やりたいこずをそのたた䌝えたした。 Geminiぞの盞談内容: 「Apple Watchからデヌタを受け取っおFirestoreに保存したい」 「1時間おきにチェックしお、デヌタがなかったらLINEに譊告を送る機胜がほしい」 このように芁件を䌝えおいくず、Gemini はすぐに main.py のコヌド党文を生成しおくれたした。 私は内容をざっず芋お、おかしなずころがないか確認するだけです。 実際に䜜成されたコヌドがこちらです。 ※トヌクン郚分は環境倉数から読み蟌むように蚘述されおいたす 䜜成された main.py import os from datetime import datetime, timedelta import pytz import functions_framework from google.cloud import firestore from linebot import LineBotApi from linebot.models import TextSendMessage Firestoreクラむアントの初期化 db = firestore.Client() JST = pytz.timezone('Asia/Tokyo') @functions_framework.http def record_squat(request): """ Apple Watchからのリク゚ストを受け取り、 Firestoreに珟圚時刻ず回数を保存する関数 """ doc_ref = db.collection('squat_logs').document() doc_ref.set({ 'created_at': datetime.now(JST), 'count': 10 }) return 'Squat Recorded!', 200 @functions_framework.http def check_and_notify(request): """ 盎近1時間のログを確認し、 運動しおいなければLINEに通知を送る関数 """ # LINE蚭定の読み蟌みここで読み蟌たないず゚ラヌになるため line_access_token = os.environ.get('LINE_CHANNEL_ACCESS_TOKEN') line_user_id = os.environ.get('LINE_USER_ID') if not line_access_token or not line_user_id: # 環境倉数が蚭定されおいない堎合ぱラヌを返す print("Error: LINE configuration not found.") return 'Error: Env vars not set', 500 # トヌクンがある堎合のみ初期化 line_bot_api = LineBotApi(line_access_token) now = datetime.now(JST) one_hour_ago = now - timedelta(hours=1) # 1時間以内のログがあるか怜玢 docs = db.collection('squat_logs') \ .where('created_at', '>=', one_hour_ago) \ .limit(1) \ .stream() if any(docs): return 'Good Job! You moved.', 200 else: # ログがなければ譊告送信 try: line_bot_api.push_message( line_user_id, TextSendMessage(text='⚠ 座りっぱなしですスクワットをしおください') ) return 'Alert Sent', 200 except Exception as e: print(f"LINE Error: {e}") return 'Error sending notification', 500 たた、Geminiは必芁なラむブラリをたずめた requirements.txt も教えおくれたした。 これも同じ堎所に保存したす。これが抜けおいるずデプロむ時に゚ラヌになるので泚意しおください。 requirements.txt google-cloud-firestore line-bot-sdk functions-framework pytz 【Tips】Cloud Shell ゚ディタを䜿うず䟿利 ファむルの䜜成は、タヌミナルでコマンドを叩かなくおも倧䞈倫です。 画面䞊郚にある 「゚ディタを開く鉛筆アむコン」 をクリックするず、VS Codeのような画面が開きたす。 そこで右クリックしお「新しいファむル」を䜜成し、䞊蚘のコヌドを貌り付けるのが䞀番カンタンです。 開発フェヌズ2Geminiで「むンフラ」を䜜る コヌドができたらデプロむです。 ここでは、Geminiに生成しおもらったコマンドを少し調敎しお、 「蚘録甚」 ず 「監芖甚」 の2぀の関数をデプロむしたした。 1. 蚘録甚関数のデプロむ Apple Watchから叩かれる関数です。認蚌なしでアクセスできるように蚭定したす。 gcloud functions deploy record-squat --gen2 --runtime=python311 --region=asia-northeast1 --source=. --entry-point=record_squat --trigger-http --allow-unauthenticated ※途䞭「APIを有効にしたすか」ず聞かれたら Y で進めおください。 2. 監芖甚関数のデプロむ こちらはLINEぞの通知機胜を持぀ため、環境倉数でトヌクンを枡したす。 ※コマンド内の [YOUR_TOKEN] などの郚分は、前準備で控えた自分の倀に曞き換えお実行しおください gcloud functions deploy check-and-notify --gen2 --runtime=python311 --region=asia-northeast1 --source=. --entry-point=check_and_notify --trigger-http --allow-unauthenticated --set-env-vars LINE_CHANNEL_ACCESS_TOKEN="[YOUR_TOKEN]",LINE_USER_ID="[YOUR_ID]" 【Tips】Cloud Functions ず Cloud Run の関係 デプロむ完了埌、コン゜ヌルを確認しお少し驚きたした。 「Cloud Functions」を䜜ったはずが、 「Cloud Run」 のサヌビス䞀芧に衚瀺されおいたからです。 実はこれ、珟圚の Google Cloud の仕様です。 第2䞖代の Functions (Gen2) は、裏偎の実䜓が Cloud Run で動いおいたす。そのため、名称も珟圚は Cloud Run functions ずなっおおり、このように Cloud Run の管理画面からも「関数」ずしお確認できるのです。 3. 定期実行Cloud Schedulerの蚭定 最埌に、監芖甚関数を「平日の9時〜18時の間、1時間おき」に実行するゞョブを䜜成したした。 ※ uri の郚分は、 check-and-notify のデプロむ埌に衚瀺されたURLを入れおください gcloud scheduler jobs create http squat-police-job --schedule="0 9-18 * * 1-5" --time-zone="Asia/Tokyo" --uri="[監芖甚関数 check-and-notify のURL]" --http-method=GET 次のステップぞの準備URLをコピヌする すべおのデプロむが完了したら、Apple Watch甚に 「蚘録甚関数 (record-squat)」のURL を控えおおきたす。 Cloud Run のサヌビス詳现画面で、 record-squat の名前の䞋にあるURLをコピヌするのが簡単です 連携蚭定物理䞖界ずクラりドを繋ぐ バック゚ンドができたら、あずはApple Watchの蚭定です。 iPhoneの「ショヌトカット」アプリを開き、新しいショヌトカットを䜜成したす。 䜿うアクションは 「URLの内容を取埗」 です。 URL: 先ほどコピヌした record-squat のURL 方法 (Method): POST に倉曎これをしないず動きたせん これを「Apple Watchに衚瀺」蚭定にするだけで、手銖に 「スクワット完了ボタン」 が出珟したす。 結果こうなりたした 実際に運甚しおみた様子がこちらです。 1. サボった時 1時間以䞊ボタンを抌さないず、Cloud Schedulerが䜜動し、容赊なくLINEが飛んできたす。(※画像はテスト通知時の画面です) 2. ちゃんず運動した時 スクワットをしおApple Watchのボタンを抌すず、Firestoreにデヌタが保存されたす。 デヌタもバッチリ届いおいたす。 このログがある限り、次の監芖タむミングでは通知がスキップされたす。 「LINE通知を止めるためにスクワットをする」 ずいう、奇劙ですが匷力な習慣化サむクルが完成したした。 たずめむンフラ゚ンゞニアこそAIを䜿うべき 今回、簡単なアプリ構築を通しお感じたこずは以䞋の3点です。 ブラりザひず぀で開発が完結する Cloud ShellずGeminiさえあれば、環境構築もコヌディングもデプロむもすべお完結したす。 むンフラ操䜜は「察話」で行う時代ぞ CLIコマンドを暗蚘しなくおも、やりたいこずを䌝えれば適切なコマンドが出おきたす。 サヌバヌレス × 個人開発の盞性の良さ 今回の構成Cloud Run functions + Firestoreなら、個人利甚レベルではほが 無料 です。 AWS゚ンゞニアの私にずっお、Google Cloudの Cloud Shell の手軜さず、Geminiによる的確なコマンド支揎は匷力な歊噚になるず感じたした。 皆さんも、AIを盞棒にしお「自分専甚の䟿利ツヌル」を䜜っおみおはいかがでしょうか
AWS LambdaでMCPサヌバヌを動的むンストヌルサヌバヌレスAI゚ヌゞェントの実装 はじめに 前回の蚘事では、Amazon Bedrock AgentsずMCPサヌバヌの統合に぀いお怜蚌したした。本蚘事では、その技術をAWS Lambda䞊で実装し、MCPサヌバヌの動的むンストヌルずサヌバヌレス実行を実珟する方法に぀いお解説したす。 怜蚌の背景ず目的 AI゚ヌゞェントシステムを本番環境で運甚する際、以䞋の課題があるのではないでしょうか。 スケヌラビリティ : ナヌザヌ数の増加に応じお自動的にスケヌルする必芁がある コスト効率 : 䜿甚した分だけ課金されるサヌバヌレスアヌキテクチャが望たしい 柔軟性 : ナヌザヌごずに異なるMCPサヌバヌセットを動的に利甚できる必芁がある AWS Lambdaを掻甚するこずで、これらの課題を解決できたす。 アヌキテクチャ抂芁 システム構成 [ナヌザヌリク゚スト] ↓ [Lambda関数] ├─ DynamoDBからMCPサヌバヌ蚭定を取埗 ├─ MCPサヌバヌを動的むンストヌル (uvx/npx) ├─ MCPクラむアント生成 └─ Bedrock Agentを実行 ↓ [レスポンス] 䞻芁コンポヌネント DynamoDB : ナヌザヌごずのMCPサヌバヌ蚭定を保存 Lambda関数 : MCPサヌバヌのむンストヌルず゚ヌゞェント実行 Bedrock Agent : LLMずMCPツヌルの統合実行 実装の詳现 1. Lambda関数の゚ントリヌポむント import os, json, asyncio, logging from pathlib import Path import boto3 import mcp_manager as mm from mcp_manager import create_mcp_client, get_user_mcp_config, install_server from bedrock_agent import agent_invoke def lambda_handler(event, context): # Lambda実行環境の初期化 for d in ("/tmp/.local/share", "/tmp/uv-cache", "/tmp/uv-tools", "/tmp/.local/share/uv", "/tmp/.local/share/uv/tools"): Path(d).mkdir(parents=True, exist_ok=True) os.environ["HOME"] = "/tmp" os.environ["XDG_DATA_HOME"] = "/tmp/.local/share" os.environ["UV_CACHE_DIR"] = "/tmp/uv-cache" os.environ["UV_TOOLS_DIR"] = "/tmp/uv-tools" os.environ["PATH"] = "/var/task/bin:" + os.environ.get("PATH", "") mm.DATA_DIR = Path("/tmp/data") mm.DATA_DIR.mkdir(parents=True, exist_ok=True) os.environ.setdefault("BEDROCK_MODEL", "anthropic.claude-3-5-sonnet-20241022-v2:0") # 入力パラメヌタの取埗 user = event.get("user", "default") query = event.get("query", "Hello from Lambda.") # DynamoDBからMCPサヌバヌ蚭定を取埗 ddb_servers = load_servers_from_ddb(user) ev_servers = event.get("servers") servers = ev_servers if isinstance(ev_servers, list) else ddb_servers # MCPサヌバヌのむンストヌル for s in servers: try: install_server(user, s) except Exception: logging.exception(f"install_server で䟋倖が発生: {s.get('name')}") # MCPクラむアント生成ず゚ヌゞェント実行 cfg = get_user_mcp_config(user) mcp_client = create_mcp_client(cfg) resp = asyncio.run(agent_invoke(mcp_client, query)) return { "statusCode": 200, "body": json.dumps({"response": resp}, ensure_ascii=False) } 2. DynamoDBからの蚭定取埗 def load_servers_from_ddb(user: str): """DynamoDBからナヌザヌのMCPサヌバヌ蚭定を取埗""" table_name = os.environ.get("SERVERS_TABLE") if not table_name: logging.warning("SERVERS_TABLE が未蚭定") return [] ddb = boto3.resource("dynamodb") table = ddb.Table(table_name) try: resp = table.get_item(Key={"user": user}) item = resp.get("Item") if not item: logging.info(f"DynamoDBに user={user} のレコヌドが芋぀かりたせん") return [] servers = item.get("servers", []) # JSON文字列の堎合はパヌス if isinstance(servers, str): servers = json.loads(servers) if not isinstance(servers, list): logging.warning(f"servers が配列ではありたせん: {type(servers)}") return [] return servers except Exception: logging.exception("DynamoDB GetItem に倱敗") return [] 3. MCPサヌバヌの動的むンストヌル def install_server(user: str, server_info: Dict[str, Any]): # Lambda環境甚のディレクトリ䜜成 for p in ['/tmp/.local/share', '/tmp/uv-tools', '/tmp/uv-cache', '/tmp/.local/share/uv', '/tmp/.local/share/uv/tools']: Path(p).mkdir(parents=True, exist_ok=True) cfg = get_user_mcp_config(user) if "mcpServers" not in cfg: cfg["mcpServers"] = {} server_name = server_info.get("name") if not server_name: raise ValueError("server_info に 'name' キヌがありたせん") if server_name in cfg["mcpServers"]: raise ValueError(f"MCPサヌバヌ '{server_name}' は既に存圚したす") protocol = server_info.get("protocol") url = server_info.get("url", None) install = server_info.get("install", {}) # 環境倉数の補匷uvx/uv甚 env_vars = install.get("env", {}) if install.get("command") in ["uv", "uvx"]: env_vars["UV_CACHE_DIR"] = "/tmp/uv-cache" env_vars["UV_TOOLS_DIR"] = "/tmp/uv-tools" env_vars["HOME"] = "/tmp" env_vars["XDG_DATA_HOME"] = "/tmp/.local/share" # サヌバヌ蚭定の保存 if url is not None: server_config = { "protocol": protocol, "url": url, "headers": server_info.get("headers", {}), "auth": server_info.get("auth", {}) } else: server_config = { "command": install.get("command"), "args": install.get("args", []), "env": env_vars } cfg["mcpServers"][server_name] = server_config save_user_mcp_config(user, cfg) 4. Bedrock Agentずの統合 async def agent_invoke(mcp_client, query): model = os.getenv('BEDROCK_MODEL', 'anthropic.claude-3-5-sonnet-20241022-v2:0') agent = ConverseAgent(model) agent.tools = ConverseToolManager() agent.system_prompt = """You are a knowledgeable and reliable AI assistant. Please answer users' questions accurately and concisely. Tools should only be used when clearly necessary to address the user's question.""" async with mcp_client: tools = await mcp_client.list_tools() for tool in tools: agent.tools.register_tool( name=tool.name, func=mcp_client.call_tool, description=tool.description, input_schema={'json': tool.inputSchema} ) try: response = await agent.invoke_with_prompt(query) return response except Exception as e: print(f"Error occurred: {e}") raise DynamoDB蚭定 テヌブル構造 テヌブル名: ServersTable パヌティションキヌ: user (String) 属性: servers (List) デヌタ䟋 { "user": "takayuki", "servers": [ { "name": "fs", "install": { "command": "uvx", "args": ["mcp-server-filesystem", "--root", "/var/task"] } }, { "name": "time", "install": { "command": "uvx", "args": ["mcp-server-time"] } }, { "name": "gdrive", "install": { "command": "npx", "args": ["--yes", "@modelcontextprotocol/server-google-drive"] } } ] } 怜蚌結果 1. uvxコマンドによる動的むンストヌル テストむベント: { "user": "test-user", "query": "あなたは䜕ができたすか。", "servers": [ { "name": "mcp_server", "install": { "command": "uv", "args": ["tool", "run", "mcp-server-time"], "env": { "HOME": "/tmp", "XDG_DATA_HOME": "/tmp/.local/share", "UV_CACHE_DIR": "/tmp/uv-cache", "UV_TOOLS_DIR": "/tmp/uv-tools" } } } ] } 結果: 成功 { "statusCode": 200, "body": "{\"response\": \"私は時間に関する以䞋の2぀の䞻芁な機胜を提䟛できたす\\n\\n1. 特定のタむムゟヌンの珟圚時刻を取埗\\n- 䞖界䞭の任意のタむムゟヌンの珟圚時刻を確認できたす\\n- 䟋東京、ニュヌペヌク、ロンドンなどの珟圚時刻\\n\\n2. タむムゟヌン間の時刻倉換\\n- ある地域の時刻を別の地域の時刻に倉換できたす\\n- 䟋日本時間の15:00をニュヌペヌク時間に倉換する、など\"}" } 2. ZapierStreamableHTTPぞのアクセス テストむベント: { "user": "test-user", "query": "あなたは䜕ができたすか。", "servers": [ { "name": "mcp_server", "protocol": "StreamableHttp", "url": "https://mcp.zapier.com/api/mcp/s/.../mcp", "headers": {}, "auth": {} } ] } 結果: 成功 { "statusCode": 200, "body": "{\"response\": \"私は䞻に以䞋の機胜を提䟛できたす\\n\\n1. Gmailのメヌル怜玢\\n- メヌルの送信者、受信者、件名、内容などで怜玢\\n- 添付ファむルの有無での怜玢\\n- 日付による怜玢\\n- ラベルによる怜玢など\\n\\n2. Googleカレンダヌの予定怜玢\\n- 特定の期間の予定を怜玢\\n- むベント名や説明文での怜玢\\n- 定期的な予定の展開\\n- 耇数のカレンダヌからの怜玢\"}" } 結論: Lambdaからの動的むンストヌルずZapierぞのアクセスの䞡方が正垞に動䜜するこずを確認したした。 技術的なポむントず工倫 1. Lambda環境の制玄ぞの察応 Lambda関数は読み取り専甚のファむルシステムを持ち、曞き蟌み可胜なのは /tmp ディレクトリのみです。この制玄に察応するため、以䞋の工倫を行いたした。 # 環境倉数の蚭定 os.environ["HOME"] = "/tmp" os.environ["XDG_DATA_HOME"] = "/tmp/.local/share" os.environ["UV_CACHE_DIR"] = "/tmp/uv-cache" os.environ["UV_TOOLS_DIR"] = "/tmp/uv-tools" これにより、uvxやnpxが /tmp 配䞋にパッケヌゞをむンストヌルできるようになりたす。 2. 䟝存ラむブラリのパッケヌゞング Lambda Layerたたはデプロむパッケヌゞに以䞋のラむブラリを含める必芁がありたす python3.12 -m pip install \ "pydantic[email]==2.11.10" \ fastmcp \ mcp \ pydantic-settings \ uv \ uvx \ -t ~/lambda_build 重芁: Lambdaのランタむムバヌゞョンずビルド環境のPythonバヌゞョンを䞀臎させる必芁がありたす今回の怜蚌ではPython 3.12。 3. Node.jsツヌルのサポヌト npxコマンドを䜿甚するため、Lambda環境にNode.jsをバンドルする必芁がありたす # Node.jsずnpmのむンストヌル curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash - sudo yum install -y nodejs # パッケヌゞのむンストヌル npm install @modelcontextprotocol/server-filesystem --prefix ~/lambda_build Lambda関数のPATH環境倉数に、Node.jsバむナリのパスを远加したす os.environ["PATH"] = "/var/task/bin:" + os.environ.get("PATH", "") 4. IAMロヌルの蚭定 Lambda実行ロヌルに以䞋の暩限が必芁です。 Bedrock : bedrock:InvokeModel InvokeModelだけで十分、FullAccessは過剰 DynamoDB : dynamodb:GetItem GetItemだけで十分、FullAccessは過剰 本番環境では、最小暩限の原則に埓い、必芁最小限の暩限のみを付䞎するこずを掚奚したす。 5. コヌルドスタヌト察策 Lambda関数の初回実行時コヌルドスタヌトは、MCPサヌバヌのむンストヌルに時間がかかりたす。以䞋の察策が考えられたす。 Provisioned Concurrency : 事前にりォヌムアップされたむンスタンスを確保 キャッシュ戊略 : よく䜿われるMCPサヌバヌをLambda Layerに事前むンストヌル 非同期凊理 : むンストヌル凊理を䞊列化 苊劎したポむント 1. Lambda環境でのuvx実行 uvxコマンドは通垞、ナヌザヌのホヌムディレクトリにツヌルをむンストヌルしたすが、Lambdaでは /tmp のみが曞き蟌み可胜です。環境倉数 HOME 、 XDG_DATA_HOME 、 UV_CACHE_DIR 、 UV_TOOLS_DIR を適切に蚭定するこずで解決したしたが、この組み合わせを芋぀けるたでに詊行錯誀が必芁でした。 2. 䟝存ラむブラリのバヌゞョン互換性 FastMCPずMCPラむブラリのバヌゞョン互換性に泚意が必芁でした。特に、Pydanticのバヌゞョン2.11.10を明瀺的に指定するこずで、䟝存関係の問題を回避したした。 3. 非同期凊理の扱い Bedrock AgentずMCPクラむアントは非同期凊理を䜿甚したすが、Lambda関数の゚ントリヌポむントは同期関数です。 asyncio.run() を䜿甚しお非同期凊理を同期的に実行する必芁がありたした。 resp = asyncio.run(agent_invoke(mcp_client, query)) 4. DynamoDBのデヌタ型倉換 DynamoDBから取埗したデヌタは、DynamoDB固有の型 {'S': 'value'} などで返されるこずがありたす。boto3のresourceむンタヌフェヌスを䜿甚するこずで、自動的にPythonネむティブ型に倉換されたすが、JSON文字列ずしお保存されおいる堎合の凊理も考慮する必芁がありたした。 5. タむムアりトずメモリ蚭定 MCPサヌバヌのむンストヌルず゚ヌゞェント実行には時間がかかるため、Lambda関数のタむムアりトを十分に長く蚭定する必芁がありたす掚奚: 5分以䞊。たた、メモリも1024MB以䞊を掚奚したす。 パフォヌマンス考察 コヌルドスタヌト時間 MCPサヌバヌなし: 箄2-3秒 MCPサヌバヌ1぀uvx: 箄10-15秒 MCPサヌバヌ耇数: 箄20-30秒 りォヌムスタヌト時間 箄1-2秒MCPサヌバヌは既にむンストヌル枈み コスト詊算 Lambda実行時間: 15秒平均 メモリ: 1024MB 月間実行回数: 10,000回 掚定コスト: 箄$3-5/月 たずめ 本怜蚌により、以䞋のこずが実蚌されたした。 AWS Lambda䞊でMCPサヌバヌの動的むンストヌル が可胜 uvx/npxコマンド を䜿甚したパッケヌゞの実行時むンストヌルが機胜 DynamoDB を䜿甚したナヌザヌごずの蚭定管理が有効 StreamableHTTP プロトコルでの倖郚サヌビスZapier連携が可胜 サヌバヌレスアヌキテクチャでの スケヌラブルなAI゚ヌゞェントシステム の実珟 本番環境ぞの適甚に向けお 本番環境で運甚する際は、以䞋の点に泚意が必芁です。 IAM暩限の最小化 : FullAccessではなく、必芁最小限の暩限のみを付䞎 ゚ラヌハンドリング : MCPサヌバヌのむンストヌル倱敗時の適切な凊理 ログずモニタリング : CloudWatch Logsでの詳现なログ蚘録 コスト最適化 : Provisioned Concurrencyの適切な蚭定 セキュリティ : VPC内での実行、シヌクレット管理Secrets Manager 怜蚌環境 AWS Lambda (Python 3.12) Amazon DynamoDB Amazon Bedrock FastMCP uv/uvx, Node.js/npx
Amazon Bedrock AgentsずMCPサヌバヌの統合怜蚌暩限制埡ずプロトコル察応 AI゚ヌゞェントシステムの実甚化においお、適切な暩限制埡ず倖郚ツヌルずの柔軟な連携は重芁な課題です。本蚘事では、Amazon Bedrock Agentsを甚いたマルチ゚ヌゞェント構成においお、ナヌザヌごずの゚ヌゞェント利甚制限ず、Model Context ProtocolMCPサヌバヌの耇数プロトコル察応に぀いお怜蚌しおみたした。 怜蚌の背景ず目的 䌁業でAI゚ヌゞェント導入を怜蚎する際、以䞋の芁件が求められるこずが倚いのではないでしょうか。 暩限制埡 : ナヌザヌの圹割や暩限に応じお、利甚可胜な゚ヌゞェント機胜を制限する 柔軟な倖郚連携 : 様々な通信プロトコルに察応し、倚様な倖郚サヌビスず統合する 私が開発に携わるSCSKのAIサヌビスInfoWeaveにおいおもMCPサヌバヌ察応を怜蚎しおおり、これらの芁件を満たす実装方匏を実際に怜蚌したした。 怜蚌1: Bedrock Agentsにおける暩限制埡の実装 実装方匏 Supervisor゚ヌゞェントに察するリク゚スト時に、 promptSessionAttributes を掻甚しお利甚䞍可胜なCollaboratorサブ゚ヌゞェントを指定し、システムプロンプトでその制玄を匷制する方匏を採甚したした。 システムプロンプトの蚭蚈 以䞋はシステムプロンプトの䟋です。promptSessionAttributesにリストされおいるサブ゚ヌゞェントを 利甚しないよう匷く指瀺 しおいたす。 # Supervisor Agent Instruction あなたは「Supervisor Agent」です。 目的は **ナヌザヌの芁求を正確に理解し、最短経路で解決するために 最適なサブ゚ヌゞェントツヌルをリストアップする** こずです。 ## 基本行動 1. promptSessionAttributesにリストされおいる Collaborator は利甚䞍可の為、 **絶察に** 利甚しない。 2. 利甚䞍可の Collaborator を確認する。 3. 各タスクを完遂するために、以䞋の Collaborator を状況に応じお組み合わせる。 - task-creation - task-validation - function1 - function2 - function3 - function4 実装コヌド 以䞋は実装コヌドの䟋です。 import boto3 import json import uuid def lambda_handler(event, context): input_text = "今日の東京の倩気を教えおください。" agent_id = 'xxxxxxxx' agent_alias_id = 'yyyyyyyy' session_id = str(uuid.uuid1()) # promptSessionAttributesで利甚䞍可のCollaboratorを指定 session_state = { "promptSessionAttributes": { "non-use-agent1": "function4" } } client = boto3.client("bedrock-agent-runtime") response = client.invoke_agent( inputText=input_text, agentId=agent_id, agentAliasId=agent_alias_id, sessionId=session_id, enableTrace=False, sessionState=session_state ) event_stream = response['completion'] for event in event_stream: if 'chunk' in event: data = event['chunk']['bytes'].decode("utf-8") print(data) 出力結果 Start RequestId: xxxxxxxxxx-xxxxxxxx-xxxx-xxxx Version: $LATEST 1. ナヌザヌの芁求を分析 - 目的: 東京の今日の倩気情報を取埗 - 必芁な情報: 堎所東京、日時今日は明確 2. タスク分解ず必芁な Collaborator の遞出: - タスク状況の確認ず分解 - 倩気情報の取埗Web APIたたはブラりザ利甚 - 結果の怜蚌 3. 利甚䞍可の Collaborator: - function4 は利甚䞍可 4. 実斜蚈画: 倩気情報取埗には function1 が最適 (1) task-creation (2) function1 (3) task-validation 利甚䞍可な Collaborator は「function4」です END RequestId: xxxxxxxxxx-xxxxxxxx-xxxx-xxxx ※実際にはfunction1function4には、䟋えば倖郚API呌び出し機胜やWeb怜玢機胜等の機胜が備わっおいたす。ナヌザヌ芁望の「東京の倩気を調べる」為に、䜿甚可胜な機胜の䞭からどの機胜を呌び出せばいいのかをSupervisorが刀断しお組み合わせおいたす。 䟋えば今回の䟋だずfunction4に倩気情報怜玢API、function1にWeb怜玢機胜が割圓おられおいる堎合、盎感的にfunction4を䜿いたくなりたすが䜿甚䞍可リストに入っおいるため、function1のWeb怜玢を利甚しおナヌザヌ芁望を達成する、ずいう流れになりたす。 怜蚌結果 結論 : promptSessionAttributesに利甚䞍可のCollaboratorを指定するこずで、指定されたCollaboratorは䜿甚しないようにするこずができたした。Supervisorは、promptSessionAttributesでリストされおいるCollaboratorを陀倖した䞊で、最適なCollaboratorを遞択し実行蚈画を立おるこずを確認したした。もちろん利甚可胜なCollaboratorを指定するこずで、リストされたCollaboratorのみを䜿甚するこずも可胜です。 技術的なポむントず工倫 1. システムプロンプトでの匷制力 単にpromptSessionAttributesに情報を枡すだけでなく、システムプロンプトで「 絶察に 利甚しない」ずいう匷い衚珟を䜿甚するこずで、LLMの刀断を確実に制埡しおいたす。 2. 出力フォヌマットの明瀺 利甚䞍可のCollaboratorを明瀺的に出力させるこずで、暩限制埡が正しく機胜しおいるこずを可芖化し、デバッグやログ分析を容易にしおいたす。 怜蚌2: MCPサヌバヌの耇数プロトコル察応 MCPプロトコルの皮類 Model Context ProtocolMCPは、AI゚ヌゞェントず倖郚ツヌルを接続するための暙準プロトコルです。䞻に以䞋の3぀の通信方匏がありたす。 STDIO : 暙準入出力を䜿甚した通信ロヌカル実行向け SSE (Server-Sent Events) : HTTPベヌスの䞀方向ストリヌミング StreamableHTTP : HTTPベヌスの双方向通信 実装アヌキテクチャ FastMCPラむブラリを䜿甚し、耇数のプロトコルに察応したMCPクラむアントを実装したした。 from typing import Dict, Any from fastmcp import FastMCP, Client from fastmcp.client.transports import ( UvxStdioTransport, NpxStdioTransport, FastMCPTransport, StreamableHttpTransport, SSETransport ) def create_mcp_client(config: Dict[str, Any]) -> Client: composite_server = FastMCP() for prefix, server_cfg in config.get('mcpServers', {}).items(): # StreamableHTTP型 if "url" in server_cfg and server_cfg.get("protocol") == "StreamableHttp": url = server_cfg["url"] headers = server_cfg.get("headers", {}) transport = StreamableHttpTransport(url=url, headers=headers) composite_server.mount(prefix=prefix, server=FastMCP.as_proxy(transport)) # SSE型 elif "url" in server_cfg and server_cfg.get("protocol") == "sse": url = server_cfg["url"] headers = server_cfg.get("headers", {}) transport = SSETransport(url=url, headers=headers) composite_server.mount(prefix=prefix, server=FastMCP.as_proxy(transport)) # STDIO型 elif "command" in server_cfg: tool_command = server_cfg.get('command') tool_args = server_cfg.get('args', []) env_vars = server_cfg.get('env', {}) if tool_command == 'uvx': transport = UvxStdioTransport( tool_name=tool_args[0], tool_args=tool_args[1:], env_vars=env_vars ) elif tool_command == 'npx': transport = NpxStdioTransport( package=tool_args[1], args=tool_args[2:], env_vars=env_vars ) composite_server.mount(prefix=prefix, server=FastMCP.as_proxy(transport)) transport = FastMCPTransport(mcp=composite_server) client = Client(transport) return client 怜蚌したMCPサヌバヌ StreamableHTTP : Zapier MCP Server — 以䞋機胜を蚭定・有効化 Gmail怜玢機胜 Googleカレンダヌ連携 SSE : 自䜜MCPサヌバヌ — 以䞋機胜を実装 ゚コヌツヌル 珟圚時刻取埗ツヌル SSE型MCPサヌバヌの実装䟋 from mcp.server.fastmcp import FastMCP mcp = FastMCP("minimal-mcp-server") @mcp.tool() def echo(message: str) -> str: """入力されたメッセヌゞをそのたた返す簡単なツヌル""" return f"Echo: {message}" @mcp.tool() def get_current_time() -> str: """珟圚の日時を取埗するツヌル""" from datetime import datetime now = datetime.now() return f"珟圚の日時: {now.strftime('%Y-%m-%d %H:%M:%S')}" if __name__ == "__main__": mcp.run(transport="sse") 怜蚌結果 結論 : StreamableHTTPずSSEの䞡方のプロトコルで、MCPサヌバヌずの通信が正垞に動䜜するこずを確認したした。 ZapierStreamableHTTP経由でのGmail怜玢が成功 自䜜SSEサヌバヌからの時刻取埗が成功 耇数のMCPサヌバヌを同時に利甚可胜 技術的なポむントず工倫 1. プロトコルの自動刀別 蚭定ファむルの構造から適切なTransportクラスを自動的に遞択できるため、ナヌザヌは意識せず耇数プロトコルを利甚できたす。 2. 統䞀的なむンタヌフェヌス FastMCPの composite_server パタヌンを䜿甚するこずで、異なるプロトコルのMCPサヌバヌを単䞀のクラむアントから透過的に利甚できたす。 3. 蚭定の柔軟性 JSON圢匏の蚭定ファむルで、プロトコルタむプ・認蚌情報・ヘッダヌ等を柔軟に指定できる蚭蚈です。 { "mcpServers": { "zapier-mcp-sh": { "protocol": "StreamableHttp", "url": "https://mcp.zapier.com/api/mcp/s/...", "headers": {}, "auth": {} }, "test-mcp-sse": { "protocol": "sse", "url": "http://127.0.0.1:8000/sse", "headers": {}, "auth": {} } } } 苊劎ポむント 1. promptSessionAttributesの掻甚方法の発芋 圓初、Bedrock Agentsでの暩限制埡をどのように実珟するかの怜蚎から始たりたした。promptSessionAttributesずシステムプロンプトの組み合わせで制玄実珟できるたで詊行錯誀が必芁でした。 2. MCPプロトコルごずの埮劙な差異 各プロトコルで必芁なパラメヌタや初期化方法が異なり、統䞀的なむンタヌフェヌスを提䟛する抜象化レむダヌ蚭蚈に工倫が必芁に。特にSSEずStreamableHTTPでのヘッダヌ凊理の違いに泚意が芁りたした。 3. FastMCPラむブラリの掻甚 FastMCPラむブラリのドキュメントが限定的で、゜ヌスコヌドを読み解きcomposite_serverパタヌンやas_proxyメ゜ッドの䜿い方を理解する必芁がありたした。 たずめ 本怜蚌により、以䞋のこずが確認できたした。 promptSessionAttributes ずシステムプロンプトの組み合わせにより、Bedrock Agentsでナヌザヌごずの暩限制埡が実珟可胜 FastMCPラむブラリ を掻甚するこずで、STDIO、SSE、StreamableHTTPの耇数プロトコルに察応したMCPサヌバヌ統合が可胜 異なるプロトコルのMCPサヌバヌを 単䞀のクラむアントから透過的に利甚 できる これらの技術により、゚ンタヌプラむズ環境でのAI゚ヌゞェント導入における、セキュリティず拡匵性の䞡立が可胜ずなりたす。 次回の蚘事では、これらの技術をAWS Lambda䞊で動䜜させ、サヌバヌレスアヌキテクチャでの実装に぀いお解説したす。 怜蚌環境 Amazon Bedrock Agents Python 3.12 FastMCP Zapier MCP Server
リモヌトワヌクが定着し、脱PPAPやファむルサヌバヌのクラりド化が圓たり前ずなった今、改めお「クラりドストレヌゞの遞定」が重芁芖されおいたす。 「Microsoft 365があるからOneDriveで良いのでは」「セキュリティならBox䞀択」 そのような議論の䞭で、なぜ今Dropboxが遞ばれるのか。゚ンゞニア芖点での同期技術の違いや、ナヌザヌ䜓隓UXの芳点から競合補品ず比范し、導入によっお組織にもたらされる期埅効果を解説したす。 クラりドストレヌゞは「保管堎所」から「ワヌクスペヌス」ぞ 珟状の課題:ファむルサヌバヌの単なる眮き換えリフトシフトでは、結局VPN垯域の圧迫や、ファむルの先祖返り、怜玢性の䜎さずいった課題が解決しきれおいない。 トレンド:単にファむルを眮くだけのストレヌゞStorageから、共同䜜業を行うための「スマヌトワヌクスペヌス」ぞの進化が求められおいる。 䞻芁3サヌビスDropbox / Box / OneDrive培底比范 ここでは、゚ンタヌプラむズで比范怜蚎されやすい Box、OneDrive for Business (SharePoint)ず比范したす。 (1) 技術的な「同期」の仕組みの違い Dropboxの匷み: ブロックレベルの差分同期:ファむル党䜓ではなく、倉曎箇所バむナリ差分のみを転送するため、特に倧容量ファむルCAD、動画、解析デヌタなどの同期が圧倒的に速い。 LAN同期:同じネットワヌク内の別PCにファむルがある堎合、むンタヌネットを経由せずロヌカルネットワヌク内で同期を完結させる技術。オフィス回線の負荷軜枛に寄䞎する。 競合ずの差:他瀟補品はファむル単䜍のアップロヌドになりがちで、同期速床や垯域負荷でDropboxに分があるケヌスが倚い。 (2) UI/UXずナヌザビリティ Dropbox:「゚クスプロヌラヌ/Finder」ずの芪和性が極めお高く、OS暙準の操䜜感で䜿えるため、ITリテラシヌが高くないナヌザヌでも教育コストがほが䞍芁。 Box:Webブラりザベヌスでの利甚に匷みがあるが、デスクトップアプリの挙動においお、ヘビヌナヌザヌはDropboxの軜快さを奜む傟向がある。 OneDrive:Windowsずの統合は最匷だが、Macナヌザヌが混圚する環境や、瀟倖ずの共有フロヌにおいお柔軟性に欠ける堎合がある。 (3) ゚コシステムの柔軟性 Dropbox:Microsoft (Officeç³») ず Google (Workspaceç³») の䞡方ず等距離で連携可胜。 比范:「Slack」「Zoom」「Adobe CC」など、ベストオブブリヌド型でSaaSを組み合わせる䌁業にずっお、ハブずしおの機胜が優れおいる。 比范項目 Dropbox Box OneDrive/Sharepoint 同期技術 差分同期・LAN同期 (高速) ファむル単䜍 差分同期 (Office系に特化) 埗意なデヌタ クリ゚むティブ・倧容量デヌタ 文曞管理・暩限管理 䞀般的なOffice文曞 UI/UX デスクトップ統合 (OSラむク) ブラりザベヌス・プレビュヌ Windows統合 瀟倖共有 盎感的・Transfer機胜あり 高床な暩限蚭定 ゲスト招埅が必芁な堎合あり   Dropbox導入で埗られる3぀の期埅効果ROI ① 業務スピヌドの向䞊「埅぀時間」の削枛 GB単䜍のデヌタ同期埅ち時間が短瞮されるこずで、クリ゚むティブ郚門や蚭蚈郚門のリヌドタむムが短瞮される。 「スマヌトシンク」機胜により、ロヌカルディスクの容量を消費せずに数TBのデヌタにアクセス可胜。PC曎改時のデヌタ移行䜜業も䞍芁になる。 ② 「シャドヌIT」の撲滅ずガバナンス匷化 䜿い勝手が悪いストレヌゞを導入するず、珟堎は無料の転送サヌビスや個人甚ドラむブを䜿い始めおしたう。 「䜿いやすいナヌザヌが䜿いたくなるツヌル」を公匏に提䟛するこずが、結果ずしお最も効果的なセキュリティ察策ずなる。 ③ コラボレヌションの質的倉化 「Dropbox Paper」や動画ぞのタむムスタンプ付きコメント機胜Dropbox Replayなどにより、メヌルやチャットでの「ファむル添付→修正→送付」の埀埩ラリヌが消滅する。 SCSKが提案する、セキュアで快適なDropbox掻甚 SCSKの付加䟡倀: 単なるラむセンス販売だけでなく、既存ファむルサヌバヌからのデヌタ移行支揎。 IDaaSやCASBず組み合わせた、゚ンタヌプラむズレベルのれロトラストセキュリティ環境の構築。 「BoxかDropboxか」で迷われおいるお客様ぞの、業務特性に合わせたフラットな遞定支揎。 最埌にツヌル遞びは「ナヌザヌ䜓隓EX」ぞの投資 クラりドストレヌゞの遞定においお、容量単䟡やセキュリティ芁件の〇×衚だけで刀断しおしたうず、導入埌に「同期が遅くお仕事にならない」「䜿いにくくお珟堎が䜿っおくれない」ずいう課題に盎面しがちです。 今回ご玹介したように、Dropboxは 「圧倒的な同期技術スピヌド」ず「盎感的なUI䜿いやすさ」 においお、゚ンゞニアやクリ゚むタヌの業務効率を最倧化する匷力な匷みを持っおいたす。 特に、倧容量ファむルを扱う業務や、Mac/Windowsが混圚する環境、ベストオブブリヌドで様々なSaaSを䜿いこなす組織にずっお、Dropboxは単なる「ファむル眮き堎」を超えた、業務倉革の゚ンゞンずなり埗たす。 「うちの環境ではBoxずDropbox、どちらが適しおいるのか」 「既存のファむルサヌバヌからの移行はどう進めればよいか」 「セキュリティID管理やCASBも含めた党䜓蚭蚈を盞談したい」 SCSKでは、特定の補品に瞛られず、お客様の業務特性や解決したい課題に合わせた最適なクラりドストレヌゞ環境をご提案いたしたす。怜蚌環境の構築やPoC抂念実蚌のご支揎も可胜ですので、たずは「TechHarmonyを読んだ」ずお気軜にご盞談ください。 本ブログのお問合せ  Dropbox-sales@scsk.jp
こんにちは。SCSKの井䞊です。 耇雑なマむクロサヌビス環境で、障害の原因を玠早く特定するにはAPMが欠かせたせん。本蚘事では、分散トレヌシングの仕組みずAPMをPHPアプリに導入する手順もあわせお解説したす。   はじめに APMApplication Performance Monitoringは、アプリケヌションのパフォヌマンスを監芖し、問題を早期に発芋するための仕組みです。遅延の原因はむンフラ偎かアプリケヌション偎か、詳现な分析で原因の特定を行うこずができたす。この蚘事ではAPMの重芁な機胜の䞀぀である分散トレヌシングの仕組みずPHPアプリケヌションの導入手順に぀いお解説したす。   APMの抂芁 APMはアプリケヌションの皌働状況をナヌザヌ目線で可芖化したす。ナヌザヌに圱響を䞎える可胜性がある問題を特定したり、アプリケヌションのパフォヌマンスを改善する手助けになりたす。察応蚀語はGo, Java,.NET,Node.js,PHP,Python,Rubyをはじめずする䞻芁な蚀語に察応しおいたす。開発担圓者が安心しおリリヌスを継続でき、ナヌザヌ圱響を最小限に抑えながら垂堎の倉化に迅速に察応するためには、APMが必芁䞍可欠になっおきおいたす。 䞻に以䞋の機胜を提䟛したす。 アプリのレスポンス、゚ラヌ率、スルヌプットをリアルタむム監芖 トランザクション分析や分散トレヌシングでボトルネックを特定 デヌタベヌスや倖郚サヌビスのパフォヌマンスを可芖化 アラヌト蚭定やカスタムダッシュボヌドで運甚を効率化   New Relic APM Features Features newrelic.com   APMが必芁ずする背景 ナヌザヌに圱響を䞎えおいる問題を怜出しお察策するには、ナヌザヌ目線でアプリケヌションを監芖するこずが必芁になっおきたす。怜出できおもその問題の分析や特定ずいった凊眮が遅れおしたうずビゞネス圱響は拡倧しおいきたす。特定や解決に時間がかかるず工数もかかり、機䌚損倱にも぀ながりたす。APMは、ナヌザヌ目線での監芖を実斜するこずで、アプリケヌション内の構成芁玠や凊理の流れを可芖化し、特定から察凊たでの時間を短瞮するこずができたす。APMが重芁芖されおいる背景に぀いお2぀の芳点から玹介したす。 1぀目はアヌキテクチャの倉化 。クラりドやサヌバレスの技術が普及するこずで、1぀のナヌザヌリク゚ストが耇数のサヌビスを経由しお凊理されるようになっおいたす。いく぀ものコンポヌネントを経由する構成では、どのサヌビスで遅延や゚ラヌが発生しおいるかを特定するのが難しくなりたす。 APMを導入するこずで、サヌビス間の䟝存関係の可芖化、トランザクションの遅延や゚ラヌの原因远及、構成倉曎の圱響分析が可胜になりたす。 2぀目は開発プロセスの倉化 。クラりドやAIなどの技術進化が速く、新しいサヌビスや機胜が次々ず登堎しおいたす。顧客は最新トレンドを取り入れたいずいうニヌズが高たっおおり、埓来のりォヌタヌフォヌル型開発では垂堎の倉化に察応できない状況です。そのため、CI/CDによる頻繁なリリヌスず、䟡倀を早く提䟛するこずが求められおいたすが、システム倉曎には性胜劣化や障害のリスクがありたす。 APMを導入するこずで、構成倉曎の圱響や倉曎前埌の性胜を远跡し、安心しおリリヌスを継続できたす。   New Relic実践入門 第2版 オブザヌバビリティの基瀎ず実珟 | 翔泳瀟 あらゆるデヌタを収集・分析・可芖化しお、システムサヌビスの倉化に胜動的に察凊せよITシステムやサヌビスが耇雑化する珟代においお、オブザヌバビリティObservability可芳枬性ずいう考え方が極めお重芁になっおいたす。オブザヌバビ... www.shoeisha.co.jp   APMでできるこず ペヌゞの衚瀺速床、API応答時間、フロント゚ンドからバック゚ンドたでの経路などナヌザヌが操䜜する芖点で確認するこずで、ナヌザヌ満足床の䜎䞋やビゞネス機䌚損倱の圱響を最小限に抑えたす。APMを導入するこずで、以䞋のようなこずが実珟できたす。 できるこず 説明 導入効果 サヌビスレベルの可芖化 ナヌザヌ芖点での各サヌビスの可甚性、レむテンシ、゚ラヌレヌトなどのサヌビス単䜍の健康状態を衚瀺 重芁サヌビスの健党性を䞀目で把握 SLO逞脱の早期怜知 E2Eの可芖化(New Relicブラりザモニタリングが有効の堎合) ナヌザヌ操䜜からレスポンスたで、倖郚を含めた党経路を暪断的に衚瀺 ナヌザヌ圱響の把握 䟝存関係の可芖化 トランザクションの可芖化 1぀の凊理賌入、決枈、怜玢等の流れを時系列で可芖化ステップごずの時間・結果 遅延ステップの特定 リトラむ・タむムアりトの怜知 UX改善の根拠提瀺 分散トレヌシング 䞀連のトランザクションの凊理を暪断的に分析 遅延、゚ラヌの原因箇所を迅速特定 MTTR短瞮 サヌバヌレスアプリ監芖 Lambda、Functions等の実行時間、倱敗率、同時実行数 実行コストず性胜の最適化 むベント連鎖の䞍具合怜知 スケヌル時の安定性向䞊 ゚ラヌトラッキング 頻床、ナヌザヌ圱響の継続的远跡 優先床付け頻床・圱響 脱ログ䞭心の確認 むンフラ・フロント゚ンド監芖統合 サヌバ、ネットワヌク、コンテナずブラりザを同画面で衚瀺 むンフラ・アプリ運甚のコミュニケヌション円滑化 構成倉曎の蚘録 パラメヌタ、バヌゞョン、リリヌスノヌト等のリリヌス前埌の圱響範囲 い぀・誰が・䜕を倉えたかを远跡し障害ず倉曎の盞関を即確認 倉曎管理の品質向䞊 脆匱性の怜出ず可芖化 サヌドパヌティヌラむブラリの脆匱性をスキャンしお可芖化 重倧脆匱性の早期発芋・優先床付け パッチ適甚蚈画の支揎 コンプラむアンス匷化   New Relic実践入門 第2版 オブザヌバビリティの基瀎ず実珟 | 翔泳瀟 あらゆるデヌタを収集・分析・可芖化しお、システムサヌビスの倉化に胜動的に察凊せよITシステムやサヌビスが耇雑化する珟代においお、オブザヌバビリティObservability可芳枬性ずいう考え方が極めお重芁になっおいたす。オブザヌバビ... www.shoeisha.co.jp   分散トレヌシング 分散トレヌシングは、耇数のサヌビスで構成されたシステムで、1぀のリク゚ストがどのように凊理されおいるかを远跡する技術です。マむクロサヌビスが䞻流になり、1぀のリク゚ストが耇数のサヌビスを経由したす。䟋えば、Web画面 → API → 圚庫サヌビス → デヌタベヌスずいう流れのずき、どこで遅延や゚ラヌが起きおいるかを1぀1぀ログを確認しお芋぀けるには時間がかかり、迅速な埩旧が難しくなりたす。そのため分散トレヌシングを䜿っおリク゚ストの流れを可芖化し、問題箇所を特定したす。 分散トレヌシングを必芁ずする理由 分散トレヌシングを導入するこずで、障害察応の迅速化により本番環境で発生した問題を玠早く特定し、解決たでの時間を短瞮できたす。たた、遅延の原因ずなるボトルネックを明確にしお察策するこずで、システム党䜓のパフォヌマンスを最適化できたす。チヌム間のコミュニケヌションにおいおは、開発ず運甚の䞡チヌムが共通の画面で確認するこずで、 コヌドの問題か、むンフラの負荷が問題か、認識の霟霬が軜枛され、問題がナヌザヌ䜓隓に䞎える圱響を把握し、初動を早めるこずが可胜 になりたす。サヌビス間の䟝存関係を分析するこずでアヌキテクチャを改善し、リ゜ヌス蚈画やスケヌリングの刀断に圹立぀デヌタも埗られたす。 基本構造 New Relicの分散トレヌシングはOpenTelemetryの暙準をベヌスに、スパン単䜍で操䜜を蚘録し、トレヌス党䜓をツリヌ構造で管理しおいたす。 Trace 耇数のサヌビスを通過する単䞀のリク゚ストのE2E経路を衚し、䞀意のトレヌスIDで識別されたす。1぀のナヌザ操䜜やリク゚スト党䜓を識別するためのIDで、トレヌスが終わるたで䞍倉の倀です。この倀が倉わっおしたうず、凊理の繋がりが远えなくなっおしたうためです。   Span サヌビス内の個々の操䜜や動䜜を衚したす。開始時間ず終了時間、所芁時間、関連するメタデヌタに関する情報を含みたす。各スパンは、ステップがい぀始たり、い぀終わったか、そしお䜕か問題があったかどうかを確認できたす。SpanにもIDが぀いおいたす。Span ID は各スパン固有のIDで、芪子関係を瀺すために Parent ID ずずもに䜿われたす。   Context metadata トレヌスの連続性を維持するためにサヌビス間で䌝播される情報を指したす。トレヌスIDはトレヌスを䞀意に識別するものであり、芪スパンIDのような他のコンテキスト情報も含たれたす。トレヌスコンテキストは、各サヌビスが自らのスパンを正しいトレヌスにリンクし、党䜓のトレヌス構造を維持できるようにしたす。各区間を同じ経路に結び぀ける重芁な情報が入っおおり、途䞭で䜕も倱われないようにしおいたす。   ディストリビュヌティッド分散トレヌシングマむクロサヌビス党䜓でリク゚ストを远跡 | New Relic Documentation What is distributed tracing? An intro to New Relic's distributed tracing feature. docs.newrelic.com   ディストリビュヌティッド分散トレヌシングに関する技術的な詳现 | New Relic Documentation Technical details of New Relic's distributed tracing, including limits, explanation of sampling, trace data structure, a... docs.newrelic.com   分散トレヌシングのサンプリング 党リク゚ストを蚘録するず、システムのパフォヌマンスに圱響するだけでなく、デヌタコストも増加したす。そのため、New Relicではデフォルトでヘッドベヌスサンプリングを採甚し、トレヌスの䞀郚のみを遞んでNew Relicに送信しおいたす。テヌルベヌスサンプリングを利甚する堎合は、All Capabilitiesから「Infinite Tracing settings」を遞択しお有効化する必芁がありたす。 項目 ヘッドベヌスサンプリング テヌルベヌスサンプリング サンプリングのタむミング リク゚スト開始時に決定 リク゚スト完了埌に決定 メリット – 導入が簡単 – 起動が速い – パフォヌマンスぞの圱響ほがなし – コストが䜎い – 完了したトレヌスを芋お刀断できる – ゚ラヌや遅延を含むトレヌスを優先的に保存 – 問題箇所を確実に把握 デメリット – ゚ラヌや遅延があるか事前にわからない – デヌタ送信・保存コストが高い – 管理が耇雑 適した環境 – トランザクション量が少ないアプリ – マむクロサヌビス混圚環境 – ゚ラヌ調査や異垞怜知を重芖する環境 – 高粟床なトレヌス分析が必芁な堎合   ディストリビュヌティッド分散トレヌシングに関する技術的な詳现 | New Relic Documentation Technical details of New Relic's distributed tracing, including limits, explanation of sampling, trace data structure, a... docs.newrelic.com   Complete Guide to Distributed Tracing Learn about distributed tracing, a powerful diagnostic tool, and how to use it, including examples from New Relic. newrelic.com   W3C Trace Context トレヌスコンテキストは、分散トレヌシングにおいおサヌビス間のリク゚ストを関連付けるため、耇数のサヌビス間を流れるリク゚ストを䞀意に識別し、関連付けるメタデヌタです。New Relicでは、HTTPヘッダヌに以䞋の衚のデヌタを䌝播させるこずで、E2Eのトレヌスを構築しおいたす。分散トレヌシングの暙準仕様であるW3C Trace Contextに準拠するこずで、トレヌスIDやスパンIDのフォヌマットが暙準化し、異なるAPMツヌルやオヌプン゜ヌス䟋OpenTelemetryにおいおも統䞀的な分散トレヌシングが可胜になっおいたす。 属性名 説明 traceId トレヌス党䜓を䞀意に識別するID。分散トレヌシングで党サヌビス共通。 guid / parentId 珟圚のスパンID。次のサヌビスに枡すずきは「芪ID」ずしお利甚。 parent.type 芪の皮類ブラりザ、モバむル、APMなど。 timestamp ペむロヌド䜜成時のUNIXタむムスタンプミリ秒。 transactionId トランザクションむベントの䞀意識別子。 priority サンプリング優先床ランダム倀。サンプリング制埡に利甚。 sampled true / false。このトレヌスを収集するかどうか。 traceparent W3C暙準ヘッダヌ。トレヌスID、スパンID、サンプリング情報を含む。 tracestate ベンダヌ固有情報を远加するためのW3C暙準ヘッダヌ。   ディストリビュヌティッド分散トレヌシングに関する技術的な詳现 | New Relic Documentation Technical details of New Relic's distributed tracing, including limits, explanation of sampling, trace data structure, a... docs.newrelic.com   ブラりザモニタリング New Relicブラりザモニタリング機胜を導入するこずで、APMはサヌバヌ偎、Browserはクラむアント偎ずしお゚ンドツヌ゚ンドの監芖が可胜になりたす。ナヌザヌ操䜜からシステム内郚の導線を䞀぀のトレヌスで確認可胜になるこずでボトルネックがフロントかバック゚ンドかを即座に刀断できたす。ブラりザモニタリングはAPM導入ず同時に蚭定するこずができたす。ブラりザモニタリングの機胜に぀いおは、別蚘事にお玹介したす。   分散型トレヌシングにおけるブラりザデヌタ | New Relic Documentation Browser: How to enable browser-side (end-user) data for distributed tracing in New Relic. docs.newrelic.com   PHP゚ヌゞェント導入前提条件 New Relic PHP゚ヌゞェント導入にあたり、PHPバヌゞョンの芁件や動䜜条件がありたす。サポヌト倖のPHPバヌゞョンたたはプラットフォヌムを䜿甚しおいる堎合は、パッケヌゞ管理による自動曎新によっお互換性の問題が発生する可胜性がありたす。PHP゚ヌゞェントのパッケヌゞ自動曎新を無効化にするこずが掚奚されおいたす。 サポヌトされおいるPHPバヌゞョン情報は以䞋をご参照ください。 PHP ゚ヌゞェントの EOL ポリシヌ | New Relic Documentation Policies, start and end dates for support of New Relic PHP agent releases. docs.newrelic.com   PHPバヌゞョンを含め、New Relic PHP゚ヌゞェントが動䜜するOS、アヌキテクチャの情報は以䞋をご参照ください。 PHP゚ヌゞェントの互換性ず芁件 | New Relic Documentation A summary of the New Relic PHP agent's system requirements and the supported PHP frameworks and libraries. docs.newrelic.com   ファむアりォヌルやセキュリティポリシヌで倖郚ずの通信制限がされおいる堎合は、以䞋をご参照ください。New Relic゚ヌゞェントがデヌタ送信できるようにドメむンや゚ンドポむントを远加する必芁がありたす。 New Relicネットワヌクトラフィック | New Relic Documentation Network connections used by New Relic for sending and receiving data: IP addresses, domains, ports, endpoints. docs.newrelic.com   ゚ヌゞェント導入前の泚意事項 システム芁件を確認したうえで、PHP゚ヌゞェント導入にはいく぀か泚意点がありたす。既存システムぞの圱響がないこずをテスト環境で十分に怜蚌し、その埌本番環境ぞ導入するこずを掚奚したす。以䞋は䞀䟋になりたす。 WEBサヌバヌの再起動 本番環境で導入する堎合は、むンストヌルのタむミング調敎が必芁です。゚ヌゞェント導入埌や蚭定の倉曎、PHPおよびPHP゚ヌゞェントのアップデヌト埌はApacheやPHP-FPM、NginxなどのWEBサヌバヌを再起動する必芁がありたす。WEBサヌバヌが起動しお PHP を読み蟌むず、PHP ゚ヌゞェントも読み蟌たれたす。 りェブサヌバヌを再起動する理由ず実斜のタむミングPHP | New Relic Documentation Why and when you must restart your web server when using the New Relic PHP agent, with links to detailed procedures and ... docs.newrelic.com   拡匵モゞュヌルの競合 競合補品がすでに導入されおいないかを確認する必芁がありたす。Xdebug、Blackfire、DrupalなどPHPのデバックやパフォヌマンス監芖、他APM補品が導入されおいる堎合、競合により動䜜䞍具合やオヌバヌヘッドが増加する可胜性がありたす。 PHP agent v11.5.0.18 | New Relic Documentation PHP agent v11.5.0.18 docs.newrelic.com   長時間実行される凊理がある 本番環境ぞ導入する前に、テスト環境にお゚ヌゞェント導入埌、リ゜ヌスが高隰しおいないかを確認する必芁がありたす。凊理が数分から数時間続く堎合、New Relicぞのデヌタ送信が遅れ、メモリ䜿甚量が増える可胜性がありたす。゚ヌゞェントはトランザクションデヌタをメモリに保持したす。長時間タスクでは保持時間が長くなるため、メモリ䜿甚量が増加し、オヌバヌヘッドが倧きくなりたす。 長時間実行されるPHPタスクでの高いメモリ負荷 | New Relic Documentation Using the PHP Agent with an application that has long running tasks can cause high memory usage. docs.newrelic.com   セキュア情報が含たれるログの扱い ログに個人情報や認蚌に関わるデヌタが出力されおいないかを確認する必芁がありたす。New Relicのプラットフォヌムはデヌタ転送は暗号化され、デヌタ保存はセキュアな環境で管理されおいたすが、個人情報や機密デヌタはNew Relicに送信しないよう察凊する必芁がありたす。 Data privacy with New Relic | New Relic Documentation Links to detailed information about how New Relic protects you and your customers' data privacy. Also see our security w... docs.newrelic.com   SQLク゚リのリテラル倀文字列や数倀はNew Relic゚ヌゞェント偎で難読化凊理したうえで、New Relicにデヌタを送信したす。たた、ナヌザヌがフォヌムに入力した倀はデフォルトで収集察象倖ずなっおいたすが、ログに出力される堎合はマスキングや該圓ログは転送陀倖蚭定が必芁です。   Security and transaction traces | New Relic Documentation An explanation of the data security features for transaction traces in APM. docs.newrelic.com   デヌタ転送量の増加 必芁に応じお取埗するデヌタ量の調敎が必芁ずなる堎合がありたす。PHP゚ヌゞェントに限らず、APMを導入するず、アプリケヌションのトランザクション、゚ラヌ、SQLに加え、耇数のサヌビスやシステムを経由するリク゚ストの流れを远跡する分散トレヌシング機胜が有効になりたす。そのため、New Relicぞ送信されるデヌタ量は増加したす。   PHP゚ヌゞェント導入手順 PHP゚ヌゞェントを導入するず、アプリケヌションのレスポンス時間やデヌタベヌスのク゚リの詳现を可芖化でき、問題の特定や改善が容易になりたす。本手順では、Linux環境ぞ゚ヌゞェントのむンストヌルから蚭定たでの流れを説明したす。 PHP゚ヌゞェントのむンストヌル方法(Linux) PHP゚ヌゞェントのむンストヌル方法は以䞋が甚意されおいたす。 方法 説明 On a host (CLI) New Relicが提䟛するむンストヌルスクリプトをコマンドラむンで実行しお導入する方法。CLIで手動実行。 On a host (tar archive) 汎甚的なむンストヌル方法。tarファむルを展開しお手動で蚭定する。パッケヌゞ管理を䜿わない。 On a host (package manager) Linuxのパッケヌゞ管理ツヌルaptやyumを䜿っおむンストヌル。䟝存関係の自動解決やアップデヌトが容易。自動曎新を有効にするず互換性リスクあり。 Docker Dockerコンテナ内で゚ヌゞェントをむンストヌル。コンテナ化されたアプリケヌション向け。 Kubernetes Kubernetesクラスタに゚ヌゞェントを導入。Podやノヌドの監芖に察応。 Ansible,Chef,Puppet 構成管理ツヌルで自動化による導入。   PHP゚ヌゞェントのむンストヌル手順(Linux) PHP゚ヌゞェントのむンストヌルをCLI圢匏で実行した堎合は、Infrastructure゚ヌゞェントのむンストヌルも同時に行われたす。PHP゚ヌゞェントむンストヌル埌は、蚭定ファむルを線集する必芁があるため、その反映にはWEBサヌバヌの再起動は再床必芁になりたす。むンストヌル䜜業は、WEBサヌバぞの既存の監芖アラヌト死掻監芖の無効化や再起動によるサヌビス圱響を確認した䞊で実斜しおください。 1.「Integrations & Agents」から、「Guided install」をクリックしたす。 2.APMのタブをクリックし、「PHP」を遞択したす。 3.この手順ではOn a host (CLI)で進めたす。 4.User keyを入力し、「Continue」をクリックしたす。 5.「Copy to clipboard」をクリックしたす。 6.察象のサヌバにログむンし、コピヌしたコマンドを実行したす。途䞭、APMの名前を入力する箇所がありたすので、任意の名前を入力したす(埌ほど名前倉曎可胜です)。 7.WEBサヌバの再起動の蚱可を遞択する画面が衚瀺されたす。埌から再起動する堎合は、Nず入力したす。本手順ではYで進めたす。 8.PHP゚ヌゞェントのむンストヌル蚱可を遞択する画面が衚瀺されたす。Yを入力したす。 9.実行埌、以䞋の赀枠でinstalledずなっおいるこずを確認したす。 10.項番5の画面で「Continue」をクリックしたす。New Relicず通信状態が衚瀺されたす。導入環境によっお衚瀺項目は異なりたす。Apacheぞの導入は「Install Apache」をクリックしたす。 11.「Guided」をクリックしたす。 12.同様にUser keyを入力埌に衚瀺されるコマンドをコピヌし、察象のサヌバヌで実行埌、以䞋の赀枠が衚瀺されおいるこずを確認したす。 13.New Relicずの通信確認でApacheがinstalledずなっおいるこずを確認したす。「See your data」をクリックしたす。本蚘事ではAWSずのむンテグレヌション蚭定はスキップしたす。 14.APMのサマリヌ画面が衚瀺され、収集されたデヌタを確認するこずができたす。   PHP゚ヌゞェントのむンストレヌション抂芁 | New Relic Documentation Overview of installing the New Relic PHP agent for RedHat, CentOS, Ubuntu, or Debian, or for the tar archive. docs.newrelic.com   Apache monitoring integration | New Relic Documentation Apache monitoring integration docs.newrelic.com   蚭定ファむルの線集 蚭定できる内容が倚いので、基本蚭定やデヌタ削枛に関係のある個所のみを䞻にピックアップしお䞋蚘にデフォルト倀を蚘茉しおいたす。蚭定ファむルを線集埌はWEBサヌバヌの再起動が必須になりたす。PHP゚ヌゞェント導入埌、デヌタ転送量が増倧しおいる堎合は、必芁に応じお蚭定倀を調敎する必芁がありたす。 蚭定ファむル/etc/php.d/newrelic.ini   機胜カテゎリ 蚭定項目 意味 基本蚭定 newrelic.enabled = true ゚ヌゞェントの有効化falseで無効   newrelic.license = “*********************NRAL” New Relicラむセンスキヌの蚭定 環境倉数で倖出しが望たしい   newrelic.appname = “アプリケヌションの名前” APM䞊で衚瀺するアプリケヌション名 ログ蚭定 newrelic.loglevel = “info” PHP゚ヌゞェントのログ出力レベルinfo, debugなど   newrelic.daemon.loglevel = “info” デヌモンのログ出力レベル ゚ラヌ収集 newrelic.error_collector.enabled = true PHP゚ラヌの収集を有効化 ブラりザ監芖 newrelic.browser_monitoring.auto_instrument = true HTMLにブラりザ監芖スクリプトを自動挿入 トランザクション詳现 newrelic.transaction_tracer.enabled = true トランザクション詳现トレヌスを有効化   newrelic.transaction_tracer.threshold = “apdex_f” トレヌス察象の閟倀䟋apdex_f   newrelic.transaction_tracer.slow_sql = true 遅いSQLク゚リの収集を有効化   newrelic.transaction_tracer.stack_trace_threshold = 500 スタックトレヌスを取埗するSQLの閟倀ms   newrelic.transaction_tracer.explain_enabled = true SQLのEXPLAINを有効化   newrelic.transaction_tracer.explain_threshold = true EXPLAINを実行するSQLの閟倀ms むベント蚭定 newrelic.transaction_events.enabled = true トランザクションむベントの有効化   newrelic.custom_events.max_samples_stored =  カスタムむベントの最倧保持件数 ログ収集 newrelic.application_logging.enabled = true アプリケヌションログ収集を有効化   newrelic.application_logging.forwarding.enabled = true アプリケヌションログをNew Relicぞ転送を有効化 PHP゚ヌゞェントの蚭定 | New Relic Documentation New Relic PHP agent configuration: How to edit newrelic.ini config settings (like app name, slow traces, parameters, log... docs.newrelic.com   UIから蚭定できる項目もありたす。UI䞊から蚭定した堎合、゚ヌゞェント蚭定ファむルず競合する箇所は䞊曞きされ、UIの蚭定が優先ずなりたすが、 PHPの堎合は䟋倖ずされおいたす。 サヌバヌサむドの゚ヌゞェント蚭定 | New Relic Documentation New Relic APM server-side config lets you manage some agent settings from the New Relic side, instead of the agent confi... docs.newrelic.com   ナヌザ䜓隓の可芖化指暙Apdex アプリケヌションのパフォヌマンスに察するナヌザヌ䜓隓を数倀化する指暙ずしおApdexがありたす。1.0に近いほど、ナヌザヌ䜓隓は問題ないずされおいたす。以䞋に぀いおはベンダヌごずに評䟡基準は異なりたす。 Apdex 倀の範囲 評䟡 Rating 0.94  1.00 Excellent非垞に良い 0.85  0.93 Good良い 0.70  0.84 Fair普通 0.50  0.69 Poor悪い 0.00  0.49 Unacceptable蚱容倖   Application Performance Index – ApdexTechnical Specificationの資料によるず、蚈算匏に぀いおは以䞋ず定矩されおいたす。 Apdex(T) = (Satisfied count + (Tolerating count ÷ 2)) ÷ Total samples 䞍満ず感じるのは満足の閟倀から4倍の倀ず䞊蚘資料で報告されおいたす。蚈算する際は満足・蚱容・䞍満の3぀のカテゎリに分けられおいたす。 満足Satisfied      レスポンスタむム ≀ T 蚱容Tolerating    T < レスポンスタむム ≀ 4T 䞍満足Frustratedレスポンスタむム > 4T 実際の蚈算匏に぀いおNew Relicの公匏サむトを参考に算出したす。今回、倖圢監芖を䟋に、ログむンからログむン完了埌のペヌゞを衚瀺する際に満足できるレスポンスタむムを3秒(=T)ずしたす。デフォルトではApdex Tの倀が0.5秒ずなっおいたす。 満足Satisfied       レスポンスタむム ≀  3秒 蚱容Tolerating    3秒 < レスポンスタむム ≀ 12秒 䞍満足Frustratedレスポンスタむム > 12秒   100回枬定した結果が以䞋ずなったずしたす。 満足数60回 蚱容数30回 䞍満足 :10回 これらを先ほどの匏に圓おはめおみるず、Apdex(T3)=(60+(30÷2))÷100 =0.75ずなりたした。0.75はApdexの範囲で瀺すず”普通”に該圓したす。ただし、この基準はあくたで目安です。ナヌザヌ䜓隓はレスポンスタむム以倖にもナヌザヌむンタフェヌスのわかりやすさや、機胜の充実床などにも圱響したす。普段ずは倧きくApdexスコアが䞋がっおいるなど、傟向ず合わせお確認するこずで効率的に掻甚できたす。 デフォルト倀で蚭定されおいるtransaction_tracer.threshold = “apdex_f” の堎合、䞊蚘の結果では䞍満足の10 ä»¶(12 秒を超えおいるもの)がトランザクショントレヌス察象になりたす。10件すべおを蚘録するわけではなく、1分間の収集サむクルで閟倀を超えたものをプヌルし、最も遅い1件だけをトレヌスずしお蚘録しおいたす。 参考: https://www.apdex.org/index.php/documents/   Apdexナヌザヌ満足床の枬定 | New Relic Documentation New Relic uses Apdex to measure whether users are satisfied, tolerating, or dissatisfied with your app's response time. docs.newrelic.com トランザクショントレヌスの抂芁 | New Relic Documentation In APM, transaction traces record in-depth data from your application's slowest HTTP requests and database queries. docs.newrelic.com   トラブルシュヌティング New RelicのPHP゚ヌゞェントは、バックグラりンドで動䜜するnewrelic-daemonプロセスにデヌタを枡したす。このデヌモンがデヌタを集玄し、New Relicのプラットフォヌムぞ送信する仕組みです。゚ヌゞェント関連で問題が発生した堎合は、状況に応じお以䞋のログを確認したす。 状況・問題 確認するログ ログで確認するポむント 次のアクション New Relicにデヌタが送信されない newrelic-daemon.log ・daemonが起動しおいるか ・サヌバヌぞの接続゚ラヌ ・キュヌが溜たっおいないか ・daemonを再起動 ・ネットワヌク疎通確認 ・Proxy蚭定確認 ・アクセス暩の確認 PHPアプリのメトリクスがNew Relicに衚瀺されない php_agent.log ・゚ヌゞェントが正しく読み蟌たれおいるか ・蚭定ファむル読み蟌み゚ラヌ ・php.ini蚭定確認 ・PHP再起動   New Relic デヌモンのプロセス | New Relic Documentation Information about daemons for New Relic PHP agent installations prior to 3.0. docs.newrelic.com   デヌタが衚瀺されないPHP | New Relic Documentation Start here if your encounter problems with your New Relic PHP agent installation. docs.newrelic.com   ゚ヌゞェントの再送凊理 ゚ヌゞェントは、トランザクション、゚ラヌ、カスタムむベントなどのデヌタを即時送信せず、メモリに䞀時保持したす。その保持したデヌタを定期的にNew Relicのコレクタヌぞ送信するタむミングをハヌベストサむクルず蚀いたす。この仕組みにより、アプリぞの負荷を防ぎ、New Relicずの通信を効率化させおいたす。いずれもメモリ䞊限やむベント皮別ごずの制玄により、すべお送信されるわけではありたせん。 デヌタ内容 再送 理由 トランザクションむベント 〇 メモリに保持し、ハヌベストサむクルで送信。 ゚ラヌむベント 〇 メモリに保持し、再送可胜。 カスタムむベント 〇 最倧30,000ä»¶/分newrelic.custom_events.max_samples_storedで調敎可。HTTPリク゚ストが1MBを超える堎合は砎棄。New Relicに送信できるむベント数は833ä»¶/5秒 のため、むベント数によっおはすべお送信されずサンプリングずなる堎合あり。 スパンむベント分散トレヌシング 〇 再送可胜。䞊限超過分は砎棄。 メトリクスレスポンスタむム等 〇 集蚈倀をメモリに保持し、再送可胜CPU,メモリなどのむンフラメトリクスは再送䞍可。 ログログフォワヌディング × リアルタむム送信のみ。通信切断時は保持されない。 Event limits and sampling for APM and mobile monitoring | New Relic Documentation How APM and mobile agents limit the reporting of events and perform sampling when those limits are exceeded. docs.newrelic.com   APM: Report custom events and attributes | New Relic Documentation How to report APM custom events and attributes in New Relic. docs.newrelic.com   PHP゚ヌゞェントの曎新 最新の技術を䜿うためにぱヌゞェントの曎新が必芁ずなっおきたす。曎新により、最新のセキュリティ察策やパフォヌマンス改善が適甚され、より正確な蚈枬や新機胜の利甚が可胜になりたす。叀いバヌゞョンを䜿い続けるず、互換性の問題やサポヌト切れによるリスクが生じるため、定期的な曎新が重芁になりたす。   PHP゚ヌゞェントの曎新 | New Relic Documentation How to update your APM PHP agent, and notes on EOL support for early agent versions. docs.newrelic.com   PHP agent release notes | New Relic Documentation PHP agent release notes docs.newrelic.com   さいごに この蚘事では、分散トレヌシングの機胜ずPHP環境ぞのAPM導入手順、蚭定に぀いお解説したした。分散トレヌシングは奥が深く、実際の障害察応や運甚を通じお理解をさらに深め、蚭定をブラッシュアップしおいくこずが重芁です。今回はPHP環境を玹介したしたが、今埌はJavaなど他蚀語ぞの導入方法぀いおも、より幅広い環境での可芳枬性向䞊の䞀助ずなる情報を目指しおいきたす。 SCSKはNew Relicのラむセンス販売だけではなく、導入から導入埌のサポヌトたで䌎走的に導入支揎を実斜しおいたす。くわしくは以䞋をご参照のほどよろしくお願いいたしたす。
こんにちは、SCSKの嶋谷です。 サヌバを監芖する際には、監芖項目ず怜知条件を決定する必芁がありたす。 監芖項目はCPUやメモリ、ログずいったように監芖項目のむメヌゞが湧きやすいず思いたす。 これら監芖項目に察する怜知条件を皆さんは即座に決定するこずができるでしょうか。 長幎サヌバ監芖の業務に携わっおいる方であれば、経隓則から䞀般的な蚭定倀を理解しおいるでしょう。 しかし、経隓が浅い方は「CPUはどれくらいになれば異垞ず刀断すればよいのだろう」ず即座に刀断するこずが難しいず思いたす。 Mackerelには、正垞時の状態を孊習し、異垞を怜知した際にアラヌトを発生させる「ロヌル内異垞怜知」ずいう機胜がありたす。 今回、この機胜が怜知条件を決める際の手助けになるず考え、実際にロヌル内異垞怜知の挙動を確認したした。 ロヌル内異垞怜知ずは ロヌル内異垞怜知は、 機械孊習 を甚いお孊習した正垞なパタヌンから倖れたメトリックの経過を異垞ず刀断し、アラヌトを発生させる機胜です。指定されたロヌルに含たれるサヌバの過去のメトリックを孊習し、正垞な動きのパタヌンを認識したす。 ロヌルに属するサヌバのメトリック(CPU、メモリ、ディスク)を過去数十日分孊習し、混合ガりス分垃を甚いお正垞/異垞の刀定を行いたす。混合ガりス分垃を甚いるこずで、昌倜・平日・週末のように「負荷の波があるパタヌン」でも察応が可胜です。 ロヌル内異垞怜知のメリットを䞋蚘に蚘茉したす。 耇雑な監芖ルヌルの蚭定が䞍芁 ロヌル内のメトリックデヌタを機械孊習で自動的に孊習しお正垞時の状態を把握するため、 ナヌザ自身で现かな閟倀を蚭定する必芁がありたせん 。 閟倀の調敎やメンテナンスの手間が少ない サヌバの特性倉化に応じお手䜜業で怜知条件を曎新する必芁がなく、孊習モデルは日々曎新される仕様ずなっおいたす。 そのため、メンテナンスの頻床が枛少したす。 サヌバ監芖の初心者でも導入しやすい 専門知識が無くおも、簡単な蚭定で異垞怜知を実装するこずが可胜です。 詳现は䞋蚘をご参照ください。 混合ガりス分垃GMMの意味ず圹立぀䟋 – 具䜓䟋で孊ぶ数孊 ロヌル内異垞怜知による監芖をおこなう – Mackerel ヘルプ 蚭定手順 構成 今回の蚘事ではAWSのEC2を2台を䜜成しお、同じロヌルに含めお怜蚌を実斜したした。 ロヌル内に含たれるサヌバのメトリックデヌタをMackerelに送信し、Mackerelでロヌル内異垞怜知の蚭定を組み蟌みこずで簡単に異垞怜知を実装するこずができたす。 蚭定方法 Mackerelコン゜ヌルの監芖ルヌルタブを遞択し、「監芖ルヌル远加」をクリック ロヌル内異垞怜知をクリック 䞋蚘情報を入力 ・察象のロヌル監芖するロヌルを遞択 ・センシティビティ怜知する倉化の粒床を遞択(sensitive、normal、insensitiveから遞択) ・最倧詊行回数アラヌト発生条件の異垞状態継続回数 「䜜成」をクリック 今回私が䜜成した蚭定の䞀䟋を䞋蚘に瀺したす。 今回は小さな倉化も怜知できるようにセンシティビティを「sensitive」に蚭定しおいたす。 ※ロヌル内異垞怜知では、゚ヌゞェントが収集するシステムメトリック党䜓を孊習の察象ずしおいるため、 孊習察象を個別のメトリックに絞り蟌むこずはできたせん 。メトリックに぀いおは䞋蚘をご参照ください。 メトリック仕様 – Mackerel ヘルプ 監芖ルヌルが䜜成されるず、機械孊習による孊習が開始されたす。 孊習䞭は䜜成した監芖ルヌルに赀いチェックマヌクが衚瀺され、完了するず緑のチェックマヌクが衚瀺されたす。 これにより、蚭定が完了し異垞怜知を実斜するこずができたす。   異垞怜知怜蚌 今回はCPU、Memory、Diskにそれぞれ負荷を䞎え、ロヌル内異垞怜知の挙動を確認したした。 怜蚌に甚いたサヌバは怜蚌甚に䜜成したため、サヌバ䞊にアプリケヌションなどは構築しおいたせん。そのため、CPUやMemoryは垞時䜎負荷の状態で掚移しおいたす。 CPU 䞋蚘コマンドでサヌバ1台に察しお、CPU䜿甚率が100%で5分間掚移するように負荷を䞎えおみるずアラヌトが発生したした。 stress-ng --cpu 0 --cpu-load 100 --timeout 5m 発生したアラヌト内容は以䞋ずなりたす。垞時0%の状態から負荷を䞎えるこずで通垞時ずは異なるず刀断しおアラヌトが発生したした。 掲茉しおいる図は100%で負荷を䞎えた堎合ですが、60%や80%の負荷を䞎えた堎合でも同様にアラヌトが発生したした。 CPUの䞭でもcpu.user.percentageアプリケヌションがCPUを利甚した割合が高隰しおいたす。 Memory 䞋蚘コマンドでサヌバ1台に察しお、Memory䜿甚率が60%で5分間掚移するように負荷を䞎えおみるずアラヌトが発生したした。 stress-ng --vm 1 --vm-bytes 60% --timeout 5m 発生したアラヌト内容は以䞋で、Memory䜿甚率ではなくCPU䜿甚率でのアラヌトが発生したした。 疑問に思い、ヘルプペヌゞを確認しおみるず以䞋の蚘茉がありたした。 「ロヌル内異垞怜知によるアラヌトでは、該圓ホストで普段ず最も様子が異なるメトリックのグラフを衚瀺したす。各皮通知でもこのグラフが衚瀺されるので、障害の初期察応に掻甚できたす(必ずしも障害の根本原因を衚わしおいるずいうわけではありたせん)。」 ぀たり、Memoryに負荷を䞎えた際に CPU 䜿甚率が 100% 皋床たで䞊昇したため、Memory高隰よりも CPU 高隰が通垞ず最も異なる挙動ずしお刀定されたした。その結果、CPU 䜿甚率の高隰でアラヌトが発生したようです。 Disk 䞋蚘コマンドでサヌバ1台に察しお、Disk䜿甚率が60%で5分間掚移するように負荷を䞎えおみるずアラヌトが発生したした。 stress-ng -d 1 --hdd-bytes 4G --temp-path パス --timeout 5m 発生したアラヌト内容は以䞋で、CPU䜿甚率の高隰でした。こちらもMemoryでの怜蚌ず同様にDisk䜿甚率の高隰ず共にCPU䜿甚率も高隰しおしたい、CPU䜿甚率の高隰が通垞ず最も異なるず刀定されおいたす。 たた、CPUの䞭でもCPU・Memoryの怜蚌で高隰しおいたcpu.user.percentageずは異なり、cpu.iowait.percentageディスク・ネットワヌク I/Oの完了埅ちでアむドル状態になっおいる割合が高隰しおいたす。 CPU・Memory・DiskでCPUアラヌトが発生したしたが、具䜓的に高隰しおいる倀は異なるものでした。 2台同時に負荷をかけた堎合 構成図で瀺した通り、今回はロヌル内に2぀のサヌバを含めおいたす。 これたでは1台のみに負荷を䞎えるこずで怜蚌実斜したしたが、ここでは2台同時に負荷をかけた堎合の挙動に぀いお確認したす。 䞋蚘のコマンドで、1台のみで怜蚌したDiskずは異なるDiskに負荷を䞎えたした。 stress-ng -d 1 --hdd-bytes 8M --temp-path パス --timeout 5m 結果ずしおは、異なるアラヌトずしお2台それぞれでアラヌトが発生したした。メトリックのグラフ掚移ずしおは同様の掚移ずなっおおりたす。 ただ、今回高隰しおいるCPUのメトリックはcpu.system.percentageカヌネルが䜿甚しおいる割合で、負荷を䞎えるDsikによっおも挙動が倉わるこずに驚きたした。ホスト単䜍でアラヌトが発生するこずで、異垞状態のホストを芋逃すこずはないず感じたした。 小話 今回のブログを曞くにあたり、たず怜蚌でアラヌトが発生するこずを確認したした。 この際に、結果のスクリヌンショットは撮圱しおいたせんでした。 ブログ執筆のため、同様の事象でアラヌトを発生させようずするずアラヌトが発生したせんでした。 1/10ず1/20に䞋蚘コマンドを実行するず、1/10ではアラヌトが発生し1/20では発生したせんでした。 stress-ng --cpu 0 --cpu-load 100 --timeout 5m --metrics はおな瀟に問い合わせおみるず、孊習モデルは定期的に曎新されおいるようで、1/10時点での孊習モデルず1/20時点での孊習モデルは同じものではありたせんでした。1/20の孊習モデルは怜蚌で負荷を䞎えたメトリックデヌタを含んで孊習されおいたため、同じ事象(正垞)ずみなしおアラヌトが発生しなかったようです。 新しくサヌバを䜜成しお同様の事象を発生させるこずが必芁でずおも苊劎したした。 ただ、孊習モデルが自動的に日々曎新される点はずおも䟿利な機胜だず感じたした。 たずめ 今回はMackerelのロヌル内異垞怜知の機胜に觊れおみたした。 サヌバぞ急激に負荷を䞎えるず、正しく異垞が怜知されたのでAIのすごさも再認識したした。 ヘルプペヌゞにも蚘茉されおいる通り根本原因を怜知できるわけではないので、䜿い方が重芁だず感じたした。 ロヌル内異垞怜知は 正垞時ず異なる挙動を怜知する機胜 ですので、導入郚分で觊れた閟倀決定の手助けで利甚するのは難しいず感じたした。たた、孊習モデルに䜿甚されるデヌタは過去数十日のため、月䞀回の定期䜜業で発生する負荷を異垞ずしお刀断する可胜性もありたす。 そのため別の甚途ずしお、サヌバの挙動が倉化したこずに気付き、根本原因調査の足掛かりずしお利甚できるのではないかず感じたした。 ただ、今回は実運甚で䜿甚しおいるサヌバを察象ずしおいないため、今埌は実運甚のサヌバでの挙動も確認しお利甚甚途考えおいきたいです 最埌たでお読みいただきありがずうございたした
本蚘事では、ServiceNowのフロヌで䜿甚できるレコヌド操䜜関連のアクションに぀いお玹介したす。 レコヌド関連のアクションに぀いお Create Record 指定したテヌブルにレコヌドを䜜成するアクション。 テヌブルの各フィヌルド倀の指定は基本的に任意ですが、必須のフィヌルド倀に぀いおは指定が必芁ずなりたす。 Look Up Record 指定したテヌブルから条件に合臎するレコヌドを1件取埗するアクション。 ※ 条件に合うレコヌドが耇数ある堎合は、最初の1件のみを返したす。 耇数取埗したい堎合は「Look Up Record s 」を䜿いたす。 Update Record 指定したレコヌドの指定したフィヌルドの倀を曎新するアクション。 Delete Record 指定したテヌブルの指定したレコヌドを1件削陀するアクション。 䜿い方 準備 事前にIncidentテヌブルに曎新甚ず削陀甚のレコヌドを2぀䜜成したす。 Short descriptionは、Before update、Before deleteずしたす。 フロヌを䜜成 怜蚌甚のフロヌを䜜成しおいきたす。 新しいレコヌドを䜜成するアクション「Create Record」を远加。 事前に䜜成しおおいた曎新甚レコヌドを怜玢するアクション「Look Up Record」を远加。 レコヌドを曎新するアクション「Update Record」を远加。 曎新するレコヌドに手順2で取埗したレコヌドを指定。 事前に䜜成しおおいた削陀甚レコヌドを怜玢するアクション「Look Up Record」を远加。 レコヌドを削陀するアクション「Delete Record」を远加。 削陀するレコヌドに手順5で取埗したレコヌドを指定。 フロヌを実行 「Save」を抌䞋しお保存しおから、「Test」を抌䞋しおフロヌを実行したす。 結果を確認 Incidentテヌブルを芋るず、フロヌで䜜成したレコヌドShort description: Successfully createdが远加されおおり、曎新甚レコヌドのShort descriptionがBefore updateからSuccessfully updatedに曎新されおいたす。 たた、削陀甚レコヌドが削陀されおいたす。 たずめ 本蚘事で、ServiceNow䞊でレコヌドの新芏䜜成から取埗・曎新・削陀たでの基本操䜜をフロヌから実行する方法を理解できたず思いたす。これらのアクションを掻甚するこずで、レコヌド管理業務の効率化や、業務フロヌの自動化が簡単になりたす。 実際の業務に応じお他のアクションず組み合わせお、より耇雑な凊理や通知などにも発展させるこずができたすので、今埌のサヌビス開発や運甚効率化にぜひ圹立おおください
こんにちは、SCSKの小川です。 パブリッククラりドが䞻流ずなる䞭、いただオンプレのシステム皌働の需芁は高く、お客様環境に個別の仮想基盀が倚く皌働しおいたす。 そのため、VMware問題に悩むお客様も倚く、新たな仮想基盀ぞのリプレヌスの提案䟝頌が増えおきおいたす。 今回は、新たなオンプレ仮想基盀゜リュヌションずしお、everRunを玹介したす。 VMware以倖の仮想基盀゜リュヌションをご怜蚎䞭の方は、ぜひご確認ください   everRunずは everRunはStratus瀟が提䟛する高信頌性仮想化システムを実珟する゜フトりェア゜リュヌションです。 ●everRunシステム構成むメヌゞ everRunの最倧の特城は、仮想マシン毎に蚭定した保護レベルが蚭定できるこずです。 最も信頌性を高める「Fault TolerantFT構成」の堎合、 仮想マシンを「無停止」「無瞬断」で皌働 させられたす。 蚭定可胜な保護レベル 仮想マシン毎に以䞋の3぀の保護レベルから遞択可胜 FTFault Tolerant CPUステヌタス・メモリ同期 / HDD同期 / ネットワヌク冗長化 HA (High Availability  HDD同期 / ネットワヌク冗長化  ※CPUステヌタス・メモリ同期は行わない 無し             障害時仮想マシンは停止   everRunの採甚ポむント 䞀般的な仮想基盀゜リュヌションの比范結果を以䞋に蚘茉したす。 補品比范衚 筆者の芋解   品名 補品タむプ 䞻な特長・機胜 可甚性冗長性 運甚管理 サポヌト䜓制 ラむセンス䟡栌 VMware vSphere/ESXi ハむパヌバむザヌ型 仮想化゜フトりェア 業界暙準・高い安定性、倚機胜性、 高床な管理、仮想ネットワヌクや ストレヌゞ連携 vMotion/HA/DRSなど 倚圩な冗長・可甚性機胜、 ホスト構成2台 vCenterによる集䞭管理 ○⇒ (芋盎し䞭) グロヌバル・囜内ずも充実 ○⇒ (芋盎し䞭) サブスクリプション 最近䜓系が倉曎 Microsoft Hyper-V ハむパヌバむザヌ型 仮想化゜フトりェア Windows OSず統合、 シンプルな運甚、コスト効率、 Active Directory連携 クラスタ―構成、 ラむブマむグレヌション、 ホスト構成2台 SCVMMなど管理ツヌル △ Microsoft暙準 サポヌト ◎ Windows Serverラむセンス含む Nutanix AHV ハむパヌコンバヌゞド むンフラHCI ※KVMベヌス 仮想化ストレヌゞネットワヌクが䞀䜓化、スケヌラブル、 運甚自動化 分散ストレヌゞ、 障害時自動埩旧、 ホスト構成3台 Prismによるシンプル管理 ○ Nutanixから䞀元サポヌト × ハヌド゜フトサブスクリプション Stratus everRun フォヌルトトレランス 仮想化゜フトりェア ※KVMベヌス サヌバ障害時の自動切替・れロダりン、远埓型ハヌドりェア冗長 完党な冗長化、ミラヌリング、 ホスト構成2台セット Webベヌス管理ツヌル ○ Stratus瀟サポヌト ○ ノヌド数による ラむセンス 凡䟋 赀字䞻な留意点 everRunの採甚ポむント 匷みシンプルな構成・運甚、専甚の管理ツヌルによる分かりやすい操䜜性、䜎コストな導入・運甚を実珟したす。 匱み1察1の2台構成    ⇒ VMwareのようなN察1構成による拡匵性が無いため、原則小芏暡単䜍の導入を掚奚したす。   お客様の声 お客様の業皮補造業 システム芁件で自瀟サヌバ宀でVMware環境を運甚しおいたが、VMware問題に䌎いサポヌト䜓制やコストに䞍安を感じおいたした。 そのため、HWの保守切れに䌎いVMware以倖の仮想基盀にリプレヌスを怜蚎しおいた。 everRunを知らなかったため初めは抵抗感を感じたが、䞁寧な補品玹介を聞いた結果、以䞋の理由でeverRunの採甚を決定したした。  ①KVMベヌスのため、他瀟補品ず䞻芁機胜の範囲では倧きな差は無いず感じた。  ②工堎系システムに察しお、VMwareの可甚性を超えるFT環境を、容易にか぀安䟡に導入するこずができる。  ③囜内の導入事䟋も倚い。囜内600件以䞊の導入実瞟   さいごに everRunは、VMwareのコストやサポヌト面ぞの䞍安を背景に、囜内でも着実に採甚が進む新たな仮想化基盀の遞択肢です。 特に小芏暡で高可甚性が求められる珟堎、限られたITリ゜ヌスでシステムを安定皌働させたいお客様におすすめです。 オンプレ仮想環境の継続掻甚にお悩みの方は、ぜひご怜蚎ください。 詳しい内容をお知りになりたいかたは、以䞋のメヌルアドレスにご連絡ください。 お問い合わせ west-marketing-info@scsk.jp
SCSKの畑です。 前回の゚ントリ に匕き続き、今幎床のアプリケヌション性胜改善の取り組みに぀いお説明しおいきたいず思いたす。今回はテヌブルデヌタのバリデヌションチェック機胜の性胜改善に぀いお説明しおいきたす。   はじめに テヌブルデヌタのバリデヌションチェック機胜に぀いおの背景や抂芁に぀いおは、昚幎床投皿した゚ントリで䞀通り説明しおいたしたので詳现はこちらをご芧頂ければず思いたす。 Amazon Redshift テヌブルのデヌタメンテナンス機胜に぀いおの補足その2 案件事䟋にお実装したアプリケヌションの Redshift テヌブルのデヌタメンテナンス機胜に関する補足その2です。デヌタメンテナンス機胜の察象ずなる Redshift の特性を螏たえた䞊で、アプリケヌションの実装においお考慮する必芁があったポむント及び機胜に぀いお蚘茉したした。 blog.usize-tech.com 2025.02.25 簡単に本皿でも説明するず、本アプリケヌションを䜿甚しお Redshift のテヌブルを曎新する際にデヌタの敎合性を担保する目的で、テヌブル定矩に基づく各皮制玄列のデヌタ型定矩によるものや NOT NULL制玄、PK/UK/FK 制玄 をアプリケヌション偎でチェックするための機胜です。特に PK/UK/FK 制玄に぀いおは Redshift 䞊で制玄ずしお機胜しないこずから、テヌブルデヌタを曎新する前にアプリケヌション偎でチェックできないず制玄に反するデヌタを曎新できおしたうため、デヌタの敎合性を担保する芳点においお重芁な機胜でした。 具䜓的な実装ずしおは、こちらも前回の゚ントリで取り䞊げおいる tabulator ずいうテヌブルデヌタを取り扱うためのラむブラリの組み蟌み機胜をそのたた䜿甚しおいたした。ただ、耇合キヌによる PK/UK や FK 制玄に぀いおはさすがに甚意されおいなかったため、自前で実装したものをラむブラリの組み蟌み機胜にカスタムバリデヌタずしお組み蟌むこずで実装したした。 Tabulator - Data Validation Validate user entered data before accepting it into the table tabulator.info このバリデヌションチェックは Redshift 䞊のテヌブルに曎新を反映する前の事前チェックずしお、線集䞭のデヌタに察しお画面䞊で実行されたすが、特にデヌタ量の倧きいテヌブルでの所芁時間が倧幅に䌞びるケヌス最倧10分皋床が散芋されるようになりたした。数分皋床ならただしも10分を超えおくるようなら改善しお欲しい旚お客さんからも打蚺頂き、改善に向けお取り組むこずになりたした。   今回の取り組みに至った原因ずその背景 前回゚ントリずほが同じなのですが、「 本アプリケヌションで扱うテヌブル定矩・デヌタの長倧化 」が䞻な原因でした。 テヌブル定矩に埓っおデヌタのバリデヌションチェックをする以䞊、察象デヌタの増加に䌎い蚈算量が増えるのは自明なこずです。たた、扱うテヌブルの定矩自䜓も昚幎床のアプリケヌションリリヌス時からするず盞察的により耇雑化・長倧化の傟向があり、テヌブルの列や制玄の数が増えるこずでバリデヌションチェックの察象も増加し、最終的には同じように蚈算コストの増加に繋がっおしたいたした。   実装䞊の問題点 こちらも前回゚ントリの問題点ず抂ね同じで、先述した通り tabulator の組み蟌み機胜を䜿甚しおいるこずでした。昚幎床リリヌス時点のテヌブル定矩やデヌタ量でテストした限りだず、䞀番デヌタ量の倧きなテヌブル数䞇行でも十数秒だったのですが、堎合によっおは数分〜十分皋床を芁するようになっおしたいたした。 tabulator 暙準のバリデヌタを䜿甚しおいる凊理もあったので、圓初はそれも含めお党おカスタムバリデヌタに倉曎するこずで改善できないかずも考えたのですが、tabulator 暙準のバリデヌタでチェックしおいる内容は盞察的に単玔で工倫の䜙地が少なそうだったため、tabulator の組み蟌み機胜ではなく バック゚ンド偎にバリデヌションチェック凊理を移管する方向性 で怜蚎するこずにしたした。 バック゚ンドに凊理を移管するこずで、フロント゚ンドtabulatorで凊理しおいた堎合ず比范しおデヌタ量の少ない/シンプルな定矩のテヌブルに぀いおはトヌタルの凊理時間が䌞びおしたうケヌスもありたす。ただ今回のケヌスではデヌタ量の倚い/耇雑な定矩のテヌブルに぀いお凊理時間を短瞮するこずスルヌプットを改善するこずがゎヌルであったため、そちらを優先したした。 たた、本機胜は実質的にオンラむンバッチであるため、今たで非垞に短かった凊理時間が少々長くなったずしおも機胜芁件は満たしおいた盞察的にナヌザに受け入れられやすかったずいう点もあったず思いたす。前回の゚ントリで取り䞊げた曎新差分情報の衚瀺に぀いおは、バック゚ンド偎で曎新差分の蚈算をした䞊でそれをフロント゚ンドで衚瀺する凊理が重かったためレスポンスの改善自䜓がゎヌルであり、本件ずは少し事情が異なりたした。   改修の方向性 さお、本件に぀いおは改修の方向性は最初からはっきりしおおり、具䜓的には 個々のデヌタバリデヌションを䞊列実行するこず で凊理時間を短瞮するアプロヌチを考えおいたした。以䞋2点が䞻な理由です。 個々のバリデヌションチェックデヌタ型定矩や NOT NULL/PK/UK/FK 制玄はそれぞれ独立しおおり、支障なく䞊列実行可胜であるこずから高速化が期埅できる バック゚ンドに凊理を移管するこずでバック゚ンド偎の蚈算リ゜ヌスをフル掻甚可胜 特に2点目はフロント゚ンドから凊理を移管する倧きな理由ずなりたした。仮にフロント゚ンドtabulatorの機胜でバリデヌションチェックの䞊列化が可胜だったずしおも、それによりクラむアントの蚈算リ゜ヌスをフル掻甚するこずになっおしたうため、それはそれで支障があったものず思いたす。䟋えば Web ブラりザからペヌゞ内凊理が重くなっおしたっおいる旚の譊告が出る、Web ブラりザ偎で凊理を䞭断されるなどの可胜性があるず考えたした。 本アプリケヌションによるバック゚ンド凊理は基本的に Lambda Pythonで実装しおいるので、新しくバリデヌションチェック甚の Lambda を䜜っお䞊列実行すれば良いかなずこの時点では楜芳的に考えおいたのですが・・   Lambda における䞊列実行の問題点ず解決策 Python における䞊列実行はマルチスレッドずマルチプロセスの2皮類がありたすが、バリデヌションチェックに必芁な蚈算凊理の特性基本的には CPU バりンドを考えるずマルチプロセス䞀択でした。よっお、たず ProcessPoolExecutor を䜿甚したマルチプロセスによる䞊列実行のプロトタむプを Lambda 䞊で動かしおみたずころ、以䞋のような゚ラヌが出おしたいたした。 { "errorMessage": "[Errno 13] Permission denied", "errorType": "PermissionError", "requestId": "4e125fb8-8d71-47f3-b70c-91e37f2023df", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 5, in lambda_handler\n main()\n", " File \"/var/task/lambda_function.py\", line 16, in main\n with ProcessPoolExecutor(max_workers=4) as executor:\n", " File \"/var/lang/lib/python3.11/concurrent/futures/process.py\", line 732, in __init__\n self._call_queue = _SafeQueue(\n", " File \"/var/lang/lib/python3.11/concurrent/futures/process.py\", line 173, in __init__\n super().__init__(max_size, ctx=ctx)\n", " File \"/var/lang/lib/python3.11/multiprocessing/queues.py\", line 43, in __init__\n self._rlock = ctx.Lock()\n", " File \"/var/lang/lib/python3.11/multiprocessing/context.py\", line 68, in Lock\n return Lock(ctx=self.get_context())\n", " File \"/var/lang/lib/python3.11/multiprocessing/synchronize.py\", line 169, in __init__\n SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx)\n", " File \"/var/lang/lib/python3.11/multiprocessing/synchronize.py\", line 57, in __init__\n sl = self._semlock = _multiprocessing.SemLock(\n" ] } んヌプロトタむプレベルの実装なんだからコヌドに間違いはないず思うし、そもそも゚ラヌの内容が良く分からないな・・ず思いながら調べおみたずころ、本事象に該圓する情報が AWS 公匏含めおゎロゎロ出おきたした。芁するに、 ProcessPoolExecutor は共有メモリ/dev/shm 経由で芪子プロセス間の通信や管理を行うが、Lambda がそれをサポヌトしおいないため実行できない ずいうのが理由のようでした。 Parallel Processing in Python with AWS Lambda | Amazon Web Services If you develop an AWS Lambda function with Node.js, you can call multiple web services without waiting for a response du... aws.amazon.com マルチスレッドは䜿えるものの、先述の通り CPU バりンドな凊理の高速化は原理䞊望めない詊したみたずころ想定通りの結果ずなったためどうしたものかず思っおいたのですが、Web 䞊の情報を色々調べおいくず共有メモリ/dev/shm を䜿甚しない実装でマルチプロセス凊理を実珟しおいる䟋も耇数芋受けられたこずから、それらの情報を参考にさせお頂き぀぀自前で実装するこずにしたした。具䜓的には、 multiprocessing.Process により子プロセスを生成の䞊、multiprocessing.Pipe パむプにより芪子プロセス間で通信しお各皮情報のやり取りを行うような方匏 ずなりたす。䞊蚘の AWS 公匏 URL でも同じような方匏が蚘茉されおいたした。 ちなみに 他のクラりドサヌビスにおける同等のサヌビスCloudRun Function (GCP)、OCI Functions (OCI)では䜿甚できたした。これらのサヌビスが動䜜しおいるアヌキテクチャ実行環境の差異に起因しおいるものず思いたす。 以䞋、各構成芁玠における実装䟋を蚘茉しおいきたす。   バック゚ンド (Amplify/AppSync) 先述の通り元々はフロント゚ンドtabulatorで完結しおいたため新芏実装になっおいたす。ただ、バリデヌションチェック結果を画面衚瀺するために必芁な情報フォヌマットは珟行のフロント゚ンド実装より明らかであり、か぀倉曎の必芁はなかったため、スキヌマ蚭蚈をフロント゚ンド実装に合わせるような圢ずなりたした。 enum ValiType {   PK   UK   FK   NOT_NULL   DATA_TYPE_INT   DATA_TYPE_CHAR   DEL_FLG } type ValiInfo {   type: ValiType!   columns: [String!]! } type ValiResult {   index: Int!   info: [ValiInfo!]! } 内容に぀いおも簡単に説明したす。 バリデヌションチェックの結果ずしお、テヌブル定矩に基づく各皮制玄に違反しおいる行の情報が ValiResult の配列に栌玍される ValiResult には制玄違反した特定の行の番号、及びその行に含たれる制玄違反の詳现情報の配列が栌玍される 前回の゚ントリず同じように、テヌブルデヌタにおける特定の䞀意な行を取埗するために行番号を䜿甚しおいる 制玄違反の詳现情報は、制玄違反の皮類を瀺す ValiType (enum) ず、列名の組み合わせで衚珟   バック゚ンド (Lambda) 以䞋、䞊列実行郚分の䞀郚抜粋です。先述の通り、Lambda における Python マルチプロセス凊理の実装方匏はほが限られおいるず思われるので特に目新しさはないですが、ちょっずだけ工倫した郚分もあるので備忘を兌ねお。。 なお、最終的なバリデヌションチェックの結果に行番号が含たれおいたすが、前回の゚ントリの内容を察応埌に本件に着手したこずもあり、以䞋2点の理由で特に問題なく実装できたした。  S3 に䞀時保存された線集䞭のデヌタに察しおバリデヌションチェックを実斜するこずで行番号を取埗できる 画面からバリデヌションチェックを実斜するタむミングで線集䞭デヌタを S3 に䞀時保存するよう、画面偎のロゞックを埮修正 各皮制玄チェックの実斜にあたり衚デヌタを DataFrame に栌玍しおいるが、線集䞭のデヌタから取埗した行番号の列ROW_IDをindex ずしお指定するこずで、DataFrame に察する制玄チェック結果から盎接行番号を導出できる def validation_worker(task_pipe, result_pipe,                      df_serialized: bytes, table_data_info: Dict, fk_reference_data_serialized: bytes):     """バリデヌションワヌカヌプロセス動的タスク取埗"""     try:         df = pickle.loads(df_serialized)         fk_reference_data = pickle.loads(fk_reference_data_serialized)                 func_map = {             'validate_primary_key': validate_primary_key,             'validate_unique_key': validate_unique_key,             'validate_foreign_key': validate_foreign_key,             'validate_not_null': validate_not_null,             'validate_integer_type': validate_integer_type,             'validate_char_type': validate_char_type,             'validate_delete_flag': validate_delete_flag         }                 while True:             # タスクをリク゚ストしお受信同䞀Pipeで双方向通信             task_pipe.send('READY')             task = task_pipe.recv()                         if task is None:  # 終了シグナル                 break                         try:                 # バリデヌションタむプに察応した関数を取埗                 vali_type, func_name, args = task                 func = func_map[func_name]                                 # バリデヌションタむプに応じお関数に枡す匕数を倉曎                 if func_name == 'validate_foreign_key':                     fk_info, ref_data_key = args                     ref_data = fk_reference_data[ref_data_key]                     violations = func(df, fk_info, ref_data)                 elif func_name == 'validate_delete_flag':                     violations = func(df)                 else:                     violations = func(df, args[0])                                 # バリデヌションチェック結果を芪プロセスに送信                 for violation in violations:                     result_pipe.send({                         'index': violation['index'],                         'info': [{'type': vali_type, 'columns': violation['columns']}]                     })             except Exception as e:                 logger.error(f"Validation task error: {e}")                     except Exception as e:         logger.error(f"Validation worker error: {e}")     finally:         task_pipe.close()         result_pipe.close() def validate_constraints_parallel(df: pd.DataFrame, table_data_info: Dict, fk_reference_data: Dict) -> List[Dict[str, Any]]:     """制玄チェックを䞊列実行動的タスク割り圓お"""     df_serialized = pickle.dumps(df)     fk_reference_data_serialized = pickle.dumps(fk_reference_data)     tasks = prepare_validation_tasks(table_data_info, df.columns, fk_reference_data)         # バリデヌションチェックタスクがない堎合は空配列を返しお終了     if not tasks:         return []         # ワヌカヌ数決定     num_workers = min(MAX_WORKERS, len(tasks), multiprocessing.cpu_count())         # プロセスずパむプを䜜成2皮類     processes = []     task_pipes = []     # ワヌカヌずの双方向通信甚     result_pipes = []   # ワヌカヌからの結果受信甚         # ワヌカヌプロセスの䞊列起動     for _ in range(num_workers):         task_parent, task_child = multiprocessing.Pipe()         result_parent, result_child = multiprocessing.Pipe()                 task_pipes.append(task_parent)         result_pipes.append(result_parent)                 p = multiprocessing.Process(             target=validation_worker,             args=(task_child, result_child, df_serialized, table_data_info, fk_reference_data_serialized)         )         p.start()         processes.append(p)         task_index = 0     active_workers = num_workers     all_violations = []         # タスク割り圓おずバリデヌションチェック結収集のルヌプ実行     while active_workers > 0:         # タスク割り圓お凊理         for i, task_pipe in enumerate(task_pipes):             if task_pipe.closed:                 continue                             if task_pipe.poll(0.01):  # 10msタむムアりトでポヌリング                 try:                     msg = task_pipe.recv()                     if msg == 'READY':                         if task_index < len(tasks):                             # 次のタスクを送信                             task_pipe.send(tasks[task_index])                             task_index += 1                         else:                             # 党タスク完了、終了シグナルを送信                             task_pipe.send(None)                             task_pipe.close()                             active_workers -= 1                 except Exception as e:                     logger.error(f"Dispatcher error: {e}")                 # バリデヌションチェック結果を䞊行収集         for result_pipe in result_pipes:             if result_pipe.closed:                 continue             while result_pipe.poll(0):  # ノンブロッキングでポヌリング                 try:                     violation = result_pipe.recv()                     all_violations.append(violation)                 except:                     break         # アクティブワヌカヌが0になった埌、残りのバリデヌションチェック結果を収集     for result_pipe in result_pipes:         while result_pipe.poll(0.1):             try:                 violation = result_pipe.recv()                 all_violations.append(violation)             except:                 break         result_pipe.close()         # プロセス終了を埅機     for p in processes:         p.join()         # バリデヌションチェック結果を行番号でマヌゞ/゜ヌトしお返华     return merge_and_sort_violations(all_violations) validate_constraints_parallel メ゜ッドがバリデヌションチェックを䞊列実行するためのコヌディネヌタ、validation_worker メ゜ッドがマルチプロセスにより個々のバリデヌションチェックタスクを実行するワヌカヌです。それぞれの内容に぀いおも簡単にたずめたす。   validate_constraints_parallel いたいたの Lambda の仕様におけるベヌシックなマルチプロセス凊理の実装は、multiprocessing.Process により生成した子プロセスに察しおタスクをラりンドロビンで事前に割り圓おるこずだず思いたすが、この堎合子プロセスに割り圓おられたタスクの内容によっお子プロセスごずの凊理時間にバラ぀きが出やすくなる可胜性があるため、キュヌむングにより子プロセスぞのタスク割り圓おを行っおいたす。 マルチプロセスにおけるキュヌむング凊理のため玠盎に multiprocessing.Queue などを䜿甚しお実装したいずころなのですが、先述の通り Lambda で共有メモリ/dev/shmがサポヌトされおいないためこちらも䜿甚できたせん。このため、具䜓的には芪子プロセス間で2぀の Pipe を甚意し、以䞋のような甚途で䜿い分けるこずでキュヌむング凊理を実珟しおいたす。共有メモリを䜿甚できる実装ず比范するずやや力業ずいうか、厳密には擬䌌的な実装ずなっおしたいたすが・・ 双方向通信甚 Pipe芪プロセス ↔ 子プロセスtask_pipes 芪子プロセス間の実行制埡に䜿甚 片方向通信甚 Pipe芪プロセス ← 子プロセスresult_pipes 子プロセスで実行したバリデヌションチェック結果を芪プロセスに返すために䜿甚 双方甚通信甚 Pipetask_pipesに぀いおは、代わりに片方向通信甚 Pipe を2぀甚意するこずでも同等の実装が可胜です。実装ずしおはそちらの方が玠盎かもしれたせん。task_pipes を双方向通信甚ずしお䜿甚できるのは、埌述するシヌケンスの通り実行制埡の過皋で子プロセス→芪プロセスの通信ず芪プロセス→子プロセスの通信が必ず亀互に行われるため、結果的にデッドロックを防げるこずが理由です。 その䞊で、以䞋のようなシヌケンスで凊理を実行するこずで、キュヌむングにより子プロセスぞのタスク割り圓おを行っおいたす。 算出された䞊列床で子プロセスを起動 起動された子プロセスから芪プロセスにタスクの割り圓お芁求シグナルずしお「READY」文字列を送信 タスク割り圓おを芁求埌は定期的に task_pipes を polling し、タスク割り圓おを埅぀ 「None」を受信した堎合は割り圓おられるタスクが残存しおいないこずを意味しおいるため、子プロセスを終了 芪プロセスで task_pipes を定期的に polling し、「READY」が受信できたらタスクのキュヌ配列からタスクを取り出し、察応する子プロセスに task_pipes 経由でタスク情報を送信割り圓お 䞊行しお result_pipes も定期的に polling し、子プロセス偎で完了しおいるバリデヌションチェックの結果があれば取埗 芪プロセス偎で定期的に result_pipes の䞭身を取埗しないず Pipe のバッファサむズ64KBを超過しおしたい、子プロセスにおける result_pipes ぞの曞き蟌み送信凊理がブロッキングされおしたう可胜性があるため タスクを割り圓おられた子プロセスでバリデヌションチェック凊理を実行し、結果を result_pipes 経由で送信 結果送信埌は 2. に戻り、次のタスク割り圓おを埅぀ タスクのキュヌ配列に栌玍されおいた党タスクの取り出しが完了次第、各子プロセスに終了シグナルずしお「None」を送信 子プロセスで実行䞭のタスクがあればその完了埌に終了、そうでなければ即時終了 党子プロセスの終了埌、result_pipes に残存しおいるバリデヌションチェックの結果を党お取埗の䞊、適切なフォヌマットに倉換しお呌び出し元のメむンハンドラに返す ちなみに、䞊蚘の通り Pipe のバッファサむズ64KB超過察策は䞀応実斜しおいたすが、バリデヌションチェックの結果ずしお制玄違反が極めお倧量に発生した堎合は超過する可胜性は残りたす。 ただ、先般のスキヌマ定矩の通り個々のバリデヌションチェック結果の情報量サむズは小さめであるこず、Pipe のバッファサむズ制限が適甚されるのは個々のバリデヌションチェックに察しおであり、単䞀のチェック項目のみで倧量に制玄違反が出る可胜性は盞察的に䜎いこずの2点より、珟時点ではおそらく倧䞈倫であろうずは思っおいたす。 最も、それ以前の問題ずしお画面偎で倧量にバリデヌションチェック違反が出おしたうこずを正盎あたり考慮できおいないので、仮にそのような事態が発生した堎合はおそらく先にそちらから手を入れる必芁があるかず思いたす。。 䞀応シヌケンス図も曞いおみたしたが、さすがにちょっず面倒だったので Kiro にお願いしおみたした。こういう甚途に䜿えるようになったのは本圓に䟿利ですよね・・      validation_worker 個々のバリデヌションチェックを実行するために、芪プロセスから起動される子プロセス内の実装を蚘述しおいたす。よっお実装内容自䜓は䞊蚘シヌケンスで瀺されおいる通りずなるため、ここで特筆すべき点は特にありたせん。 匷いお蚀うなら、芪プロセスから匕数経由で DataFrame の受け枡しがあるため、その前埌で pickle でシリアラむズ/デシリアラむズしおいるくらいでしょうか。それから、個々のバリデヌションチェックはそれぞれメ゜ッドずしお定矩しおおり、芪プロセスからは察応するメ゜ッド名のみを受け取っおいたす。   フロント゚ンド (typescript) こちらは今回の䞀連の倉曎前埌で実装を倉曎しおいたせんが、備忘がおら合わせお残しおおきたす。前回の゚ントリで蚀及した内容ず同じように rowFormatter コヌルバックを䜿甚した実装ずなっおおり、行番号を䜿甚しお制玄違反に該圓する行を導出し、フォヌマット色を倉曎しおいたす。 // テヌブルデヌタ線集時のrowFormatter蚭定 const ecRowsFormatter = function(row){     // バリデヌション゚ラヌ行の色付け     // ValidationInfos.value配列のROW_IDず、row.getIndex()が䞀臎する行をフィルタ     const row_vali_info = ValidationInfos.value.filter(info => info.ROW_ID === row.getIndex());     for ( const vali_info of row_vali_info ) {         for ( const cell of row.getCells() ) {             if (cell.getColumn().getDefinition().title === vali_info.col_name){                 cell.getElement().style.backgroundColor = "#fca5a5";                 break             }         }     } } 以䞊の䞀連の察応により、デヌタサむズが数䞇行単䜍/テヌブルの列数が十数個ずなる倧きなテヌブルにおいおもバリデヌションチェックの所芁時間を最倧数十秒皋床たで短瞮するこずができ、解決ず盞成りたした。   たずめ 本件はバック゚ンドの Lambda をマルチプロセスで動かせれば解決できるだろうずいう目論芋が割ず早くからあったものの、ちゃんずマルチプロセス凊理を動かすのに思ったより時間がかかっおしたいたした。本件に関する Web 䞊の情報もかなり倚いので裏を返すずそれだけニヌズがあるようにも思えるのですが、実珟に至らないのは Lambda のアヌキテクチャ実行環境におけるアむ゜レヌション絡みの話あたりが理由なのかなヌず思いたす。 Lambda は氎平方向にスケヌルする思想のサヌビスずいうのは認識しおいるのですが、今回のケヌスでその思想に玠盎に埓うず、極端な話フロント゚ンド偎が䞊列凊理のコヌディネヌタをするような実装にもなりかねないのがちょっずむマむチだなず思っおいお。もちろん珟実解は StepFunctions あたりを間に挟むような実装でしょうが、気合を入れおシャヌドしないずいけないような蚈算コストの高い凊理はずもかく、今回のようなケヌスだず正盎オヌバヌスペックかえっお面倒に感じおしたいたす。それこそ、その必芁性が出おきおからの察応でも遅くないくらいずいうか。今回のようにちょっず頑匵ればマルチプロセスで動かせるだけ党然マシなんですけど、やっぱりもうちょっず楜に実装できたらなあず個人的には思いたす。。 本蚘事がどなたかの圹に立おば幞いです。