python-batch/fsi_montecarlo/OLD/main.tf (237 lines of code) (raw):
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
provider "google-beta" {
region = var.region
zone = var.zone
project = var.project
}
locals {
sa_email = "${data.google_project.project.number}-compute@developer.gserviceaccount.com"
}
resource "google_compute_project_metadata" "default" {
project = var.project
metadata = {
bq_table_prefix = var.name_prefix
bq_table_suffix = var.name_suffix
}
}
resource "google_compute_network" "vpc_network" {
name = "${var.name_prefix}-network"
project = var.project
}
variable "gcp_service_list" {
description ="The list of apis necessary for the project"
type = list(string)
default = [
"cloudresourcemanager.googleapis.com",
"batch.googleapis.com",
"serviceusage.googleapis.com"
]
}
resource "google_project_service" "gcp_services" {
for_each = toset(var.gcp_service_list)
project = "${var.project}"
disable_dependent_services = true
service = each.key
}
resource "google_notebooks_instance" "instance" {
name = "notebooks-instance-${var.name_suffix}"
depends_on = [google_project_service.vertex_ai_notebooks_api]
location = "us-west1-a"
machine_type = "e2-medium"
project = var.project
vm_image {
project = "deeplearning-platform-release"
image_family = "tf-latest-cpu"
}
}
resource "google_project_service" "vertex_ai_notebooks_api" {
service = "notebooks.googleapis.com"
project = data.google_project.project.project_id
# lifecycle {
# prevent_destroy = true
# }
}
resource "google_project_service" "bigquery" {
service = "bigquery.googleapis.com"
disable_dependent_services = true
project = data.google_project.project.project_id
# lifecycle {
# prevent_destroy = true
# }
}
resource "google_project_iam_member" "data_editor" {
project = data.google_project.project.project_id
role = "roles/bigquery.dataEditor"
member = "user:${var.user_email}"
}
resource "google_project_iam_member" "metadata_viewer" {
project = data.google_project.project.project_id
role = "roles/bigquery.metadataViewer"
member = "user:${var.user_email}"
}
resource "google_pubsub_topic" "example" {
name = "${var.name_prefix}_topic_${var.name_suffix}"
depends_on = [google_pubsub_schema.example]
project = var.project
schema_settings {
schema = "${data.google_project.project.id}/schemas/${var.name_prefix}_schema_${var.name_suffix}"
encoding = "BINARY"
}
}
resource "google_pubsub_schema" "example" {
name = "${var.name_prefix}_schema_${var.name_suffix}"
project = var.project
type = "AVRO"
definition = <<CCE
{
"name" : "Avro",
"type" : "record",
"fields" :
[
{"name" : "ticker", "type" : "string"},
{"name" : "epoch_time", "type" : "int"},
{"name" : "iteration", "type" : "int"},
{"name" : "start_date", "type" : "string"},
{"name" : "end_date", "type" : "string"},
{
"name":"simulation_results",
"type":{
"type": "array",
"items":{
"name":"Child",
"type":"record",
"fields":[
{"name":"price", "type":"double"}
]
}
}
}
]
}
CCE
}
resource "google_pubsub_subscription" "example" {
name = "${var.name_prefix}_subscription_${var.name_suffix}"
topic = google_pubsub_topic.example.name
project = var.project
bigquery_config {
table = "${google_bigquery_table.pbsb.project}.${google_bigquery_table.pbsb.dataset_id}.${google_bigquery_table.pbsb.table_id}"
use_topic_schema = true
write_metadata = true
}
depends_on = [google_project_iam_member.viewer, google_project_iam_member.editor]
}
data "google_project" "project" {
project_id = "${var.project}"
}
resource "google_project_iam_member" "viewer" {
project = data.google_project.project.project_id
role = "roles/bigquery.metadataViewer"
member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}
resource "google_project_iam_member" "editor" {
project = data.google_project.project.project_id
role = "roles/bigquery.dataEditor"
member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}
resource "google_bigquery_dataset" "pbsb" {
depends_on = [resource.google_project_service.bigquery]
dataset_id = "${var.name_prefix}_dataset_${var.name_suffix}"
project = data.google_project.project.project_id
}
resource "google_bigquery_table" "pbsb" {
deletion_protection = false
project = var.project
table_id = "${var.name_prefix}_table_${var.name_suffix}"
dataset_id = google_bigquery_dataset.pbsb.dataset_id
schema = <<EOF
[
{
"name": "subscription_name", "type": "STRING"
},
{
"name": "message_id", "type": "STRING"
},
{
"name": "publish_time", "type": "TIMESTAMP"
},
{
"name": "simulation_results", "type": "RECORD", "mode": "REPEATED",
"fields": [
{
"name" : "price",
"type" : "NUMERIC"
}
]
},
{
"name": "ticker", "type": "STRING"
}
,{
"name": "epoch_time", "type": "INT64"
}
,{
"name": "iteration", "type": "INT64"
}
,{
"name": "start_date", "type": "STRING"
}
,{
"name": "end_date", "type": "STRING"
}
,{
"name": "attributes", "type": "STRING"
}
]
EOF
}
data "template_file" "batch_yaml" {
template = "${file("${path.module}/batch.tpl.yaml")}"
vars = {
project_id = "${data.google_project.project.project_id}"
region = "${var.region}"
bucket_name = "${google_storage_bucket.fsi_bucket.name}"
}
}
resource "local_file" "batch_yaml_file" {
filename = "batch.yaml"
content = data.template_file.batch_yaml.rendered
}
data "template_file" "python" {
template = "${file("${path.module}/pubsub_bq.tpl.py")}"
vars = {
project_id = "${data.google_project.project.project_id}"
topic_name = "${google_pubsub_topic.example.name}"
schema_name = "${google_pubsub_schema.example.name}"
dataset_name = "${google_bigquery_dataset.pbsb.dataset_id}"
table_name = "${google_bigquery_table.pbsb.table_id}"
}
}
resource "local_file" "python_script" {
filename = "pubsub_bq.py"
content = data.template_file.python.rendered
}
resource "local_file" "python_requirements" {
filename = "requirements.txt"
content =<<EOR
absl-py
avro
google-auth
google-cloud
google-cloud-batch
google-cloud-pubsub
google-cloud-bigquery
yfinance
PyYAML
EOR
provisioner "local-exec" {
command = "python3 -m venv .fsi; source .fsi/bin/activate; python3 -m pip install -r requirements.txt"
}
}
resource "google_storage_bucket" "fsi_bucket" {
name = "${var.name_prefix}_bucket_${var.name_suffix}"
project = var.project
location = "US"
force_destroy = true
uniform_bucket_level_access = true
public_access_prevention = "enforced"
provisioner "local-exec" {
command = "gsutil cp iteration.sh pubsub_bq.py requirements.txt gs://${var.name_prefix}_bucket_${var.name_suffix}"
}
depends_on = [
local_file.python_script
]
}