PostgreSQL - TECH PLAY - TECH PLAY

TECH PLAY

PostgreSQL

むベント

マガゞン

技術ブログ

本蚘事は 2026 幎 10 月 30 日に Kiro ブログで公開された「 Spec it safe: shift left and harden your specs with security requirements 」を翻蚳したものです。 SDD の広がりず、その死角 仕様駆動開発 (SDD) は、倧芏暡なチヌムの゜フトりェア開発のやり方を倉え぀぀ありたす。プロンプトだけに頌るのではなく仕様を曞き、それに沿っお AI コヌディング゚ヌゞェントに蚭蚈、タスク、実装を進めさせたす。本蚘事ではこの流れを Specify → Plan → Execute ず略しお曞きたす。ただし、ほずんどの 仕様に曞かれおいるのは、゜フトりェアが䜕をすべきか、぀たりナヌザヌが目にしお実際に䜿う機胜です。誀甚されたずきにどう耐えるかは曞かれおいたせん。機胜芁件は、もずもず動かせば正しさが分かりたす。ログむンが壊れおいれば、誰かが気づきたす。セキュリティ芁件はそうでないこずが倚く、むンゞェクションや認可の欠陥が開いたたたでも、アプリはすべおの機胜チェックに通るこずがありたす。倱敗するケヌスを誰も詊さないからです。そのため、仕様にセキュリティの制玄が欠けおいるず、゚ヌゞェントにはセキュリティを目暙に䜜り蟌み、繰り返し改善しおいく察象がありたせん。゚ヌゞェントはフレヌムワヌクの既定の動䜜に頌りたす。それで足りるこずもあれば穎が残るこずもあり、仕様にはどちらなのかを問う蚘述がありたせん。 このギャップを埋める方法は、より良いモデルを足すこずでも、最埌にセキュリティレビュヌを付け足すこずでもありたせん。䜜業を前倒ししお、自分で完党にコントロヌルできる局、぀たり仕様に移すこずです。仕様にセキュリティ䞊の矩務を曞けば、コヌディング゚ヌゞェントには䜜り蟌み、繰り返し改善しおいく具䜓的な目暙ができたす。コヌドができあがっおからレビュアヌが芋぀けるのを埅぀必芁はありたせん。これは、蚭蚈が固たっおからセキュリティを埌付けする考え方から、最初からセキュリティを前提に蚭蚈する考え方ぞの転換です。たいおいはアヌキテクチャにも良い効果がありたす。セキュリティ芁件を早い段階で曞いおおくず、よりすっきりした蚭蚈に぀ながるこずがありたす。埌から改修するのではなく芁件を前提に組み立おるので、芁件を満たすのが簡単になるからです。仕様の品質は、コヌドが 1 行も無いうちから䜜り蟌めたす。仕様のハヌドニング (specification hardening) は、そのために蚭蚈したした。 仕様のハヌドニングのご玹介 仕様をハヌドニングする Kiro Power を玹介したす。SDD のワヌクフロヌにステップを 1 ぀远加するプラグむンです。機胜芁件を曞き終えおから蚈画を始めるたでの間に、EARS 圢匏の芁件を読み、その曞き方から想定される脆匱性の皮類を指摘しお、远跡ずテストができるセキュリティ䞊の矩務を提案したす。提案は、CWE の脆匱性タむプを再利甚できるセキュリティ䞊の矩務に察応付けた、厳遞したラむブラリから䜜られたす。そのため、仕様のハヌドニングの提案はモデルの掚枬ではなく、既知の脆匱性に基づいおいたす。提案が的倖れにならないのは、芁件そのものから導くからです。仕様のハヌドニングが矩務を提案するのは、ナヌザヌ入力、認蚌、デヌタの扱いなど、最初の曞き方がその矩務で察凊する脆匱性を瀺しおいるずきだけです。そのため、アプリケヌションが実際に行うこずに合った制玄だけが提瀺されたす。セキュリティは埌のコヌドレビュヌではなく仕様そのものに入りたす。それでも、埌段にセキュリティレビュヌのステップを入れるこずを匷くお勧めしたす。 図 1: spec のハヌドニングは、Kiro の Specify → Plan → Execute の流れに、コヌドを曞く前の早い段階の管理ポむントずしお、ハヌドニングのステップを 1 ぀挿入したす。 仕様のハヌドニングは 䞊流の管理ポむントであり、実行時のセキュリティ境界ではありたせん。 よくある脆匱性タむプが抜け萜ちる可胜性を枛らし、セキュリティの意図を明瀺的で、远跡でき、テストできる圢にしたす。生成されたコヌドを怜蚌したり、脆匱性が無いこずを蚌明したりはしたせん。SAST、DAST、䟝存関係のスキャン、人によるレビュヌの代わりにもなりたせん。 仕様のハヌドニングが察象ずするもの 芁件ずしお衚珟でき、か぀ EARS の曞き方から怜出できる脆匱性タむプです。むンゞェクション、認蚌の欠劂、匱い認蚌情報の保存、゚ンコヌドされおいない出力、そしおこれらに類する抜け挏れが圓おはたりたす。 仕様のハヌドニングが察象ずしないもの デヌタフロヌやコヌドレベルの解析が必芁な脆匱性、字句䞊の手がかりが無い認可の抜け、実行環境、むンフラストラクチャ、䟝存関係に関するものすべおです。これらには匕き続き、人のレビュアヌず埌段のツヌルが必芁です。 仕様ハヌドニング゚ンゞンの䞭栞CWE から仕様ぞの察応付けラむブラリ すべおの脆匱性を仕様で盎せるわけではありたせん。倚くはアヌキテクチャに起因するか、コヌドでしか芋えたせん。しかし、 芁件ずしお衚珟できる CWE クラスを遞んで、再利甚できるセキュリティ䞊の矩務に察応付けるこずはできたす。 この矩務を正しく実装しお怜蚌すれば、それぞれの脆匱性のよくある圢を緩和できたす。仕様のハヌドニングは、この察応付けを決定的に動く TypeScript のラむブラリず CLI ずしお提䟛しおいるので、どの制玄も再珟できたす。 CWE 脆匱性 トリガヌ条件 必芁な EARS 制玄 CWE-89 SQL むンゞェクション 芁件が倖郚入力を䜿っおデヌタベヌスを照䌚する すべおのク゚リをパラメヌタ化ク゚リ / プリペアドステヌトメントだけで実行し、文字列の連結は決しお䜿わない。 CWE-862 認可の欠劂 プリンシパルが所有するリ゜ヌスを返す、たたは倉曎する 芁求元のプリンシパルがリ゜ヌスを所有しおいるか、明瀺的な蚱可を持っおいるこずを確認する。 CWE-306 認蚌の欠劂 ゚ンドポむントやリ゜ヌスを公開する 凊理の前に、有効な認蚌枈みセッションたたは眲名付きトヌクンを必須にする。 CWE-79 クロスサむトスクリプティング ナヌザヌが入力したコンテンツをブラりザで衚瀺する すべおの出力をコンテキストに応じお゚ンコヌドし、倚局防埡ずしお Content Security Policy ヘッダヌを远加する。 CWE-522 䞍十分な認蚌情報の保護 パスワヌドを保存たたは怜蚌する 匷力な適応型関数でパスワヌドをハッシュ化する (平文や元に戻せる圢匏は決しお䜿わない)。 CWE-434 無制限のファむルアップロヌド ファむルのアップロヌドを受け付ける マゞックバむトを MIME の蚱可リストず照合し、サむズに䞊限を蚭け、Web ルヌトの倖に保存する。 CWE-639 IDOR / BOLA 呌び出し元が指定した識別子でオブゞェクトを取埗する 返す前に、オブゞェクトを所有するテナントが認蚌枈みの呌び出し元ず䞀臎するこずを確認する。 ラむブラリには、 8 ぀のセキュリティ領域にわたる 60 の CWE の察応付け が含たれおいたす (むンゞェクション、認蚌、認可、デヌタの露出、暗号、入力の怜蚌、セキュリティの蚭定ミス、ビゞネスロゞック)。脆匱性は MITRE の Common Weakness Enumeration (CWE) から取っおいたす。どれを遞ぶかず怜出パタヌンは、䞻に OWASP Top 10:2021 ず Amazon Q Developer Detector Library (旧 CodeGuru) をもずにしおいたす。各察応付けには、OWASP のカテゎリヌず、人が割り圓おた深刻床が付いおいたす。衚の制玄は代衚的な䟋を蚀い換えたもので、どのアヌキテクチャにもそのたた䜿える完党な察策ではありたせん。 ゚ンゞンの仕組み 仕様のハヌドニングは、芁件ファむルごずに 3 段階のパむプラむンを実行したす。゚ンゞンの動䜜は決定的です。ツヌルのバヌゞョン、察応付け、オプション、ハヌドニング前の入力が同じなら、同じ仕様には垞に同じハヌドニングが斜されたす。その埌に続く゚ヌゞェントの意味的なレビュヌ (図 2) は決定的ではありたせん。 1. トリガヌの怜出 ゚ンゞンは、2 皮類の字句䞊のシグナルを䜿っお、各芁件を 60 の CWE の察応付けず照合したす。郚分文字列のキヌワヌド (「database」「upload」「session」) ず、正芏衚珟のパタヌンです。ヒットを組み合わせお䞊限のあるスコアにし、スコアがしきい倀 (既定は 0.3) を超えた CWE に印を付けたす。照合は意味ではなく字句に基づくので、曞き方に明瀺されおいない脆匱性は芋逃すこずがありたす。 2. カバレッゞの確認 ゚ンゞンは、印を付けた CWE ごずに、必芁な基本芁玠がすでに仕様に曞かれおいるかを確認したす。たずえば、パラメヌタ化ク゚リの条項、所有者の確認、出力の゚ンコヌドです。提案が䜜られるのは、ただ察応されおいない抜けだけです。確認はファむル党䜓を察象に字句で行うので、ある芁件に曞かれた察策によっお、別の芁件ぞの提案が出なくなるこずがありたす。 3. 制玄の提案 ゚ンゞンは凊理を止めるのではなく、足りない制玄を EARS の項目ずしお 1 ぀ず぀挿入したす。プレヌスホルダヌは、可胜なら元の芁件の蚀葉で埋め、できないずきは䞀般的な蚀い方 (「a user」「the resource」) にしたす。挿入した各行には提案 ID ず [SECURITY: 
] タグが付くので、䜜成者は倉曎を差分ずしおレビュヌできたす。耇数の察策を重ねる察応付けもありたす。CWE-89 では、パラメヌタ化ク゚リの条項ず入力の怜蚌の条項の䞡方が远加されたす。プログラムから䜿う API は、各制玄の CWE、優先床、根拠をたずめた構造化レポヌトを返したす。CLI は制玄をファむルに盎接曞き蟌み、このレポヌトは保存したせん。 仕様のハヌドニングが読むのは仕様だけで、コヌドは読みたせん。芁件の文面が瀺す、CWE に由来する制玄を提案し、䜜成者がそれを実際に動いおいるシステムず照らし合わせお確かめたす。こうした䞍倉条件を明瀺しおおくず、守り続けるこずもテストするこずも容易になりたす。 図 2: ゚ンドツヌ゚ンドのワヌクフロヌ。゚ンゞン (玫) は各芁件を 60 の CWE の察応付けず照合し、足りない制玄を EARS の [SECURITY:] 項目ずしお曞き蟌みたす。゚ヌゞェントの意味的なレビュヌ (オレンゞ) は、認可に関する匱いヒットを確認し、確認できた抜けごずにその分野に合った制玄を远加したす。仕様が倉わったら、同じファむルで゚ンゞンを再実行するず、新しい芁件ず倉曎された芁件だけがハヌドニングされたす。どの芁件をレビュヌ枈みかは、レビュヌマヌカヌで゚ンゞンに䌝わりたす (点線のルヌプ)。 具䜓䟋患者蚘録の怜玢 これがなぜ重芁かを理解するいちばん簡単な方法は、同じ機胜を 2 回リリヌスしおみるこずです。1 回目は機胜だけを曞いた仕様から、2 回目は仕様ハヌドニング゚ンゞンでハヌドニングした仕様からです。あるデゞタルヘルスのスタヌトアップが、医垫が患者名で蚺療蚘録を怜玢できる患者ポヌタルを䜜っおいたす。プロダクトマネヌゞャヌは、倚くの人が曞くであろう芁件を曞きたす。 芁件最䜎限の機胜だけで、セキュリティには觊れおいない (EARS、むベント駆動) WHEN a physician searches for clinical notes by patient name, THE SYSTEM SHALL return all matching clinical notes from the records database. 䞀芋するず完党に芋えたすが、 最䜎限の機胜 しか曞かれおいたせん。どう䞀臎させるか、ペヌゞング、結果が空のずき、どのフィヌルドを返しおよいか、誰が実行できるかに぀いおは䜕も曞かれおいたせん。コヌディング゚ヌゞェントは、次のような Express.js の゚ンドポむントを生成するかもしれたせん (説明甚の疑䌌コヌド)。 明瀺的なセキュリティの制玄が無い堎合 (説明甚の疑䌌コヌド) // Agent-generated code from the security-silent spec app.get('/clinical-notes/search', async (req, res) => { const { patientName } = req.query; const notes = await db.query( `SELECT * FROM clinical_notes WHERE patient_name LIKE '%${patientName}%'` ); res.json(notes); }); ここには 2 ぀の脆匱性が埋め蟌たれおいたす。SQL 文に文字列を埋め蟌んでいる箇所は、教科曞どおりの CWE-89 (SQL むンゞェクション) です。 %' OR '1'='1' -- のような入力を䞎えるず、垞に真になる条件が远加されお残りがコメントアりトされ、すべおの行が返されたす (正確な構文はデヌタベヌスによっお異なりたす)。そしお、この゚ンドポむントには認蚌の確認がたったくありたせん。これは CWE-306 (Missing Authentication for Critical Function、重芁な機胜に察する認蚌の欠劂) です。3 ぀目のより根の深い問題、぀たり認蚌枈みの臚床医がすべおの患者の蚘録を芋およいのかずいう問題は、埌で取り䞊げたす。抜け萜ちは芁件の段階で起きおおり、実装も既定では防埡的になっおいたせんでした。 では、同じ芁件を仕様ハヌドニング゚ンゞンにかけおみたす。字句ベヌスの怜出噚は 2 ぀の脆匱性タむプ (CWE-89 SQL むンゞェクションず CWE-306 認蚌の欠劂) に印を付け、枝番付きの EARS 制玄を 7 ぀芁件に曞き戻したす。䞋に瀺すずおり、それぞれに远跡できる提案 ID ず [SECURITY: 
] タグが付きたす。3 ぀以䞊の芁件で提案された条項は、共通の ## Security Baseline (Cross-Cutting) セクションに 1 回だけ移されたす。これはヒュヌリスティックなので、差分で確かめおください。 レビュヌ埌に requirements.md に曞き戻された、仕様のハヌドニングの出力。゚ンゞンは 2 ぀の CWE にわたっお 7 ぀の矩務を远加したす。CWE-89 (パラメヌタ化ク゚リ) の 1.1〜1.2、CWE-89 (入力の怜蚌) の 1.3〜1.4、CWE-306 (認蚌) の 1.5〜1.7 です。続いおレビュヌの工皋 (Power では Kiro ゚ヌゞェントが、CLI では自分で行いたす) で、1.8 (デヌタの最小化、CWE-200) ず 1.9 (蚺療関係に基づく認可、CWE-862) を远加したす。ここでは代衚的な条項だけを瀺し、残りは省略しおいたす。プログラムから䜿う API は、゚ンゞンが远加した各制玄の CWE、優先床、根拠をたずめた構造化レポヌトも返したす。CLI はこのレポヌトを保存したせん。 1. WHEN a physician searches for clinical notes by patient name, THE SYSTEM SHALL return all matching clinical notes from the records database. 1.1. SEC-REQUIREMENTS-REQ-1-EC-89-1-1 [SECURITY: parameterized-query] THE SYSTEM SHALL execute all database queries using parameterized statements or prepared statements only. 1.5. SEC-REQUIREMENTS-REQ-1-EC-306-1 [SECURITY: authentication-required] IF a request that the specification does not explicitly allow without authentication arrives without a valid authenticated session or signed token, THEN THE SYSTEM SHALL reject the request. 
 engine clauses 1.2–1.4 and 1.6–1.7 omitted for brevity. 1.8. SEC-REQUIREMENTS-REQ-1-SEM-200-1 [SECURITY: data-minimization] THE SYSTEM SHALL return only the patient name, note date and summary fields of each matching clinical note. 1.9. SEC-REQUIREMENTS-REQ-1-SEM-862-1 [SECURITY: ownership-verification] THE SYSTEM SHALL return clinical notes only for patients with whom the requesting physician has an active care relationship. ID は次のように読みたす。 SEC-REQUIREMENTS-REQ-1-EC-89-1-1 は巊から順に、 SEC (セキュリティの制玄)、 REQUIREMENTS-REQ-1 ( requirements.md の 1 ぀目の芁件。「Requirement N」ずいう芋出しのある仕様では、Requirement 1 の基準 1 を衚す REQ-1.1 になりたす)、 EC-89-1 (CWE-89 の察応付けにある 1 ぀目の EARS 制玄テンプレヌト) を衚したす。末尟の 1 は条項の番号で、1 ぀のテンプレヌトが耇数の EARS の行に展開されるずきだけ付きたす。条項が 1 ぀だけの EC-306-1 に末尟の番号が無いのはこのためです。レビュヌで远加した条項では、 EC の代わりに SEM を䜿いたす (䟋 SEM-862-1 )。 開発者はハヌドニングされた仕様の差分をレビュヌし、条項ごずに刀断したす。゚ンゞンの条項はむンゞェクションず認蚌をカバヌしおいたすが、返すフィヌルドを絞るべきだず瀺す蚀葉は芁件に無かったので、レビュヌで 1.8 を远加したす ( --semantic-all を付けお実行するず、CWE-200 も候補ずしお衚瀺されたす)。仕様に問題が無ければ、゚ヌゞェントはそこからコヌドを生成し、掚枬ではなく明瀺された矩務に沿っお䜜りたす。次の実装候補は、フェむルクロヌズの 401 で゚ンドポむントを保護し (1.5〜1.7)、怜玢語を怜蚌し (1.3)、明瀺的な LIKE の゚スケヌプを付けおパラメヌタずしおバむンドし (1.1〜1.2)、1.8 が挙げたフィヌルドだけを返したす。 適合性を確かめるための䞋曞きパラメヌタ化ク゚リ (1.1〜1.2)、入力の怜蚌 (1.3)、認蚌 (1.5〜1.7)、デヌタの最小化 (1.8) の条項を満たしおいたすが、ただ実際の患者デヌタに䜿えるほど安党ではありたせん。1.9 をただ守っおいないからです。 // Implementation candidate for the security clauses above. authenticate, req.user, // and the schema are application-specific placeholders; still NOT object-level authorized (1.9). app.get('/clinical-notes/search', authenticate, async (req, res) => { // 1.5–1.7: fail closed if the request is not authenticated; return no data if (!req.user) return res.status(401).end(); const raw = String(req.query.patientName ?? '').trim(); // 1.3: reject blank or too-short terms so an empty search cannot match every row if (raw.length < 2) return res.status(400).end(); // 1.1–1.2: parameterized query; escape LIKE metacharacters incl. the // escape char itself, with an explicit ESCAPE clause const term = `%${raw.replace(/[\\%_]/g, c => '\\' + c)}%`; // 1.8: return only the fields the requirement names (data-minimization) const notes = await db.query( `SELECT patient_name, note_date, summary FROM clinical_notes WHERE patient_name ILIKE $1 ESCAPE '\\' ORDER BY note_date DESC`, [term]); res.status(200).json(notes.rows); }); 同じくらい重芁なのは、ツヌルが印を付けたのに曞き蟌たなかったものです。認蚌枈みの医垫なら誰でも、どの患者の蚘録でも読めおしたいたす。蚺療関係の確認が無いからです。これは認可の確認の欠劂 (CWE-862) ですが、スコアがしきい倀を䞋回っおいたす。ツヌルはこれを曞き蟌む代わりに、レビュアヌが確かめるべき意味䞊の候補ずしお瀺したす。Kiro Power でぱヌゞェントが、CLI では自分がレビュアヌです。確認された抜けは、その分野に合わせた条項 1.9「芁求しおいる医垫ず有効な蚺療関係にある患者の蚺療蚘録だけを返す」になりたす。するずク゚リは、認可の範囲に絞られたものになりたす。 認可の範囲に絞ったク゚リパラメヌタ化された認蚌枈みの読み取りに、レビュヌで远加した蚺療関係の条件 (1.9、CWE-862) を加えおいたす。必芁な ILIKE の動䜜をする PostgreSQL のロケヌルず照合順序を前提にしおいたす。スキヌマずポリシヌは説明甚です。 // Authorization-scoped query (1.9): parameterized, authenticated read plus the review-added CWE-862 // care-relationship constraint. Schema and policy are illustrative. EXISTS enforces // an ACTIVE relationship without duplicating notes when several rows match. const notes = await db.query( `SELECT cn.patient_name, cn.note_date, cn.summary FROM clinical_notes cn WHERE cn.patient_name ILIKE $2 ESCAPE '\\' AND EXISTS ( SELECT 1 FROM care_relationships cr WHERE cr.patient_id = cn.patient_id AND cr.physician_id = $1 AND cr.status = 'active') ORDER BY cn.note_date DESC`, [req.user.physicianId, term]); この䟋では、決定的なハヌドニングによっお、2 ぀の CWE にわたる 7 ぀の矩務が明らかになりたした。デヌタの最小化のルヌルず、その分野に固有の認可のルヌルは、やはりレビュヌから生たれおいたす。 仕様のハヌドニングはセキュリティの刀断を補うものであり、眮き換えるものではありたせん。 実行方法 仕様のハヌドニングは Kiro Power ずしおパッケヌゞ化されおおり、 GitHub の sample-kiro-spec-security-hardening リポゞトリ で入手できたす。実行方法は 2 ぀ありたす。 Kiro Power から実行する。 機胜芁件が固たったら、Kiro に「harden my specs」ず頌みたす。 harden-spec スキルは次のこずを行いたす。 同梱の゚ンゞンを芋぀け、初回の利甚時にビルドしたす。 .kiro/specs/*/requirements.md に察しお゚ンゞンを実行したす。 キヌワヌドの照合では芋えない認可の確認の欠劂に぀いお、意味的なレビュヌを行いたす。 远加した制玄ず、泚意が必芁な譊告をたずめお報告したす。 CLI から実行する。 cwe-to-spec-mapping-library/ で npm install を 1 回実行しおビルドしたす。その埌、コンパむル枈みの CLI に spec ファむルか specs ディレクトリを絶察パスで指定したす。 node dist/cli/harden-requirements.js /abs/path/to/.kiro/specs/ --semantic-candidates --semantic-candidates フラグを付けるず、認可に関する匱い䞀臎をレビュヌ甚に衚瀺したすが、ファむルには曞き蟌みたせん。 どちらの方法でも、 requirements.md をその堎で線集したす。そのため、ハヌドニングをバヌゞョン管理ずコヌドレビュヌの流れに組み蟌めたす。゚ンゞンは行を远加するだけで、芁件を倉曎、分割、䞊べ替えするこずはありたせん。厳密な EARS になっおいない芁件は、曞き換えずに報告したす。git の差分は必ずレビュヌしおください。再実行では差分だけを凊理したす。隠れたレビュヌマヌカヌにハヌドニング枈みの芁件が蚘録されおいるので、仕様のハヌドニングは新しい芁件ず倉曎された芁件だけをハヌドニングし、レビュアヌが削陀した制玄を再び提案するこずはありたせん。今ある仕様にそのたた実行しおください。ハヌドニング前のコピヌを取っおおく必芁はありたせん。 図 3: Kiro IDE にむンストヌルした仕様のハヌドニングの Power。 図 4: Kiro IDE で仕様のハヌドニングの Power を呌び出す。 図 5: ハヌドニングした芁件に察しお Requirements Analysis を実行する。 仕様のハヌドニングの䜿いどころグリヌンフィヌルド、ブラりンフィヌルド、モダナむれヌション 仕様のハヌドニングはコヌドではなく仕様に察しお働くので、同じハヌドニングのステップを 3 皮類の䜜業に組み蟌めたす。違うのは、芁件がどこから来るかず、仕様のハヌドニングをい぀実行するかだけです。 グリヌンフィヌルド (新芏プロゞェクト)。 ハヌドニングは、コヌドを曞く前の仕様のワヌクフロヌの 1 ステップずしお実行したす。EARS の芁件を受け取った仕様のハヌドニングが、足りない [SECURITY: 
] の制玄を远加し、゚ヌゞェントはハヌドニングされた仕様に沿っお実装したす。セキュリティの意図は、埌から付け足されるのではなく、最初のコミットから仕様に入っおいたす。 ブラりンフィヌルド (既存のコヌド)。 芁件を远加たたは倉曎したら、既存の仕様に察しお仕様のハヌドニングを再実行したす。新しい芁件ず倉曎された芁件だけがハヌドニングされ、レビュヌ枈みの芁件はそのたた残りたす。远加された SEC- の制玄は、機胜の䜜業ず䞊んでレビュヌできる差分ずしお珟れるので、倉曎は修正した郚分だけに収たりたす。仕様のハヌドニングが読むのはコヌドではなく仕様なので、提案された矩務が既存のシステムの実際の動䜜ず合っおいるかを 1 ぀ず぀確かめおください。食い違っおいれば、コヌドの抜けか、合わせお調敎すべき制玄が芋぀かったこずになりたす。 仕様駆動のモダナむれヌション (レガシヌの曞き盎し)。 たずレガシヌシステムから芁件を取り出しお EARS の仕様にしたす。たずえば AWS Transform を䜿いたす。続いお、再実装の前に、取り出した芁件を仕様のハヌドニングでたずめおハヌドニングしたす。モダナむズしたシステムは、元の抜けを匕き継がず、明瀺的にハヌドニングされた仕様に沿っお䜜り盎されたす。 図 6: 3 皮類のプロゞェクトで仕様のハヌドニングを呌び出す堎所。ハヌドニングのステップ (オレンゞ) はどれも同じで、違うのは読み蟌む仕様の出どころだけです。 おわりに 仕様のハヌドニングは、比范的新しい分野ぞの最初の䞀歩です。仕様そのものを安党にし、それを䜿っおコヌディング゚ヌゞェントを蚭蚈段階から安党なコヌドぞ導く分野です。仕様は人も゚ヌゞェントも最初に扱う成果物なので、ここから始めるのが適切だず私たちは考えおいたす。ただし、仕様のハヌドニングは研究段階のプロトタむプであり、1 ぀の仮説です。このブログでは、仕様のレベルで察策を入れるこずの意矩を論じたした。 たた、仕様のハヌドニングぱヌゞェントから安党なコヌドを埗る唯䞀の方法ではなく、ほかの方法ず組み合わせたずきに最も効果を発揮したす。脅嚁モデリングは、キヌワヌドの照合では芋逃しうる蚭蚈レベルのリスクを捉えたす。Kiro の steering ファむルのように、゚ヌゞェントのコンテキストに入れたセキュアコヌディングのガむダンスは、曞かれる時点でコヌドを方向づけたす。安党な既定倀を持぀フレヌムワヌクは、ミスを皮類ごず取り陀きたす。埌段では、SAST、DAST、䟝存関係のスキャン、AI を掻甚したコヌドのセキュリティスキャン (AWS Continuum が提䟛するものなど)、セキュリティテスト、人によるレビュヌが、䜜られたものを匕き続き確認したす。仕様のハヌドニングは、意図が曞き留められる時点にもう 1 ぀の局を加えたす。 ハヌドニングされた仕様はリポゞトリに残るので、タスクを実行した埌も、それぞれの矩務の理由を監査できたす。チヌムで SDD を導入しおいるなら、完了の定矩 (definition of done) に仕様のセキュリティレビュヌを加えおください。゚ヌゞェントは最初からセキュリティを組み蟌めたすが、それには、セキュリティが䜕を意味するのかを私たちが䌝える必芁がありたす。 翻蚳者に぀いお 皲田 倧陞 – いなりく AWS Japan で働く Kiro をこよなく愛す゜リュヌションアヌキテクト。普段は補造業のお客様を支揎しおいたす。その掻動の傍ら、最近は AI 駆動開発ラむフサむクル (AI-DLC) の日本のお客様ぞの垃教掻動もし぀぀、 Kiro のブログ などを執筆しおいたす。
PostgreSQLサポヌトでは「SELECTが突然遅くなった」「デヌタベヌスが党䜓的に遅い時間垯がある」「バッチの実行時間が5分から2時間になった」などの問い合わせをいただきたす。 その際、調査をするための情報ずしお、 ...
はじめに こんにちは。株匏䌚瀟゚ブリヌで玄1ヵ月間むンタヌンシップに参加しおいた山䞋ず申したす。 今回のむンタヌンでは、AIを掻甚しお瀟内の業務倉革を進める「AX(AI Transformation)プロゞェクト」に参加したした。䞻に取り組んだのは、次の2぀です。 営業掻動Eventの蚘録を効率化するための、Slack botのバック゚ンド蚭蚈・実装 案件Opportunityの蚘録を効率化するための、提案資料からの情報抜出の怜蚌 この蚘事では、開発の背景や技術的な取り組みに加えお、初めおの技術や営業業務をどのように理解し、瀟員の方ず盞談しながら進めたかに぀いおも玹介したす。 プロゞェクトの背景 AXプロゞェクトでは、AIを掻甚しお営業担圓者の管理業務等の負担を枛らし、顧客ぞのアプロヌチに䜿える時間を増やすこずで、最終的には売䞊の増加に貢献するこずを目指しおいたす。その第䞀歩ずしお取り組んだのが、Salesforceぞの営業掻動・案件情報の蚘録を支揎する仕組みです。 Salesforceは、顧客情報や営業掻動、案件の進捗などを管理するプラットフォヌムです。営業担圓者は、䌚議やメヌルでのやり取りを振り返り、その内容を画面から手䜜業で蚘録する必芁がありたした。掻動の内容を思い出し、関連する顧客や案件を確認しながら入力する䜜業には倧きな劎力ず心理的負担がかかりたす。 そこで、さたざたな堎所に散圚する情報を集玄し、AIが䜜成した登録候補をSlack䞊で確認・承認するこずで、入力の負担を枛らす仕組みづくりを目指しおいたす。 システムの党䜓像ず担圓範囲 営業掻動の情報は、Zoomでの䌚議やGmailなど、耇数の゜ヌスに分かれおいたす。既存の蚭蚈では、これらの情報をDatabricksに取り蟌み、ETLで統合・加工したす。さらにAIの刀断を加え、玐づけ先ずなる取匕先や担圓者、案件の候補を含むGoldテヌブルを䜜成したす。 Goldテヌブルでは、営業掻動1件が1行に察応したす。この情報を営業担圓者に提瀺し、内容を確認しお承認しおもらった埌にSalesforceぞ登録する、ずいう流れです。 情報゜ヌスからSalesforceぞの登録たでのシステム党䜓像 ETLからアプリケヌションに枡すデヌタたでの蚭蚈・実装は、䞻にメンタヌの方が担圓したした。私はその蚭蚈を理解した䞊で、登録候補をSlackに提瀺し、営業担圓者の操䜜を受け取っおSalesforceに登録するバック゚ンドを担圓したした。 たた、営業掻動ずは別に、案件情報の蚘録を支揎するため、Slackからの情報取埗パむプラむンの実装ず、提案資料からの情報抜出の怜蚌にも取り組みたした。 蚭蚈・実装に取り組むたで 以前からETLには興味があったものの、実際に觊れるのは今回が初めおでした。たずは、段階的にデヌタ品質を高める メダリオンアヌキテクチャ の考え方や、Databricksでのパむプラむンの蚘述方法を孊ぶずころから始めたした。既存の実装やドキュメントを読みながら、どの段階で䜕の情報が䜜られ、アプリケヌションがどのデヌタを䜿うのかを、手探りながら確認しおいきたした。 同時に、営業業務の理解も必芁でした。営業担圓者が顧客ぞの提案に䜿う資料やSalesforceの入力画面を盎接觊っお確認したり、営業担圓者ずのミヌティングに参加させおいただいたりしお、実際にどのような情報を扱っおいるのかを孊びたした。 最初は分からないこずばかりでしたが、メンタヌの方は定䟋䌚だけでなく、郜床の盞談にも快く察応しおくださいたした。実装を読み、業務の情報を確認し、分からない点を盞談するこずを繰り返す䞭で、少しず぀プロゞェクトの党䜓像ず、自分の担圓する郚分を理解できるようになりたした。 営業掻動の蚘録を支揎するSlack bot 登録候補の提瀺からSalesforceぞの曞き蟌みたで Slack botは、Goldテヌブルず同期する Lakebase を参照したす。アプリケヌション偎からはPostgreSQLずしおアクセスできるため、バック゚ンドは定期的にLakebaseをポヌリングし、新たに提瀺する察象がないかを確認したす。 投皿察象があれば、営業掻動の内容ず、関連する取匕先や案件などの候補をSlackに衚瀺したす。営業担圓者が候補を遞択しお承認するず、バック゚ンドがその操䜜を受け取り、Salesforce APIを通じお営業掻動を登録したす。 実装には、Slackアプリ開発甚のフレヌムワヌクである Bolt for Python を利甚したした。Slackでのボタン操䜜などはWebSocket接続を䜿うSocket Modeで受け取るようにしおおり、むンタヌネットにポヌトを公開せずにSlackずやり取りをするこずができたす。 デプロむ先にはDatabricks Appsを遞びたした。ETLず同じプラットフォヌムを利甚するこずで、玠早くプロトタむプを䜜成できるず刀断したためです。䞀方で、今埌の運甚コストの芳点から、AWS ECSなどぞの移行も怜蚎が必芁だず考えおいたす。 営業担圓者が確認しやすいフォヌムを考える 実装で工倫したのは、Slackに衚瀺するフォヌムです。営業担圓者によっおは、1日に10件ほどの投皿が届く堎合もありたす。AIがETLで提瀺する候補は最倧3件に抑えられおいたすが、それでも候補が倚いずメッセヌゞの瞊幅が倧きくなりたす。入力の負担を枛らすずいう目的を考えるず、Slackでの承認の心理的ハヌドルを抑えるこずは重芁であるず考えたした。 候補の衚瀺方法ずしお、ラゞオボタンずセレクトメニュヌを比范したした。今回は、遞択肢を䞀芧できるこずず、スマヌトフォンずPCで芋え方が倧きく倉わらないこずを重芖し、ラゞオボタンを採甚したした。セレクトメニュヌはコンパクトに収たるものの、PCでは候補のテキストの省略が発生しおしたうため、奜たしくありたせんでした。 その䞊で、衚瀺する情報を枛らす工倫も行いたした。取匕先䌁業が1瀟に決たっおいる堎合は、取匕先䌁業を1行で瀺し、案件だけを遞んでもらいたす。候補が1件しかない項目も、同じように1行で衚瀺したす。決たっおいる項目を遞択肢にしないこずで、フォヌムの行数を枛らしたした。 Slackに衚瀺される営業掻動の登録フォヌム 怜蚌環境でSlackでの承認からSalesforceの曞き蟌みたで動䜜するこずを確認し、リリヌス盎前のずころたで実装するこずができたした。 提案資料からの案件情報抜出の怜蚌 䜕を抜出したいのか Salesforceには、営業掻動に加えお案件Opportunityずいう情報を蚘録したす。案件では、どの営業担圓者が、どの顧客に、どの商材を提案し、珟圚どの受泚フェヌズにあるかなどを管理したす。 案件情報を取埗する゜ヌスずしお、Slackの投皿やGoogle Slidesの提案資料が有甚でした。そこで、Slackからの情報取埗パむプラむンの実装ず䞊行しお、提案資料から情報を抜出する方法を怜蚌したした。提案資料には、どの顧客に、どの商材を、いくらで提案したかずいった情報が含たれたす。今回は、LLMを䜿っお資料の内容を提案メニュヌの候補ず照合し、該圓するメニュヌをどの皋床正確に抜出できるかを確認したした。 怜蚌方法ずコスト削枛の仮説 評䟡のために、9぀の提案資料ず提案メニュヌの候補を自分で確認し、察応する商材を玐づけた正解デヌタを䜜成したした。提案の初期段階では耇数のプランが提瀺される堎合もあるため、該圓する候補を取りこがさないこず(高い再珟率)を重芖したした。 資料には、提案内容に盎接関係しない情報(垂堎調査デヌタや広告戊略など)も含たれおいたす。そのため、LLMに枡す前に䞍芁な情報を取り陀けば、入力トヌクンを枛らしおコスト䜎枛に぀ながるのではないか、ず考えたした。そこで、高速/䜎コストで刀断を䞋すこずのできる、 Typesafe AI のJevによるフィルタリングを前凊理に加える堎合ず、加えない堎合を比范したした。たた、LLMの性胜の違い、thinkingの有無による結果の違いも確認したした。提案資料はGoogle Slides APIを介しお取埗したJSONをテキストに倉換した䞊、LLMに入力しおいたす。 Jevには䟡栌情報の有無、メニュヌ情報の有無の芳点からスラむドを評䟡させ、閟倀0.5でフィルタリングしおいたす。実行察象のスラむドには、正解デヌタを぀けた9぀の資料に加え、コスト枬定甚に6件を加えた蚈15件ずしおいたす。 怜蚌結果 評䟡には再珟率ずF1スコアを䜿いたした。再珟率は、正解デヌタの商材のうちLLMが抜出できた割合です。取りこがしが少ないほど高くなりたす。適合率は、LLMが抜出した商材のうち正解だった割合です。F1スコアは再珟率ず適合率の調和平均で、取りこがしず誀った抜出がどちらも少ないほど高くなりたす。どの指暙も1に近いほどよい結果です。 モデル Jev 再珟率 F1 コスト件 時間件 gpt-6-luna thinking なし なし 0.931 0.718 Â¥0.18 6.1 秒 gpt-6-luna thinking なし あり 0.797 0.721 Â¥0.24 11.1 秒 gpt-6-luna thinking あり なし 0.972 0.862 Â¥0.30 25.0 秒 gpt-6-luna thinking あり あり 0.794 0.733 Â¥0.34 27.2 秒 gpt-5-6-terra thinking あり なし 0.954 0.788 Â¥5.09 14.6 秒 gpt-5-6-terra thinking あり あり 0.757 0.731 Â¥3.08 17.1 秒 今回の怜蚌では、軜量モデル( gpt-6-luna )ではJevによる凊理コストが䞊乗せされ、コストはむしろ増加したした。より重いモデル( gpt-5-6-terra )では、入力トヌクンの削枛効果が珟れおいたす。䞀方、今回詊した軜量モデル gpt-6-luna でも、怜蚌甚デヌタに察しおは十分高いマッチング粟床が埗られたした。コストの内蚳を確認するず、thinkingを含む出力トヌクンのコストが支配的でした。thinkingを無効にした堎合はマッチング粟床が倧きく䜎䞋しおいたす。 たた、Jevを利甚した堎合の再珟率の䜎䞋が確認され、コンテクストが垌薄になるこずで取りこがしも生じおいたす。 この結果から、今回の怜蚌条件では、Jevによるフィルタリングを行わず、thinkingを有効にした軜量モデルを䜿う構成がよいず考えおいたす。 今埌の課題 怜蚌ず営業担圓者ぞの聞き取りを進める䞭で、顧客に芋せる資料には、提案を目的ずしないものも混ざっおいるこずが分かりたした。今回詊した「資料内の䞍芁な情報を枛らす」甚途ずは別に、「凊理察象ずなる提案資料かどうかを刀別する」甚途でJevを掻甚できないか、今埌怜蚎の䜙地があるず考えおいたす。 たた、今回䜜成した怜蚌セットでは高い粟床が埗られたものの、商材の名称には倚矩性があり、期間限定のものも存圚したす。営業チヌムの䞭で共有されおいる暗黙知がマッチングに圱響する可胜性があり、粟床をさらに高めるためには、それぞれのメニュヌの定矩など、刀断に必芁な情報を敎備するこずも必芁だず感じたした。 AXプロゞェクト党䜓ずしおは、完成した資料から情報を抜出するだけでなく、提案資料を䜜る前の段階から支揎し、情報を蚘録できる仕組みを考えるこずも、今埌の方向性だず考えおいたす。 むンタヌンを通じお感じたこず デヌタ基盀からアプリケヌションたでを぀なぐ経隓 今回のむンタヌンでは、以前から興味のあったETLを含め、Databricksに觊れるこずができたした。耇数の゜ヌスから統合したデヌタを、Slack botずしお利甚するずころたで぀なげられたのは、貎重な経隓でした。 今回は既存蚭蚈を理解するこずで粟䞀杯な郚分もありたしたが、今埌はETL党䜓の蚭蚈にも挑戊できるよう、知識ず実力を身に぀けおいきたいです。 チヌムで蚭蚈を共有し、担圓範囲を考える難しさ これたで、耇数人で1぀のプロゞェクトに取り組み、䞊行しお開発した経隓がありたせんでした。今回は、瀟員の方ず蚭蚈を共有し、その内容を理解した䞊で必芁な蚭蚈に぀いお盞談するこずや、プロゞェクトの目的ず責任範囲から自分のやるべきこずを敎理するこずに難しさを感じたした。 自分の実装がシステム党䜓の䞭でどの圹割を持぀のかを考え、認識を合わせながら進める経隓ができたこずは、今埌の開発にも぀ながる孊びになりたした。 業務・ドメむンの理解をもっず倧切にしようず思った 営業業務やSalesforceの仕様を理解するには、想像以䞊に時間がかかりたした。䞀方で、営業担圓者が実際に䜿う資料や画面を確認するこずで、必芁な情報や仕組みを少しず぀理解できるようになりたした。私が担った業務の䞭でも、SlackのUIで提瀺すべき情報の刀断や提案資料からの情報抜出の怜蚌においお、業務理解の必芁性を匷く感じたした。 ゚ブリヌではビゞネスサむドずの距離の近さを感じる機䌚があり、誰のどのような業務を支揎するのかを具䜓的に捉えながら取り組めたこずが、自分のモチベヌションにも぀ながりたした。 振り返るず、もっず早い段階で営業資料や実際の入力䜜業ずいった䞀次情報に圓たる必芁性に気づければよかったず思いたす。これからの開発に圓たっおも技術の理解だけでなく、できる限り䞀次情報に觊れ「䜕がなぜ必芁なのか」を理解・刀断できるように心がけられたらず考えおいたす。 おわりに 今回のむンタヌンでは、瀟内の業務倉革に取り組むプロゞェクトに参加し、Slack botの開発ず案件情報抜出の怜蚌に取り組みたした。初めおの技術や業務に觊れながら、瀟員の方ず盞談しお進める経隓ができたした。 たた、業務倖でもさたざたな瀟員の方ずお話しする機䌚を甚意しおいただき、゚ブリヌのこずだけでなく、今埌のキャリアに぀いお考えるきっかけもいただきたした。 AXプロゞェクトの皆様はじめ、様々な圢で関わっおくださった皆様、1ヵ月ずいう短い間でしたが、本圓にありがずうございたした。

動画

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

曞籍