Skip to content

Commit dd820ea

Browse files
committed
Add Cloud Run for GCP CI env
1 parent 98b495a commit dd820ea

File tree

16 files changed

+314
-29
lines changed

16 files changed

+314
-29
lines changed

cmd/gcp/Dockerfile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,8 @@ RUN go build -o bin/sctfe-gcp ./cmd/gcp
2020
# Build release image
2121
FROM alpine:3.20.2@sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3910ef9ab5fbe9f5
2222

23-
COPY --from=builder /build/bin/sctfe-gcp /bin/sctfe-gcp
23+
# TODO: Extract this into another Dockerfile
24+
# Copy the testdata/fake-ca.cert
25+
COPY --from=builder /build/bin/sctfe-gcp /build/testdata/fake-ca.cert /bin/
26+
2427
ENTRYPOINT ["/bin/sctfe-gcp"]

deployment/live/gcp/ci/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# GCP SCTFE CI Environment

deployment/live/gcp/ci/terragrunt.hcl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
terraform {
2+
source = "${get_repo_root()}/deployment/modules/gcp//conformance"
3+
}
4+
5+
locals {
6+
env = "ci"
7+
base_name = "${local.env}-conformance"
8+
server_docker_image = "us-central1-docker.pkg.dev/${include.root.locals.project_id}/docker-${local.env}/conformance-gcp:latest"
9+
}
10+
11+
include "root" {
12+
path = find_in_parent_folders()
13+
expose = true
14+
}
15+
16+
inputs = merge(
17+
local,
18+
include.root.locals,
19+
)

deployment/live/gcp/terragrunt.hcl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
locals {
2+
env = path_relative_to_include()
3+
project_id = get_env("GOOGLE_PROJECT", "phboneff-dev")
4+
location = get_env("GOOGLE_REGION", "us-central1")
5+
base_name = get_env("TESSERA_BASE_NAME", "${local.env}-static-ct")
6+
}
7+
8+
remote_state {
9+
backend = "gcs"
10+
11+
config = {
12+
project = local.project_id
13+
location = local.location
14+
bucket = "${local.project_id}-${local.base_name}-terraform-state"
15+
prefix = "terraform.tfstate"
16+
17+
gcs_bucket_labels = {
18+
name = "terraform_state_conformance"
19+
}
20+
}
21+
}

deployment/live/gcp/test/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# GCP SCTFE Configs
1+
# GCP SCTFE Local Test Environment
22

33
## Prerequisites
44
You'll need to have a VM running in the same GCP project that you can SSH to,
@@ -31,7 +31,7 @@ Set the required environment variables:
3131
```bash
3232
export GOOGLE_PROJECT={VALUE}
3333
export GOOGLE_REGION={VALUE} # e.g: us-central1
34-
export TESSERA_BASE_NAME={VALUE} # e.g: staticct
34+
export TESSERA_BASE_NAME={VALUE} # e.g: test-static-ct
3535
```
3636

3737
Terraforming the project can be done by:
Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,18 @@
11
terraform {
2-
source = "${get_repo_root()}/deployment/modules/gcp//conformance"
2+
source = "${get_repo_root()}/deployment/modules/gcp//test"
33
}
44

55
locals {
6-
project_id = get_env("GOOGLE_PROJECT", "phboneff-dev")
7-
location = get_env("GOOGLE_REGION", "us-central1")
8-
base_name = get_env("TESSERA_BASE_NAME", "tessera-staticct")
6+
env = "test"
7+
base_name = get_env("TESSERA_BASE_NAME", "${local.env}-static-ct")
98
}
109

