Skip to content

Commit 2cbfe62

Browse files
committed
Setup valkey cluster with enabled TLS
1 parent 431da26 commit 2cbfe62

File tree

5 files changed

+154
-1
lines changed

5 files changed

+154
-1
lines changed

iac/provider-gcp/init/main.tf

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,3 +266,38 @@ resource "google_secret_manager_secret_version" "notification_email_value" {
266266

267267
secret_data = "[email protected]"
268268
}
269+
270+
271+
resource "google_secret_manager_secret" "redis_tls_ca_base64" {
272+
secret_id = "${var.prefix}redis-tls-ca-base64"
273+
274+
replication {
275+
auto {}
276+
}
277+
}
278+
279+
resource "google_secret_manager_secret_version" "redis_tls_ca_base64" {
280+
secret = google_secret_manager_secret.redis_tls_ca_base64.name
281+
secret_data = " "
282+
283+
lifecycle {
284+
ignore_changes = [secret_data]
285+
}
286+
}
287+
288+
resource "google_secret_manager_secret" "redis_secure_cluster_url" {
289+
secret_id = "${var.prefix}redis-secure-cluster-url"
290+
291+
replication {
292+
auto {}
293+
}
294+
}
295+
296+
resource "google_secret_manager_secret_version" "redis_secure_cluster_url" {
297+
secret = google_secret_manager_secret.redis_secure_cluster_url.name
298+
secret_data = " "
299+
300+
lifecycle {
301+
ignore_changes = [secret_data]
302+
}
303+
}

iac/provider-gcp/init/outputs.tf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ output "notification_email_secret_version" {
4646
value = google_secret_manager_secret_version.notification_email_value
4747
}
4848

49+
output "redis_tls_ca_base64_secret_version" {
50+
value = google_secret_manager_secret_version.redis_tls_ca_base64
51+
}
52+
53+
output "redis_secure_cluster_url_secret_version" {
54+
value = google_secret_manager_secret_version.redis_secure_cluster_url
55+
}
56+
4957
output "loki_bucket_name" {
5058
value = google_storage_bucket.loki_storage_bucket.name
5159
}

