1- # TODO(michaelkedar): Organise / refactor logically into multiple tf files
2- # and possibly add variables for some field values.
3-
4- # APIs
5- # TODO(michaelkedar): Check whether any required apis are missing.
6- # TODO(michaelkedar): Add depends_on to enable APIs before any resources are created.
7-
8- resource "google_project_service" "compute_engine_api" {
9- project = var. project_id
10- service = " compute.googleapis.com"
11- }
12-
13- resource "google_project_service" "kubernetes_engine_api" {
14- project = var. project_id
15- service = " container.googleapis.com"
16- }
17-
18- resource "google_project_service" "redis_api" {
19- project = var. project_id
20- service = " redis.googleapis.com"
21- }
22-
23- resource "google_project_service" "datastore_api" {
24- project = var. project_id
25- service = " datastore.googleapis.com"
26- }
27-
28- resource "google_project_service" "vpcaccess_api" {
29- project = var. project_id
30- service = " vpcaccess.googleapis.com"
31- }
32-
33- resource "google_project_service" "cloud_run_api" {
34- project = var. project_id
35- service = " run.googleapis.com"
36- }
37-
38- resource "google_project_service" "service_management" {
39- project = var. project_id
40- service = " servicemanagement.googleapis.com"
41- }
42-
43- resource "google_project_service" "service_control" {
44- project = var. project_id
45- service = " servicecontrol.googleapis.com"
46- }
47-
48- resource "google_project_service" "endpoints" {
49- project = var. project_id
50- service = " endpoints.googleapis.com"
51- }
52-
53- # Network
54-
55- resource "google_compute_subnetwork" "my_subnet_0" {
56- project = var. project_id
57- name = " my-subnet-0"
58- network = " default"
59- ip_cidr_range = " 10.45.32.0/22"
60- private_ip_google_access = true
61- region = var. resource_region
62- }
63-
64- resource "google_compute_router" "router" {
65- project = var. project_id
66- name = " router"
67- network = " default"
68- region = var. resource_region
69- }
70-
71- resource "google_compute_router_nat" "nat_config" {
72- project = var. project_id
73- name = " nat-config"
74- router = google_compute_router. router . name
75- source_subnetwork_ip_ranges_to_nat = " ALL_SUBNETWORKS_ALL_IP_RANGES"
76- nat_ip_allocate_option = " AUTO_ONLY"
77- region = google_compute_router. router . region
78- enable_endpoint_independent_mapping = false
79- }
80-
81-
82- # Clusters / Node Pools
83-
84- resource "google_container_cluster" "workers" {
85- project = var. project_id
86- name = " workers"
87- location = var. worker_zone
88- subnetwork = google_compute_subnetwork. my_subnet_0 . self_link
89-
90- private_cluster_config {
91- enable_private_endpoint = false
92- enable_private_nodes = true
93- master_ipv4_cidr_block = " 172.16.0.32/28"
94- }
95-
96- # We need to define this for private clusters, but all fields are optional.
97- ip_allocation_policy {}
98-
99- provider = google- beta
100- addons_config {
101- gce_persistent_disk_csi_driver_config {
102- enabled = true
103- }
104- }
105-
106- # We can't create a cluster with no node pool defined, but we want to only use
107- # separately managed node pools. So we create the smallest possible default
108- # node pool and immediately delete it.
109- remove_default_node_pool = true
110- initial_node_count = 1
111- }
112-
113- resource "google_container_node_pool" "default_pool" {
114- project = var. project_id
115- name = " default-pool"
116- cluster = google_container_cluster. workers . name
117- location = google_container_cluster. workers . location
118-
119- autoscaling {
120- min_node_count = 1
121- max_node_count = 1000
122- }
123-
124-
125- node_config {
126- machine_type = " n1-highmem-2"
127- disk_type = " pd-ssd"
128- disk_size_gb = 64
129- local_ssd_count = 1
130-
131- oauth_scopes = [" https://www.googleapis.com/auth/cloud-platform" ]
132-
133- }
134- }
135-
136- resource "google_container_node_pool" "highend" {
137- project = var. project_id
138- name = " highend"
139- cluster = google_container_cluster. workers . name
140- location = google_container_cluster. workers . location
141-
142- autoscaling {
143- min_node_count = 0
144- max_node_count = 100
145- }
146-
147-
148- node_config {
149- machine_type = " n1-standard-32"
150- disk_type = " pd-standard"
151- disk_size_gb = 100
152- local_ssd_count = 1
153-
154- oauth_scopes = [" https://www.googleapis.com/auth/cloud-platform" ]
155-
156- labels = {
157- workloadType = " highend"
158- }
159-
160- taint = [{
161- effect = " NO_EXECUTE"
162- key = " workloadType"
163- value = " highend"
164- }]
165-
166- }
167- }
168-
169-
170- # Pub/Sub topics
171-
172- resource "google_pubsub_topic" "tasks" {
173- project = var. project_id
174- name = " tasks"
175-
176- labels = {
177- goog-dm = " pubsub"
178- }
179- }
180-
181- resource "google_pubsub_topic" "failed_tasks" {
182- project = var. project_id
183- name = " failed-tasks"
184- }
185-
186- resource "google_pubsub_subscription" "tasks" {
187- project = var. project_id
188- name = " tasks"
189- topic = google_pubsub_topic. tasks . id
190- message_retention_duration = " 604800s"
191- ack_deadline_seconds = 600
192-
193- dead_letter_policy {
194- dead_letter_topic = google_pubsub_topic. failed_tasks . id
195- max_delivery_attempts = 5
196- }
197-
198- expiration_policy {
199- ttl = " " # never expires
200- }
201-
202- labels = {
203- goog-dm = " pubsub"
204- }
205- }
206-
207- resource "google_pubsub_topic" "pypi_bridge" {
208- project = var. project_id
209- name = " pypi-bridge"
210- }
211-
212-
213- # Service accounts permissions
214-
215- data "google_compute_default_service_account" "default" {
216- project = var. project_id
217- }
218-
219- data "google_app_engine_default_service_account" "default" {
220- project = var. project_id
221- }
222-
223- resource "google_project_service_identity" "pubsub" {
224- provider = google- beta
225- project = var. project_id
226- service = " pubsub.googleapis.com"
227- }
228-
229- resource "google_project_iam_member" "compute_service" {
230- project = var. project_id
231- role = " roles/editor"
232- member = " serviceAccount:${ data . google_compute_default_service_account . default . email } "
233- }
234-
235- resource "google_project_iam_member" "app_engine_service" {
236- project = var. project_id
237- role = " roles/editor"
238- member = " serviceAccount:${ data . google_app_engine_default_service_account . default . email } "
239- }
240-
241- resource "google_service_account" "deployment_service" {
242- project = var. project_id
243- account_id = " deployment"
244- display_name = " deployment"
245- }
246-
247- resource "google_project_iam_member" "deployment_service" {
248- project = var. project_id
249- role = " roles/editor"
250- member = " serviceAccount:${ google_service_account . deployment_service . email } "
251- }
252-
253- resource "google_pubsub_subscription_iam_member" "tasks_service_subscriber" {
254- project = var. project_id
255- subscription = google_pubsub_subscription. tasks . name
256- role = " roles/pubsub.subscriber"
257- member = " serviceAccount:${ google_project_service_identity . pubsub . email } "
258- }
259-
260- resource "google_pubsub_topic_iam_member" "failed_tasks_service_publisher" {
261- project = var. project_id
262- topic = google_pubsub_topic. failed_tasks . name
263- role = " roles/pubsub.publisher"
264- member = " serviceAccount:${ google_project_service_identity . pubsub . email } "
265- }
1+ # osv.dev terraform configuration
2662
2673# App Engine
268-
2694resource "google_app_engine_application" "app" {
2705 project = var. project_id
2716 location_id = " us-west2"
@@ -307,12 +42,10 @@ resource "google_vpc_access_connector" "connector" {
30742}
30843
30944# Storage Buckets
310-
311- # TODO(michaelkedar): naming of public buckets
31245resource "google_storage_bucket" "osv_public_import_logs" {
31346 project = var. project_id
31447 name = var. public_import_logs_bucket
315- location = var . resource_location
48+ location = " US "
31649 uniform_bucket_level_access = true
31750
31851 lifecycle {
@@ -342,10 +75,33 @@ resource "google_storage_bucket" "osv_public_import_logs" {
34275resource "google_storage_bucket" "osv_vulnerabilities_export" {
34376 project = var. project_id
34477 name = var. vulnerabilities_export_bucket
345- location = var . resource_location
78+ location = " US "
34679 uniform_bucket_level_access = true
34780
34881 lifecycle {
34982 prevent_destroy = true
35083 }
351- }
84+ }
85+
86+ # Service account permissions
87+ resource "google_service_account" "deployment_service" {
88+ project = var. project_id
89+ account_id = " deployment"
90+ display_name = " deployment"
91+ }
92+
93+ resource "google_project_iam_member" "deployment_service" {
94+ project = var. project_id
95+ role = " roles/editor"
96+ member = " serviceAccount:${ google_service_account . deployment_service . email } "
97+ }
98+
99+ data "google_app_engine_default_service_account" "default" {
100+ project = var. project_id
101+ }
102+
103+ resource "google_project_iam_member" "app_engine_service" {
104+ project = var. project_id
105+ role = " roles/editor"
106+ member = " serviceAccount:${ data . google_app_engine_default_service_account . default . email } "
107+ }
0 commit comments