11-
inputs = local
12-
13-
remote_state {
14-
backend = "gcs"
15-
16-
config = {
17-
project = local.project_id
18-
location = local.location
19-
bucket = "${local.project_id}-${local.base_name}-terraform-state"
20-
prefix = "terraform.tfstate"
21-
22-
gcs_bucket_labels = {
23-
name = "terraform_state_conformance"
24-
}
25-
}
10+
include "root" {
11+
path = find_in_parent_folders()
12+
expose = true
2613
}
14+
15+
inputs = merge(
16+
local,
17+
include.root.locals,
18+
)
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
terraform {
2+
required_providers {
3+
google = {
4+
source = "registry.terraform.io/hashicorp/google"
5+
version = "6.1.0"
6+
}
7+
}
8+
}
9+
10+
# Cloud Run
11+
12+
resource "google_project_service" "cloudrun_api" {
13+
service = "run.googleapis.com"
14+
disable_on_destroy = false
15+
}
16+
17+
resource "google_service_account" "cloudrun_service_account" {
18+
account_id = "cloudrun-${var.env}-sa"
19+
display_name = "Service Account for Cloud Run (${var.env})"
20+
}
21+
22+
resource "google_storage_bucket_iam_member" "member" {
23+
bucket = var.bucket
24+
role = "roles/storage.objectUser"
25+
member = "serviceAccount:${google_service_account.cloudrun_service_account.email}"
26+
}
27+
28+
resource "google_project_iam_member" "iam_secret_accessor" {
29+
project = var.project_id
30+
role = "roles/secretmanager.secretAccessor"
31+
member = "serviceAccount:${google_service_account.cloudrun_service_account.email}"
32+
}
33+
34+
resource "google_spanner_database_iam_member" "iam_log_spanner_database_user" {
35+
instance = var.log_spanner_instance
36+
database = var.log_spanner_db
37+
role = "roles/spanner.databaseUser"
38+
member = "serviceAccount:${google_service_account.cloudrun_service_account.email}"
39+
}
40+
41+
resource "google_spanner_database_iam_member" "iam_dedup_spanner_database_user" {
42+
instance = var.log_spanner_instance
43+
database = var.dedup_spanner_db
44+
role = "roles/spanner.databaseUser"
45+
member = "serviceAccount:${google_service_account.cloudrun_service_account.email}"
46+
}
47+
48+
locals {
49+
spanner_log_db_path = "projects/${var.project_id}/instances/${var.log_spanner_instance}/databases/${var.log_spanner_db}"
50+
spanner_dedup_db_path = "projects/${var.project_id}/instances/${var.log_spanner_instance}/databases/${var.dedup_spanner_db}"
51+
}
52+
53+
resource "google_cloud_run_v2_service" "default" {
54+
name = var.base_name
55+
location = var.location
56+
launch_stage = "GA"
57+
58+
template {
59+
service_account = google_service_account.cloudrun_service_account.account_id
60+
max_instance_request_concurrency = 700
61+
timeout = "5s"
62+
63+
scaling {
64+
max_instance_count = 3
65+
}
66+
67+
containers {
68+
image = var.server_docker_image
69+
name = "conformance"
70+
args = [
71+
"--logtostderr",
72+
"--v=1",
73+
"--http_endpoint=:6962",
74+
"--project_id=${var.project_id}",
75+
"--bucket=${var.bucket}",
76+
"--spanner_db_path=${local.spanner_log_db_path}",
77+
"--spanner_dedup_db_path=${local.spanner_dedup_db_path}",
78+
"--roots_pem_file=/bin/fake-ca.cert",
79+
"--origin=${var.base_name}",
80+
"--signer_public_key_secret_name=${var.signer_public_key_secret_name}",
81+
"--signer_private_key_secret_name=${var.signer_private_key_secret_name}",
82+
]
83+
ports {
84+
container_port = 6962
85+
}
86+
87+
resources {
88+
limits = {
89+
cpu = "2"
90+
memory = "1024Mi"
91+
}
92+
}
93+
94+
startup_probe {
95+
initial_delay_seconds = 1
96+
timeout_seconds = 1
97+
period_seconds = 10
98+
failure_threshold = 6
99+
tcp_socket {
100+
port = 6962
101+
}
102+
}
103+
}
104+
}
105+
106+
deletion_protection = false
107+
108+
client = "terraform"
109+
110+
depends_on = [
111+
google_project_service.cloudrun_api,
112+
]
113+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
variable "project_id" {
2+
description = "GCP project ID where the log is hosted"
3+
type = string
4+
}
5+
6+
variable "base_name" {
7+
description = "Base name to use when naming resources"
8+
type = string
9+
}
10+
11+
variable "location" {
12+
description = "Location in which to create resources"
13+
type = string
14+
}
15+
16+
variable "env" {
17+
description = "Unique identifier for the env, e.g. dev or ci or prod"
18+
type = string
19+
}
20+
21+
variable "server_docker_image" {
22+
description = "The full image URL (path & tag) for the Docker image to deploy in Cloud Run"
23+
type = string
24+
}
25+
26+
variable "bucket" {
27+
description = "Log GCS bucket"
28+
type = string
29+
}
30+
31+
variable "log_spanner_instance" {
32+
description = "Log Spanner instance"
33+
type = string
34+
}
35+
36+
variable "log_spanner_db" {
37+
description = "Log Spanner database"
38+
type = string
39+
}
40+
41+
variable "dedup_spanner_db" {
42+
description = "Dedup Spanner database"
43+
type = string
44+
}
45+
46+
variable "signer_public_key_secret_name" {
47+
description = "Public key secret name for checkpoints and SCTs signer. Format: projects/{projectId}/secrets/{secretName}/versions/{secretVersion}."
48+
type = string
49+
}
50+
51+
variable "signer_private_key_secret_name" {
52+
description = "Private key secret name for checkpoints and SCTs signer. Format: projects/{projectId}/secrets/{secretName}/versions/{secretVersion}."
53+
type = string
54+
}

deployment/modules/gcp/conformance/main.tf

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,27 @@ module "storage" {
1212

1313
module "secretmanager" {
1414
source = "../secretmanager"
15+
16+
base_name = var.base_name
17+
}
18+
19+
module "cloudrun" {
20+
source = "../cloudrun"
21+
22+
env = var.env
23+
project_id = var.project_id
24+
base_name = var.base_name
25+
location = var.location
26+
server_docker_image = var.server_docker_image
27+
bucket = module.storage.log_bucket.id
28+
log_spanner_instance = module.storage.log_spanner_instance.name
29+
log_spanner_db = module.storage.log_spanner_db.name
30+
dedup_spanner_db = module.storage.dedup_spanner_db.name
31+
signer_public_key_secret_name = module.secretmanager.ecdsa_p256_public_key_id
32+
signer_private_key_secret_name = module.secretmanager.ecdsa_p256_private_key_id
33+
34+
depends_on = [
35+
module.secretmanager,
36+
module.storage
37+
]
1538
}

deployment/modules/gcp/conformance/variables.tf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,13 @@ variable "location" {
1212
description = "Location in which to create resources"
1313
type = string
1414
}
15+
16+
variable "env" {
17+
description = "Unique identifier for the env, e.g. dev or ci or prod"
18+
type = string
19+
}
20+
21+
variable "server_docker_image" {
22+
description = "The full image URL (path & tag) for the Docker image to deploy in Cloud Run"
23+
type = string
24+
}

deployment/modules/gcp/secretmanager/main.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ resource "tls_private_key" "sctfe_ecdsa_p256" {
2828
}
2929

3030
resource "google_secret_manager_secret" "sctfe_ecdsa_p256_public_key" {
31-
secret_id = "sctfe-ecdsa-p256-public-key"
31+
secret_id = "${var.base_name}-ecdsa-p256-public-key"
3232

3333
labels = {
3434
label = "sctfe-public-key"
@@ -48,7 +48,7 @@ resource "google_secret_manager_secret_version" "sctfe_ecdsa_p256_public_key" {
4848
}
4949

5050
resource "google_secret_manager_secret" "sctfe_ecdsa_p256_private_key" {
51-
secret_id = "sctfe-ecdsa-p256-private-key"
51+
secret_id = "${var.base_name}-ecdsa-p256-private-key"
5252

5353
labels = {
5454
label = "sctfe-private-key"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
variable "base_name" {
2+
description = "Base name to use when naming resources"
3+
type = string
4+
}

deployment/modules/gcp/storage/outputs.tf

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ output "log_bucket" {
33
value = google_storage_bucket.log_bucket
44
}
55

6-
output "log_spanner_db" {
7-
description = "Log Spanner database"
8-
value = google_spanner_database.log_db
9-
}
10-
116
output "log_spanner_instance" {
127
description = "Log Spanner instance"
138
value = google_spanner_instance.log_spanner
149
}
1510

11+
output "log_spanner_db" {
12+
description = "Log Spanner database"
13+
value = google_spanner_database.log_db
14+
}
15+
1616
output "dedup_spanner_db" {
1717
description = "Dedup Spanner database"
1818
value = google_spanner_database.dedup_db

deployment/modules/gcp/test/main.tf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
terraform {
2+
backend "gcs" {}
3+
}
4+
5+
module "storage" {
6+
source = "../storage"
7+
8+
project_id = var.project_id
9+
base_name = var.base_name
10+
location = var.location
11+
}
12+
13+
module "secretmanager" {
14+
source = "../secretmanager"
15+
16+
base_name = var.base_name
17+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
output "ecdsa_p256_public_key_id" {
2+
description = "Signer public key (P256_SHA256)"
3+
value = module.secretmanager.ecdsa_p256_public_key_id
4+
}
5+
6+
output "ecdsa_p256_private_key_id" {
7+
description = "Signer private key (P256_SHA256)"
8+
value = module.secretmanager.ecdsa_p256_private_key_id
9+
}

0 commit comments

Comments
 (0)