NestJS - TECH PLAY - TECH PLAY

TECH PLAY

NestJS

むベント

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

マガゞン

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

技術ブログ

本蚘事は 2026 幎 7 月 20 日 に公開された「 Connection pooling strategies in Amazon Aurora DSQL 」を翻蚳したものです。 本蚘事では、Aurora DSQL の接続負荷を枛らし、1 秒あたり 100 接続のレヌト制限を超えず、再接続が䞀斉に集䞭する thundering herd を避けるための、具䜓的な 4 ぀の戊略を解説したす。読み終える頃には、倧芏暡でも安定した性胜を発揮する接続プヌルを構成するための、本番運甚に䜿えるチェックリストが手に入りたす。 接続プヌリングの戊略次第で、 Amazon Aurora DSQL アプリケヌションが安定しおスケヌルするか、負荷で砎綻するかが決たりたす。Amazon Aurora DSQL 独自のアヌキテクチャは、接続プヌリングの効果をさらに倧きくしたす。トランザクション単䜍の倚重化ず AWS Identity and Access Management (IAM) による認蚌により、Aurora DSQL では適切なプヌリング戊略が、埓来の PostgreSQL の接続管理では実珟できない圢で性胜を高めたす。 泚: 本蚘事は、PostgreSQL の接続管理の抂念ず基本的な IAM 認蚌を理解しおいるこずを前提ずしおいたす。Amazon Aurora DSQL を初めお䜿う堎合は、これらの戊略を適甚する前に、たず Getting Started ガむド から始めおください。 サヌバヌレス環境での接続プヌリング Amazon Aurora DSQL は運甚の耇雑さを自動的に凊理したすが、それでも接続プヌリングは欠かせたせん。新しい接続のたびに、コストの高い TLS ハンドシェむクず認蚌情報の亀換が発生したす。プヌリングは確立枈みの接続を再利甚し、この負荷を抑えおレむテンシヌを削枛したす。たた、トラフィックが急増するず、1 秒あたり 100 接続 (バヌスト時 1,000) のレヌト制限に達するこずがあり、既存の接続を再利甚すればサヌビスの制限内に安党に収たりたす。さらに、Amazon Aurora DSQL には接続の最倧有効期間があり、クラむアントは 1 時間で切断されたす。適切に構成したプヌルはこの制限に達する前に接続をリサむクルし、セッションを透過的に維持したす。 トランザクション単䜍のプヌリング: アヌキテクチャに組み蟌み枈み Amazon Aurora DSQL はトランザクションプヌリングモデルを採甚しおいたす。接続を Query Processor に割り圓おるのは、セッション党䜓ではなくトランザクションの実行䞭だけです。暙準的な PostgreSQL では、接続はバック゚ンドのサヌバヌプロセスず 1:1 のセッション関係を持続的に維持したす。䞀方 Amazon Aurora DSQL はこの察応関係を切り離すため、少数の Query Processor ではるかに倚くの接続を凊理できたす。 この蚭蚈は、接続の䜿甚率が䜎いこず、぀たりほずんどの接続が倧半の時間アむドル状態であるこずを前提ずしおいたす。䜿甚率が䜎いほど、接続プヌルに必芁な Query Processor は少なくお枈みたす。そのため、PgBouncer や pgpool-II のようなデヌタベヌス偎のプロキシは䜿うべきではありたせん。トランザクション単䜍の接続倚重化がデフォルトで組み蟌たれおいるため、これらのツヌルはサヌビスの接続アヌキテクチャず重耇したす。 さらに、䞀郚の PostgreSQL 機胜はサポヌトされおいたせん。SQL レベルの PREPARE/DEALLOCATE ステヌトメント (ただし拡匵ク゚リプロトコル経由のプリペアドステヌトメントは正垞に動䜜したす)、WITH HOLD カヌ゜ル、セッションレベルのアドバむザリヌロックです。 Amazon Aurora DSQL の 4 ぀の接続プヌリング戊略 以䞋の 4 ぀の戊略は、それぞれ Amazon Aurora DSQL の接続管理の特定の偎面に察応したす。組み合わせお適甚すれば、アプリケヌションがサヌビスの制限内に収たり、負荷がかかっおも安定した性胜を保おたす。新しいアプリケヌションを構築する堎合は戊略 1 から始め、既存の PostgreSQL アプリケヌションを移行する堎合はチェックリストずしお掻甚しおください。 戊略 1: 公匏の AWS コネクタを䜿う 公匏の Amazon Aurora DSQL コネクタ の利甚をお勧めしたす。トヌクンの生成、有効期間の 80% でのキャッシュ、透過的な曎新など、IAM トヌクンのラむフサむクル党䜓を自動的に凊理したす。 衚 1: プログラミング蚀語別の掚奚接続プヌルラむブラリず䞻芁な蚭定パラメヌタ 蚀語 プヌリングラむブラリ 䞻芁な蚭定 Java HikariCP maximumPoolSize Python psycopg ConnectionPool min_size Node.js node-postgres (pg.Pool) max Go pgxpool MaxConns Java (HikariCP) — Spring Boot、Quarkus、Micronaut のアプリケヌションでは HikariCP を䜿いたす。 HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:postgresql://<cluster-endpoint>:5432/<db>?ssl=true&sslmode=verify-full&sslrootcert=<path>"); config.setMaximumPoolSize(20); config.setMaxLifetime(55 * 60 * 1000); // 55 minutes config.setIdleTimeout(10 * 60 * 1000); // 10 minutes config.setConnectionTimeout(30 * 1000); // 30 seconds config.setKeepaliveTime(5 * 60 * 1000); // 5 minutes HikariDataSource ds = new HikariDataSource(config); Python (psycopg ConnectionPool) — Django、Flask、FastAPI のアプリケヌションでは psycopg ConnectionPool を䜿いたす。 from psycopg_pool import ConnectionPool pool = ConnectionPool( conninfo="host=<endpoint> dbname=<db> sslmode=verify-full", min_size=2, max_size=20, max_lifetime=55 * 60, # 55 minutes in seconds max_idle=10 * 60, # 10 minutes idle timeout reconnect_timeout=30, # 30 seconds to reconnect ) Node.js (node-postgres) — Express.js、NestJS、サヌバヌレスの Node.js 関数では node-postgres の Pool を䜿いたす。 const { Pool } = require("pg"); const pool = new Pool({ host: "<cluster-endpoint>", database: "<db>", ssl: { rejectUnauthorized: true }, max: 20, idleTimeoutMillis: 10 * 60 * 1000, // 10 minutes connectionTimeoutMillis: 30 * 1000, // 30 seconds }); Go (pgxpool) — Gin、Echo、AWS Lambda Go ランタむムで構築する Go アプリケヌションでは pgxpool を䜿いたす。 connStr := "host=<cluster-endpoint> dbname=<db> sslmode=verify-full" config, _ := pgxpool.ParseConfig(connStr) config.MaxConns = 20 config.MinConns = 2 config.MaxConnLifetime = 55 * time.Minute // 55 minutes config.MaxConnIdleTime = 10 * time.Minute // 10 minutes idle pool, _ := pgxpool.NewWithConfig(ctx, config) AWS Lambda: プヌルはハンドラヌの倖でむンスタンス化する AWS Lambda は Aurora DSQL のワヌクロヌドでよく䜿われるコンピュヌティングサヌビスです。Lambda の実行モデルには特有のプヌリングパタヌンが必芁です。接続プヌルをモゞュヌルスコヌプ (ハンドラヌ関数の倖) で䜜成し、同じ実行環境のりォヌム呌び出し間で保持されるようにしたす。 Lambda が実行環境を再利甚するず、モゞュヌルスコヌプで䜜成したプヌルはアクティブなたた残りたす。以降の呌び出しでは TLS ハンドシェむクず IAM トヌクンの亀換を完党にスキップできたす。コヌルドスタヌト時にはプヌルが䞀床だけ初期化され、その環境が存続する間は再利甚されたす。 同時に実行される各 Lambda 呌び出しはそれぞれ独立した実行環境で動くため、プヌルも個別に持ちたす。倚数の同時実行にわたっお接続を過剰に確保しないよう、プヌルサむズは小さく (Lambda むンスタンスあたり 1〜3 接続) 保っおください。 Lambda の䞻なガむドラむン: プヌルはハンドラヌの倖でむンスタンス化する。これが最も重芁なルヌルです。 最倧プヌルサむズを 1〜3 に蚭定する。各 Lambda むンスタンスは (バッファ呌び出しを䜿わない限り) 䞀床に 1 リク゚ストしか凊理しないため、倧きなプヌルは無駄になりたす。 アむドルタむムアりトを蚭定しない。接続は実行環境が存続する間ずっず維持させたす。 Lambda 以倖のワヌクロヌドず同様に、1 時間のハヌド制限に達しないよう、最倧有効期間を 55 分にしおゞッタヌを加える。 コヌルドスタヌトのレむテンシヌを考慮する。最初の呌び出しでは TLS ず IAM 認蚌の負荷が発生したす。以降のりォヌム呌び出しではプヌルされた接続を再利甚したす。 Python (psycopg ConnectionPool) — Lambda # pool is created ONCE at module scope, reused across warm invocations from psycopg_pool import ConnectionPool import boto3 pool = ConnectionPool( conninfo="host=<cluster-endpoint> dbname=<db> sslmode=verify-full", min_size=1, max_size=2, max_lifetime=55 * 60, # 55 minutes reconnect_timeout=30, ) def handler(event, context): """Lambda handler — pool is already initialized.""" with pool.connection() as conn: result = conn.execute("SELECT * FROM orders WHERE id = %s", [event["order_id"]]) return result.fetchone() Node.js (node-postgres) — Lambda // Pool is created ONCE at module scope, reused across warm invocations const { Pool } = require("pg"); const pool = new Pool({ host: "<cluster-endpoint>", database: "<db>", ssl: { rejectUnauthorized: true }, max: 2, // small pool per Lambda instance idleTimeoutMillis: 0, // don't close idle connections connectionTimeoutMillis: 30 * 1000, // 30 seconds }); exports.handler = async (event) => { // Pool is already warm on subsequent invocations const client = await pool.connect(); try { const result = await client.query("SELECT * FROM orders WHERE id = $1", [event.orderId]); return result.rows[0]; } finally { client.release(); } }; Go (pgxpool) — Lambda package main import ( "context" "time" "github.com/aws/aws-lambda-go/lambda" "github.com/jackc/pgx/v5/pgxpool" ) // Pool created at package scope — initialized once per execution environment var pool *pgxpool.Pool func init() { connStr := "host=<cluster-endpoint> dbname=<db> sslmode=verify-full" config, _ := pgxpool.ParseConfig(connStr) config.MaxConns = 2 config.MinConns = 1 config.MaxConnLifetime = 55 * time.Minute config.MaxConnLifetimeJitter = 5 * time.Minute pool, _ = pgxpool.NewWithConfig(context.Background(), config) } func handler(ctx context.Context, event map[string]string) (string, error) { row := pool.QueryRow(ctx, "SELECT name FROM orders WHERE id = $1", event["order_id"]) var name string err := row.Scan(&name) return name, err } func main() { lambda.Start(handler) } ヒント: Lambda 関数の同時実行数が倚い堎合 (数癟の同時実行)、各実行環境がそれぞれプヌルを䜜成したす。最倧プヌルサむズ 2 で 500 の Lambda が同時実行されるず、Aurora DSQL ぞの接続は最倧 1,000 になり埗たす。接続の総数を監芖し、クラスタヌあたり 10,000 同時接続のクォヌタ内に収めおください。 重芁: クラむアント接続には sslmode=verify-full を蚭定し、蚌明曞を完党に怜蚌しお経路䞊の攻撃 (on-path attack) を防ぎたす。Aurora DSQL は verify-ca や require ずいった匱いモヌドでも接続を受け付けたすが、これらはサヌバヌの正圓性を怜蚌したせん。 安定した接続プヌルを維持するには、IAM トヌクンのラむフサむクルの理解が重芁です。 新しい接続ごずに、新しい IAM 認蚌トヌクンを生成したす。トヌクンの生成はロヌカルでの眲名操䜜で、負荷はごくわずかです。公匏の AWS コネクタはこれを自動的に凊理したす。独自のプヌルを䜿う堎合は、トヌクンを手動でキャッシュするのではなく、接続ファクトリの beforeConnect フックで generate-db-connect-auth-token コマンドを呌び出しおください。 トヌクンは、基ずなる IAM 認蚌情報より長くは有効になりたせん。1 時間のセッションでロヌルを匕き受けた堎合、 --expires-in の倀に関係なく、トヌクンは最倧でも 1 時間で倱効したす。 デヌタベヌスロヌルは最小暩限に絞る。 IAM 認蚌は誰が接続できるかを制埡したすが、接続埌にそのセッションが䜕をできるかは制限したせん。各アプリケヌションのデヌタベヌスロヌルには、必芁な最小限の暩限だけを付䞎したす。たずえば、読み取り専甚のサヌビスには SELECT を付䞎し、曞き蟌みアクセスは特定のスキヌマやテヌブルに限定したす。アプリケヌションの接続プヌルで管理者ロヌルを䜿うのは避けおください。 手順の詳现は、 Authorizing database roles to use SQL in your database を参照しおください。 戊略 2: 最倧接続有効期間にゞッタヌを蚭定しお接続の倱効を防ぐ Amazon Aurora DSQL には、1 時間ずいう接続の最倧有効期間のハヌド制限がありたす。接続がこの期間に達するず、アむドル䞭でもトランザクションの途䞭でも、サヌビスはその接続を閉じたす。プヌルはそうなる前に接続をリサむクルする必芁がありたす。 ゞッタヌが重芁な理由: プヌル内のほずんどの接続がほが同じタむミング (たずえばアプリケヌションの起動時) に䜜成された堎合、それらはほが同時に倱効したす。するず新しい接続リク゚ストが䞀斉に集䞭する「thundering herd」が発生し、1 秒あたり 100 接続のレヌト制限を超えるこずがありたす。最倧有効期間にランダムなゞッタヌを加えるず、接続のリサむクルが時間的に分散されたす。 // Go (pgxpool) — Use native per-connection jitter config.MaxConnLifetime = 55 * time.Minute config.MaxConnLifetimeJitter = 5 * time.Minute // Each connection independently gets a lifetime between 55-60 minutes // Java (HikariCP): maxLifetime already applies per-connection jitter automatically // Python: use max_lifetime with a randomized offset in your pool factory 期埅される結果: 接続のリサむクルが個々の接続にわたっお時間的に均等に分散し、新しい接続リク゚ストが 1 秒あたり 100 のレヌトクォヌタを十分に䞋回った状態を保おたす。 戊略 3: プヌルサむズを最適化する Amazon Aurora DSQL は倚数の同時接続でも高い性胜を発揮したすが、スルヌプット、レむテンシヌ、リ゜ヌス消費のバランスをずれるようにプヌルサむズを蚭定する必芁がありたす。 衚 3: 接続プヌルのサむズ蚭定パラメヌタの掚奚初期倀 パラメヌタ 掚奚初期倀 理由 最小プヌルサむズ 2〜5 接続 䜎負荷時にリ゜ヌスを無駄にせず、プヌルをりォヌムに保぀ 最倧プヌルサむズ アプリケヌションむンスタンスあたり 10〜20 控えめに始める。アプリケヌションむンスタンスを远加しおスケヌルアりトする 接続タむムアりト 30 秒 トラフィックが倚いむベント䞭に、DSQL の接続バヌストキュヌ (100/秒) を消化できるようにする アむドルタむムアりト 無効 (たたは MaxConnLifetime に合わせる) アむドル接続にコストはかからない。開いたたたにしおおけば、再接続時の䞍芁な TLS/認蚌の負荷を避けられる Amazon CloudWatch で DPU (Distributed Processing Unit) の消費を監芖し、容量の远加が必芁なタむミングを把握したす。トラフィックの急増が予想される堎合 (スケゞュヌルされたバッチゞョブやマヌケティングキャンペヌンなど) は、事前にプヌルをりォヌムアップしおおきたす。むンスタンスあたりの接続数を増やすのではなく、小さめのプヌルを持぀アプリケヌションむンスタンスを増やしお氎平方向にスケヌルアりトしたす。Amazon Aurora DSQL は、短期的な負荷増加には垂盎スケヌリングで、長期的な倉動にはフリヌト党䜓の氎平スケヌリングで察応したす。クラスタヌあたり 10,000 同時接続のクォヌタを掻甚し、必芁であれば AWS Support に連絡しお䞊限を匕き䞊げおください。 期埅される結果: ワヌクロヌドに合わせおプヌルが適切にサむズ蚭定され、接続の負荷ずプヌル枯枇゚ラヌの䞡方を最小限に抑えられたす。 戊略 4: マルチリヌゞョンでのプヌリングの考慮事項 Amazon Aurora DSQL のマルチリヌゞョン active-active デプロむを䜿うグロヌバル分散アプリケヌションでは、接続プヌリングにもう䞀段の怜蚎が必芁です。 このサヌビスのマルチリヌゞョンアヌキテクチャでは、SQL の実行、読み取り、曞き蟌みのスプヌリングをクラむアントのリヌゞョン内でロヌカルに凊理したす。リヌゞョン間の通信は、コミット時に Adjudicator ず Journal のレプリケヌションプロトコルを通じおのみ発生したす。マルチリヌゞョンモヌドでも読み取りはロヌカルなので、読み取り専甚トランザクションはリヌゞョン間のレむテンシヌなしで完了したす。読み曞きトランザクションでリヌゞョン間レむテンシヌが発生するのは COMMIT 時のみで、実行した SQL ステヌトメントの数に関係なく、リヌゞョン間のラりンドトリップ玄 1〜1.5 回分です。各ステヌトメントごずにラりンドトリップが発生する転送ベヌスの蚭蚈ず比べ、レむテンシヌを削枛できたす。リヌゞョンの遞択も重芁です。接続性の良いリヌゞョンの組み合わせほどコミットレむテンシヌが䜎く、地理的に離れた組み合わせほどそれに比䟋しお倧きくなりたす。 マルチリヌゞョンでのプヌリングでは、リヌゞョンごずに個別の接続プヌルを䜜成し、それぞれロヌカルの Amazon Aurora DSQL ゚ンドポむントを指すようにしたす。トヌクン曎新のロゞックがリヌゞョンごずの IAM ゚ンドポむントを考慮しおいるこずを確認しおください。アプリケヌションは active-active アクセスを前提に蚭蚈したす。このサヌビスにはプラむマリリヌゞョンずいう抂念がなく、各リヌゞョンは察称的に動䜜したす。 期埅される結果: リヌゞョン間レむテンシヌはコミット時にのみ発生し、読み取りはロヌカルリヌゞョンの速床で完了したす。 オブザヌバビリティ: デヌタベヌスだけでなく接続プヌルも監芖する Aurora DSQL の CloudWatch メトリクス (TotalTransactions や CommitLatency など) はデヌタベヌスレベルの挙動を瀺したすが、接続プヌルがボトルネックかどうかたではわかりたせん。プヌルの健党性を把握するには、アプリケヌション偎に蚈枬を組み蟌む必芁がありたす。次に挙げるクラむアント偎のメトリクスが、接続プヌリングの問題を捉える重芁なシグナルです。 アプリケヌションに組み蟌むべきメトリクス メトリクス 瀺す内容 アラヌトのしきい倀 発生時のアクション プヌル取埗レむテンシヌ (.get() の所芁時間) プヌルから接続を取埗するたでアプリケヌションが埅぀時間 P95 > 500 ms プヌルが飜和しおいる。最倧プヌルサむズを増やすか、アプリケヌションむンスタンスをスケヌルアりトする アクティブ接続数 珟圚トランザクションを実行䞭の接続数 最倧プヌルサむズに匵り付いおいる すべおの接続が䜿甚䞭。プヌルサむズを増やすか、トランザクションの実行時間を短くする アむドル接続数 プヌル内で䜿われおいない接続の数 0 のたた匵り付いおいる トラフィックのバヌストに察する䜙裕がない。最小プヌルサむズを増やすか、急増が予想される前にりォヌムアップする リク゚ストの同時実行数 察 プヌルサむズ 凊理䞭の同時リク゚スト数ず最倧プヌルサむズの比率 同時実行数が最倧プヌルサむズの 80% を超える プヌル枯枇に近づいおいる。スケヌルアりトするか、プヌルサむズを増やす プヌル枯枇むベント 利甚可胜な接続を埅っお接続リク゚ストがタむムアりトした回数 > 0 盎ちに察応が必芁。プヌルサむズを増やす、トランザクションの実行時間を短くする、たたはアプリケヌションむンスタンスを远加する 接続䜜成レヌト プヌルが 1 秒あたりに開く新芏接続の数 100/秒 に近づく Aurora DSQL のレヌト制限に達するリスクがある。ゞッタヌを加える、むンスタンスの起動をずらす、たたは最小プヌルサむズを増やしお接続の入れ替わりを枛らす ほずんどの接続プヌルラむブラリは、これらの統蚈をネむティブに公開しおいたす。 Java (HikariCP): HikariPoolMXBean を䜿っお getActiveConnections() 、 getIdleConnections() 、 getThreadsAwaitingConnection() 、 getTotalConnections() にアクセスしたす。Micrometer 経由で CloudWatch やアプリケヌションパフォヌマンスモニタリング (APM) ツヌルに゚クスポヌトしたす。 Python (psycopg ConnectionPool): pool.get_stats() を䜿いたす。 pool_min 、 pool_max 、 pool_size 、 pool_available 、 requests_waiting 、 requests_num を返したす。 Node.js (node-postgres): pool.totalCount 、 pool.idleCount 、 pool.waitingCount に盎接アクセスしたす。䞀定間隔で、たたはリク゚ストごずに出力したす。 Go (pgxpool): pool.Stat() を䜿いたす。 AcquireCount() 、 AcquiredConns() 、 IdleConns() 、 TotalConns() 、 AcquireDuration() を提䟛したす。 これらはカスタム CloudWatch メトリクスずしお発行するか ( PutMetricData API たたはログ内の CloudWatch Embedded Metric Format を䜿甚)、既存の APM ツヌル (AWS X-Ray、Datadog、Prometheus/Grafana など) に送信したす。 補足: Aurora DSQL の CloudWatch メトリクス 䞻芁なシグナルはクラむアント偎のメトリクスであるべきですが、プヌルサむズを決めるうえで圹立぀ Aurora DSQL のメトリクスが 1 ぀ありたす。 メトリクス プヌリングに圹立぀理由 TotalTransactions プヌル取埗レむテンシヌず関連付けお芋たす。トランザクションが増えおいるのに取埗レむテンシヌが暪ばいなら、プヌルサむズは適切です。䞡方が増えおいるなら、容量の远加が必芁です。 よくある接続プヌルの問題のトラブルシュヌティング アラヌトが発生したら、この衚を䜿っお最もよくある障害シナリオを蚺断し、察凊しおください。 衚 5: よくある Amazon Aurora DSQL 接続プヌル問題のトラブルシュヌティングガむド 症状 考えられる原因 蚺断ステップ 察凊 プヌル枯枇 (接続タむムアりト゚ラヌ) トラフィックに察しお maxPoolSize が䜎すぎる アクティブ接続ずアむドル接続を比范しお監芖する 最倧プヌルサむズを増やすか、アプリケヌションむンスタンスを远加する 箄 55 分埌の認蚌倱敗 トヌクンの倱効が凊理されおいない トヌクン曎新のログを確認する 公匏コネクタを䜿っおいるか確認する。MaxConnLifetime の蚭定を確認する 新芏接続レヌトの゚ラヌ 起動時の thundering herd 接続䜜成のタむムスタンプを確認する MaxConnLifetime にゞッタヌを加える。アプリケヌションむンスタンスの起動をずらす クむックリファレンス: 䞻芁な制限ず蚭定 接続の有効期間、トランザクションタむムアりト、接続レヌト、同時実行数などの最新の制限に぀いおは、 Cluster quotas and database limits を参照しおください。 たずめ 本蚘事では、Amazon Aurora DSQL のトランザクション単䜍のプヌリングモデルが埓来の PostgreSQL ずどう違うかを解説したした。たた、コネクタの遞択からマルチリヌゞョンでのプヌリングたで、アプリケヌションの性胜ず回埩力を保぀ための具䜓的な 4 ぀の戊略も玹介したした。PgBouncer や pgpool-II のようなデヌタベヌス偎のプロキシは䜿わないでください。このサヌビスはトランザクション単䜍の倚重化をネむティブに凊理したす。マルチリヌゞョンのデプロむでは、リヌゞョン間レむテンシヌがコミット時にのみ発生するこずを芚えおおいおください。トランザクションはロヌカルの読み曞きを掻かせるように蚭蚈したしょう。 これらの戊略に埓えば、アプリケヌションは Amazon Aurora DSQL の自動スケヌリング、匷敎合性、高可甚性を最倧限に掻甚できたす。接続の負荷を最小限に抑え、倧芏暡でもレむテンシヌを予枬可胜に保おたす。 著者に぀いお Tejas Dubey Tejas は、 Tejas は AWS のテクニカルアカりントマネヌゞャヌで、゚ンタヌプラむズのお客様が回埩力ずセキュリティに優れ、AI 察応のクラりドアヌキテクチャを構築できるよう支揎しおいたす。新しいテクノロゞヌを実際のビゞネス䟡倀に倉えるこずに情熱を泚いでいたす。仕事を離れおいるずきは、息子を远いかけたり、ピックルボヌルをしたり、最新のテクノロゞヌをいじったりしおいたす。 Dhvani Shah Dhvani は、 Dhvani はテクニカルアカりントマネヌゞャヌで、クラりドの回埩力、セキュリティ、生成 AI の導入に関する戊略的なガむダンスで゚ンタヌプラむズのお客様を支揎しおいたす。デゞタルトランスフォヌメヌションを加速する、スケヌラブルで安党な゜リュヌションの蚭蚈を支揎しおいたす。仕事以倖では、旅行やバドミントン、家族ず過ごす時間を楜しんでいたす。 この蚘事は Kiro が翻蚳を担圓し、Solutions Architect の Arisa Izuno がレビュヌしたした。
はじめに 2026幎5月28〜29日、ギリシャ・アテネで開催された Tech-X 2026 Hackathon #9 に参加し、3䜍に入賞するこずができたした 今回持ち蟌んだテヌマは「Policy and Credential-Aware A2A Skill Invocation on Gaia-X Danube」です。ひずこずで蚀うず、AI Agent 同士が A2A プロトコルを甚いお胜力Skillを呌び出し合うずきに、その呌び出しが契玄・クレデンシャル・利甚条件にきちんず埓っおいるかを、Gaia-X Danube の Trust Framework参加者やサヌビスの信頌
プログラミング蚀語を遞ぶずき、開発効率や孊習コスト、゚コシステムの充実床など、考慮すべき芁玠は倚岐にわたりたす。OSS パッケヌゞを暙的にしたサプラむチェヌン攻撃の増加や脆匱性に察するれロデむ攻撃の発生ずいった状況を螏たえるず、「アプリケヌションが䟝存するラむブラリをどう管理するか」も技術遞定の重芁な軞ずなっおいたす。 私の所属する Control Plane 郚の認蚌認可グルヌプでは、2025幎から、 Go の利甚を本栌化したした。技術遞定時に挙げられおいたメリットの䞀぀が、たさに䟝存管理にありたす。 本蚘事では、私たちが Go を遞んだ背景ず、1幎間実際に開発しおみお分かったこずを振り返りたす。 なぜ Go を遞んだか 察象システムの特性 キャディの䞻流蚀語: TypeScript Go の特城 1幎間やっおみおどうだったか 良かった点 メンテナンスコストの䜎さ AIコヌディングずの盞性 苊劎した点 ラむブラリに頌らないこずのトレヌドオフ Go の慣習に慣れるたでのコスト 期埅ず珟実のギャップ 採甚した技術スタック たずめ なぜ Go を遞んだか 察象システムの特性 キャディでは、補造業AIデヌタプラットフォヌムCADDi の基盀ずしお「Control Plane」ず呌ばれるシステム矀を開発しおいたす。Control Plane は、テナント管理や認蚌認可など、アプリケヌションの機胜から独立した管理局を担うシステムです。詳しくは こちらの蚘事 で玹介しおいたす。 開発蚀語を遞ぶにあたっお重芁だったのは、Control Plane が持぀特性です。Control Plane は、1぀の倧きなサヌビスではなく、認蚌ゲヌトりェむ、トヌクン発行、テナント管理、認可ずいった、それぞれが明確な責務を持぀小さなサヌビスの集合䜓です。各サヌビスはシンプルな機胜を提䟛する䞀方で、プラットフォヌム基盀ずしおの信頌性が求められたす。 ぀たり、「小さなサヌビスを倚数、手堅く䜜れるこず」が蚀語遞定においお重芁な芁件でした。 キャディの䞻流蚀語: TypeScript キャディのバック゚ンドでは TypeScript が䞻流です。TypeScript の開発゚コシステムの充実床は矀を抜いおいたす。 たた、フロント゚ンドずバック゚ンドを同じ蚀語で統䞀できるのも倧きなメリットです。 䞀方で、䟝存管理の芳点では、ラむブラリの数が増えがちで、䟝存管理のコストが増倧したす。 Go の特城 Go は Web API の構築に向いた蚀語です。暙準ラむブラリもサヌドパヌティのラむブラリもシンプルなものが倚く、必芁なパヌツを組み合わせお開発するようなスタむルを取りやすいです。 こうした特性が、小さなサヌビスを数倚く開発・運甚する Control Plane ずよくマッチするず刀断したした。 1幎間やっおみおどうだったか 良かった点 メンテナンスコストの䜎さ Go を採甚しお最も良かったず感じおいるのは、メンテナンスコストの䜎さです。 Control Plane のアプリケヌションは、䞀床䜜った埌は数ヶ月単䜍で改修が入らないこずも珍しくありたせん。そのような堎合でも、セキュリティアップデヌトは定期的に適甚する必芁がありたす。このような䜜業は1぀1぀は小さくおも、積み重なるず倧きな負担になりたす。 Control Plane には、Go採甚以前から開発・運甚されおいる TypeScriptNestJSアプリケヌションがありたすが、これず比范しお Go アプリケヌションはセキュリティアップデヌトが必芁になる頻床が䜎いず感じおいたすおよそ1/5皋床。 AIコヌディングずの盞性 Claude Code や Devin を甚いたAIコヌディングはキャディ瀟内でも䞻流ずなっおいたすが、構文がシンプルで曞き手による差異が生じづらい Go は、AIが読み曞きしやすいずいう点でもメリットがありたす。たた、コヌドフォヌマッタヌ go fmt やテストランナヌ go test が暙準のツヌルチェむンに組み蟌たれおいお、か぀、高速に動䜜するずいう点も Go の匷みです。 苊劎した点 ラむブラリに頌らないこずのトレヌドオフ Go では䟝存ラむブラリを少なく保っお開発するこずができたす。これは裏を返せば、基本的な凊理を自前で実装する必芁があるずいうこずです。䟋えば、以䞋のコヌドではサヌバのグレヌスフルシャットダりンを行なっおいたす。 ctx, stop := signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM) defer stop() go func () { // e は Echo むンスタンス if err := e.Start( ":" + c.Port); err != nil && !errors.Is(err, http.ErrServerClosed) { slog.Error(fmt.Sprintf( "error occurred when starting the server: %v" , err)) } }() ... <-ctx.Done() ctx, cancel := context.WithTimeout(ctx, 10 *time.Second) defer cancel() if err := e.Shutdown(ctx); err != nil { slog.Error(fmt.Sprintf( "error occurred when shutting down the server: %v" , err)) } このような、他の蚀語であればフレヌムワヌクが担っおくれるような凊理も自分たちで曞く必芁がありたした *1 。 䟝存の少なさず自前実装の手間は、トレヌドオフの関係にありたす。私たちはこのトレヌドオフを意図的に受け入れたした。長期的な運甚コストの䜎さのほうが、初期の実装コストより重芁だず刀断したからです。 Go の慣習に慣れるたでのコスト チヌムメンバヌの倚くは Go での開発経隓がそれほど倚くありたせんでした。Go 特有の慣習やむディオム ── たずえば゚ラヌハンドリングの䜜法や、パッケヌゞ構成の考え方 ── に慣れるたでには時間がかかりたした。蚀語仕様の孊習コストは䜎くおも、「Go らしいコヌド」がわかるようになるたでには別のハヌドルがありたす。 期埅ず珟実のギャップ Go の採甚にあたっおは、goroutine による䞊行凊理のしやすさにも期埅しおいたした。しかし、珟時点では䞊行凊理を積極的に掻甚する堎面はただありたせん。珟圚の Control Plane のサヌビス矀は、兞型的なリク゚スト/レスポンス型の API が䞭心であり、goroutine の恩恵を実感する局面がただ蚪れおいないのが実情です。 今埌、バッチ凊理や非同期ワヌカヌのようなワヌクロヌドが増えおきた際に、この特性が掻きおくるず考えおいたす。 採甚した技術スタック Goコミュニティにおいお実瞟のある技術スタックの䞭で、薄めのものを遞定したした。 通信: Connect フレヌムワヌク: Echo ※アプリケヌションによっおはフレヌムワヌク無しの堎合も ORM: Bun JWT: lestrrat-go/jwx いずれも優れたラむブラリですが、特に Connect は玠の gRPC に比べおデバッグしやすく、重宝しおいたす。 たずめ Go は䞇胜な蚀語ではありたせん。䟋えば、Go の特城の䞀぀である明瀺的な゚ラヌ凊理は、コヌドの冗長さず衚裏䞀䜓です。しかし、小さなサヌビスを数倚く開発・運甚する Control Plane においおは、Go のシンプルさが匷みになりたした。 技術遞定は垞に文脈次第であり、私たちの経隓がそのたた他の組織に圓おはたるずは限りたせん。それでも、「Control Planeを Go で䜜る」ずいう遞択は、私たちにずっお正しかったず考えおいたす。 今埌も Go を掻甚しながら Control Plane を拡充し、CADDi のマルチテナントプラットフォヌムをより堅牢なものにしおいきたす。 Go を䜿った Control Plane の開発に興味がある方は、ぜひ以䞋のペヌゞもご芧ください。 caddi.tech tech.caddi.com *1 : このサンプルコヌドは Echo v4 です。Echo v5 ではフレヌムワヌクに グレヌスフルシャットダりン機胜 が搭茉されおいたす。

動画

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

曞籍

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

おすすめマガゞン

蚘事の写真

AIに任せる範囲ず人が匕き受ける刀断、PayPayカヌド審査システムの蚭蚈珟堎

蚘事の写真

AIがコヌドを曞く時代、人間は䜕を保蚌するのか───銬堎さんず考える、開発者に求められる新しい責任ず䟡倀

蚘事の写真

仕様曞通りに実装したのに「そうじゃない」ず蚀われる理由───ミノ駆動さんが語る”前提を疑うための認知の芖点”

新着動画

蚘事の写真

【3分解説】囜産AI「Sarashina」6぀のモデルで䜕ができる

蚘事の写真

「ただ出せない」が続くのはなぜ゚ンゞニアの仕事の進め方、完成床の芋極め方を「おい、ずりあえず終わらせろ」著者・nwii...

蚘事の写真

【解説】文章を生成しない最新AI「Jev」ずは ClaudeやChatGPTず䜕が違うTypeSafe AIの刀断専...