97 lines
2.9 KiB
Terraform
97 lines
2.9 KiB
Terraform
# ── Cloud Storage ─────────────────────────────────────────────────────────────
|
|
# Share card blobs from the marketing landing page demo chat.
|
|
# Separate buckets for prod and stage/test.
|
|
# Each blob is a small JSON file (~1KB) keyed by share ID.
|
|
# Public read so the landing server can serve card pages.
|
|
# Marketing SA has write access to upload new cards.
|
|
|
|
locals {
|
|
share_bucket_labels = {
|
|
"managed-by" = "terraform"
|
|
"project" = "neuron-marketing"
|
|
"purpose" = "share-cards"
|
|
}
|
|
}
|
|
|
|
# ── Prod bucket ───────────────────────────────────────────────────────────────
|
|
|
|
resource "google_storage_bucket" "shares_prod" {
|
|
name = "neuron-shares-prod"
|
|
project = var.project_id
|
|
location = "US"
|
|
storage_class = "STANDARD"
|
|
|
|
uniform_bucket_level_access = true
|
|
|
|
cors {
|
|
origin = ["https://neurontechnologies.ai"]
|
|
method = ["GET"]
|
|
response_header = ["Content-Type"]
|
|
max_age_seconds = 3600
|
|
}
|
|
|
|
lifecycle_rule {
|
|
action {
|
|
type = "Delete"
|
|
}
|
|
condition {
|
|
age = 365
|
|
}
|
|
}
|
|
|
|
labels = merge(local.share_bucket_labels, { "env" = "prod" })
|
|
}
|
|
|
|
resource "google_storage_bucket_iam_member" "shares_prod_public_read" {
|
|
bucket = google_storage_bucket.shares_prod.name
|
|
role = "roles/storage.objectViewer"
|
|
member = "allUsers"
|
|
}
|
|
|
|
resource "google_storage_bucket_iam_member" "shares_prod_marketing_write" {
|
|
bucket = google_storage_bucket.shares_prod.name
|
|
role = "roles/storage.objectUser"
|
|
member = "serviceAccount:${google_service_account.marketing.email}"
|
|
}
|
|
|
|
# ── Stage / test bucket ───────────────────────────────────────────────────────
|
|
|
|
resource "google_storage_bucket" "shares_stage" {
|
|
name = "neuron-shares-stage"
|
|
project = var.project_id
|
|
location = "US"
|
|
storage_class = "STANDARD"
|
|
|
|
uniform_bucket_level_access = true
|
|
|
|
cors {
|
|
origin = ["https://stage.neurontechnologies.ai", "http://localhost:3001"]
|
|
method = ["GET"]
|
|
response_header = ["Content-Type"]
|
|
max_age_seconds = 3600
|
|
}
|
|
|
|
lifecycle_rule {
|
|
action {
|
|
type = "Delete"
|
|
}
|
|
condition {
|
|
age = 30
|
|
}
|
|
}
|
|
|
|
labels = merge(local.share_bucket_labels, { "env" = "stage" })
|
|
}
|
|
|
|
resource "google_storage_bucket_iam_member" "shares_stage_public_read" {
|
|
bucket = google_storage_bucket.shares_stage.name
|
|
role = "roles/storage.objectViewer"
|
|
member = "allUsers"
|
|
}
|
|
|
|
resource "google_storage_bucket_iam_member" "shares_stage_marketing_write" {
|
|
bucket = google_storage_bucket.shares_stage.name
|
|
role = "roles/storage.objectUser"
|
|
member = "serviceAccount:${google_service_account.marketing.email}"
|
|
}
|