1
0
Fork 0
mirror of https://github.com/imjasonh/terraform-playground synced 2026-07-08 07:44:57 +00:00
Signed-off-by: Jason Hall <jason@chainguard.dev>
This commit is contained in:
Jason Hall 2024-04-17 21:03:31 -04:00
parent ae6e74d938
commit b2f2f36804
Failed to extract signature
2 changed files with 40 additions and 8 deletions

View file

@ -1,9 +1,13 @@
package main
import (
"context"
"database/sql"
"fmt"
"net/http"
"os"
"os/exec"
"os/signal"
"github.com/chainguard-dev/clog"
_ "github.com/chainguard-dev/clog/gcp/init"
@ -11,16 +15,33 @@ import (
)
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
// Before serving requests, restore the database from the latest replica.
cmd := exec.CommandContext(ctx,
"litestream", "restore",
"-o", "/data/db.sqlite",
fmt.Sprintf("gcs://%s/litestream", os.Getenv("BUCKET")))
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
clog.Fatalf("failed to restore database: %v", err)
}
db, err := sql.Open("sqlite", "/data/db.sqlite")
if err != nil {
clog.Fatalf("failed to open database: %v", err)
}
defer db.Close()
if _, err := db.Exec("create table if not exists test (time text primary key)"); err != nil {
if _, err := db.Exec("create table if not exists test3 (time integer primary key)"); err != nil {
clog.Fatalf("failed to create table: %v", err)
}
http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "no favicon", http.StatusNotFound)
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
row := db.QueryRow("select sqlite_version()")
var version string
@ -28,23 +49,23 @@ func main() {
clog.Fatalf("failed to query database version: %v", err)
}
clog.Infof("sqlite version: %s", version)
fmt.Fprintf(w, "sqlite version: %s", version)
fmt.Fprintf(w, "sqlite version: %s\n", version)
if _, err := db.Exec("insert into test (time) values (datetime('now'))"); err != nil {
if _, err := db.Exec("insert into test3 (time) values (unixepoch('now','subsec'))"); err != nil {
clog.Fatalf("failed to insert row: %v", err)
}
rows, err := db.Query("select * from test")
rows, err := db.Query("select count(*) from test3")
if err != nil {
clog.Fatalf("failed to query rows: %v", err)
}
defer rows.Close()
for rows.Next() {
var time string
if err := rows.Scan(&time); err != nil {
var count int64
if err := rows.Scan(&count); err != nil {
clog.Fatalf("failed to scan row: %v", err)
}
clog.Infof("time: %s", time)
fmt.Fprintf(w, "time: %s\n", time)
clog.Infof("count: %d", count)
fmt.Fprintf(w, "count: %d\n", count)
}
})
http.ListenAndServe(":8080", nil)

View file

@ -37,6 +37,7 @@ resource "google_storage_bucket_iam_binding" "binding" {
resource "ko_build" "build" {
importpath = "./"
working_dir = path.module
base_image = "litestream/litestream"
}
resource "google_cloud_run_v2_service" "service" {
@ -47,13 +48,23 @@ resource "google_cloud_run_v2_service" "service" {
launch_stage = "BETA"
ingress = "INGRESS_TRAFFIC_ALL"
template {
scaling {
max_instance_count = 1
}
max_instance_request_concurrency = 1000
containers {
image = ko_build.build.image_ref
volume_mounts {
name = "data"
mount_path = "/data"
}
env {
name = "BUCKET"
value = google_storage_bucket.bucket.name
}
}
containers {