@@ -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+
2025resource "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
2839resource "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+
56129resource "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+ }
0 commit comments