Bu örnekte, MySQL veritabanına veri eklemek için bir AWS Lambda işlevi kullanacağız. Buradaki ana nokta, aynı bağlantıyı yeniden kullanmak için özel bir şey yapmanız gerekmediğini (buradan okuyun) kanıtlamaktır, ancak kritik nokta, bağlantıyı kodda manuel olarak kapatmamaktır.


Önkoşul


lambda isminde bir veritabanı ve request tablosu yaratın.


Lambda


MySQL sunucum, ana bilgisayar işletim sisteminde bir docker konteyner olarak çalışıyor, bu nedenle aşağıdaki DSN'i kullanıyorum.


package main

import (
"context"
"database/sql"
"log"
"time"

"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/lambdacontext"

_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func init() {
var err error
db, err = sql.Open("mysql", "root:root@tcp(host.docker.internal:3306)/lambda")
if err != nil {
log.Fatalln(err)
}

// Do not use this!
// defer db.Close()
}

func main() {
lambda.Start(handle)
}

func handle(ctx context.Context) error {
lc, _ := lambdacontext.FromContext(ctx)

qry := `INSERT INTO request (uuid, created_at) VALUES (?, ?)`

if _, err := db.ExecContext(ctx, qry, lc.AwsRequestID, time.Now().UTC()); err != nil {
return err
}

return nil
}

Kurulum


$ GOOS=linux CGO_ENABLED=0 go build -ldflags "-s -w" -o main main.go

zip lambda.zip main

aws --profile localstack --endpoint-url http://localhost:4566 lambda create-function \
--function-name test-lambda \
--handler main \
--runtime go1.x \
--role test-role \
--zip-file fileb://lambda.zip

Test


Değişiklikleri izlemek için MySQL sunucusunda aşağıdaki sorguları kullanabilirsiniz. Sonuçlar aşağıdaki çıktılara benzeyecektir.


mysql> SHOW PROCESSLIST;
+-----+------+------------------+----------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+------------------+----------+---------+------+----------+------------------+
| 4 | root | 172.23.0.1:55642 | lambda | Sleep | 11 | | NULL |
| 5 | root | 172.23.0.1:55646 | NULL | Sleep | 21 | | NULL |
| 305 | root | localhost | lambda | Query | 0 | starting | SHOW PROCESSLIST |
+-----+------+------------------+----------+---------+------+----------+------------------+
4 rows in set (0.00 sec)

mysql> SHOW STATUS WHERE `variable_name` = 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 8 |
+----------------------+-------+
1 row in set (0.01 sec)

mysql> SHOW STATUS WHERE `variable_name` = 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 4 |
+-------------------+-------+
1 row in set (0.01 sec)

Bu, Lambda işlevini 1000 kez çalıştıracaktır. Çalıştırırken yukarıdaki sorgu sonuçlarını takip edin.


$ for ((i=1;i<=1000;i++)); do aws --profile localstack --endpoint-url http://localhost:4566 lambda invoke --function-name test-lambda lambda.json; done