iac/provider-gcp/main.tf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ terraform {
1313

1414
google = {
1515
source = "hashicorp/google"
16-
version = "6.49.3"
16+
version = "6.50.0"
1717
}
1818

1919
cloudflare = {
@@ -270,6 +270,9 @@ module "redis" {
270270
gcp_region = var.gcp_region
271271
gcp_zone = var.gcp_zone
272272

273+
redis_secure_cluster_url_secret_version = module.init.redis_secure_cluster_url_secret_version
274+
redis_tls_ca_base64_secret_version = module.init.redis_tls_ca_base64_secret_version
275+
273276
prefix = var.prefix
274277
}
275278

iac/provider-gcp/redis/main.tf

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,23 @@ resource "google_project_service" "redis" {
1717
disable_on_destroy = false
1818
}
1919

20+
resource "google_project_service" "memory_store" {
21+
service = "memorystore.googleapis.com"
22+
disable_on_destroy = false
23+
}
24+
2025
resource "time_sleep" "redis_api_wait_60_seconds" {
2126
depends_on = [google_project_service.redis]
2227

2328
create_duration = "60s"
2429
}
2530

31+
resource "time_sleep" "memory_store_api_wait_60_seconds" {
32+
depends_on = [google_project_service.memory_store]
33+
34+
create_duration = "60s"
35+
}
36+
2637

2738
# Get the default network resource
2839
resource "google_compute_subnetwork" "default" {
@@ -53,6 +64,68 @@ resource "google_service_networking_connection" "private_service_connection" {
5364
]
5465
}
5566

67+
# PSC policy for Valkey on default VPC in europe-west1
68+
resource "google_network_connectivity_service_connection_policy" "valkey" {
69+
name = "${var.prefix}memorystore-valkey-connection-policy"
70+
location = var.gcp_region
71+
service_class = "gcp-memorystore"
72+
description = "my basic service connection policy"
73+
network = "projects/${var.gcp_project_id}/global/networks/${var.network_name}"
74+
psc_config {
75+
subnetworks = [google_compute_subnetwork.default.id]
76+
}
77+
}
78+
79+
resource "google_memorystore_instance" "valkey_cluster" {
80+
project = var.gcp_project_id
81+
location = var.gcp_region
82+
instance_id = "${var.prefix}redis-valkey-cluster"
83+
84+
engine_version = "VALKEY_8_0"
85+
mode = "CLUSTER"
86+
87+
desired_auto_created_endpoints {
88+
network = "projects/${var.gcp_project_id}/global/networks/${var.network_name}"
89+
project_id = var.gcp_project_id
90+
}
91+
92+
shard_count = var.shard_count
93+
replica_count = var.replica_count
94+
node_type = "STANDARD_SMALL"
95+
transit_encryption_mode = "SERVER_AUTHENTICATION"
96+
authorization_mode = "AUTH_DISABLED"
97+
98+
zone_distribution_config {
99+
mode = "MULTI_ZONE"
100+
}
101+
102+
deletion_protection_enabled = true
103+
104+
maintenance_policy {
105+
weekly_maintenance_window {
106+
day = "SUNDAY"
107+
start_time {
108+
hours = 1
109+
}
110+
}
111+
}
112+
113+
persistence_config {
114+
mode = "AOF"
115+
aof_config {
116+
append_fsync = "EVERY_SEC"
117+
}
118+
}
119+
120+
depends_on = [
121+
google_network_connectivity_service_connection_policy.valkey,
122+
google_service_networking_connection.private_service_connection,
123+
google_project_service.memory_store,
124+
time_sleep.memory_store_api_wait_60_seconds
125+
]
126+
}
127+
128+
56129
resource "google_redis_cluster" "redis_cluster_api" {
57130
name = "${var.prefix}redis-cluster-api"
58131
shard_count = 1
@@ -103,3 +176,17 @@ resource "google_secret_manager_secret_version" "redis_url" {
103176
secret = "projects/${var.gcp_project_id}/secrets/${var.prefix}redis-url"
104177
secret_data = google_redis_cluster.redis_cluster_api.psc_connections[0].address
105178
}
179+
180+
locals {
181+
redis_connection = google_memorystore_instance.valkey_cluster.endpoints[0].connections[0].psc_auto_connection[0]
182+
}
183+
184+
resource "google_secret_manager_secret_version" "redis_secure_cluster_url_secret_version" {
185+
secret = var.redis_secure_cluster_url_secret_version.secret
186+
secret_data = "${local.redis_connection.ip_address}:${local.redis_connection.port}"
187+
}
188+
189+
resource "google_secret_manager_secret_version" "redis_tls_ca_base64" {
190+
secret = var.redis_tls_ca_base64_secret_version.secret
191+
secret_data = base64encode(google_memorystore_instance.valkey_cluster.managed_server_ca[0].ca_certs[0].certificates[0])
192+
}

iac/provider-gcp/redis/variables.tf

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,23 @@ variable "network_name" {
1919
type = string
2020
default = "default"
2121
}
22+
23+
// https://registry.terraform.io/providers/hashicorp/google/6.38.0/docs/resources/memorystore_instance#shard_count-1
24+
variable "shard_count" {
25+
type = number
26+
default = 1
27+
}
28+
29+
// https://registry.terraform.io/providers/hashicorp/google/6.38.0/docs/resources/memorystore_instance#replica_count-1
30+
variable "replica_count" {
31+
type = number
32+
default = 1
33+
}
34+
35+
variable "redis_secure_cluster_url_secret_version" {
36+
type = any
37+
}
38+
39+
variable "redis_tls_ca_base64_secret_version" {
40+
type = any
41+
}

0 commit comments

Comments
 (0)