- TOP
- ã¿ã°äžèЧ
- NestJS
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 ã§ã¯ãã¬ãŒã ã¯ãŒã¯ã« ã°ã¬ãŒã¹ãã«ã·ã£ããããŠã³æ©èœ ãæèŒãããŠããŸãã
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æžç±
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã









