首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >terraform google cloud run添加云sql连接

terraform google cloud run添加云sql连接
EN

Stack Overflow用户
提问于 2021-06-17 19:48:05
回答 2查看 369关注 0票数 1

我正在使用terraform在google cloud上创建我的基础架构。我使用tfvars文件来保存我的变量,比如数据库密码。我将我的应用程序部署到云运行中,并在sql中创建数据库。问题是我需要将这个数据库添加到cloud run的Cloud SQL连接中。因为否则此应用程序将无法连接到数据库。我如何在terraform中做到这一点?

我的tf文件:

代码语言:javascript
复制
variable "database_password" {
type = string
}
variable "database_user" {
    type = string
}
variable "project_name" {
    type=string
}
variable "jwt_key" {
    type = string
}
provider "google"{
    credentials=file("credentials.json")
    project=var.project_name
    region="us-west1"
}
resource "google_sql_database_instance" "instance" {
    name="socialmediadatabase"
    region="us-central1"
    database_version="POSTGRES_13"
    deletion_protection = false
    settings{
        tier="db-f1-micro"
    }
}
resource "google_sql_database" "database"{
    name="socialmedia"
    instance=google_sql_database_instance.instance.name
}
resource "google_sql_user" "database-user" {
    name = var.database_user
    instance = google_sql_database_instance.instance.name
    password = var.database_password
}
resource "google_cloud_run_service" "run" {
    name="socialmedia"
    location = "us-central1"
    template {
        spec {
            containers {
                image = "gcr.io/${var.project_name}/socialmedia:latest"
                ports {
                    container_port = 5000
                }
                env {
                    name="ENV"
                    value = "production"
                }
                env {
                    name="JWT_KEY"
                    value = var.jwt_key
                }
                env {
                    name="DB_URL"
                    value = "postgresql://${var.database_user}:${var.database_password}@/socialmedia?host=/cloudsql/${google_sql_database_instance.instance.connection_name}"
                }
            }
        }
    }
    metadata {
        annotations = {
            "run.googleapis.com/cloudsql-instances"=google_sql_database_instance.instance.connection_name
        }
    }
}
#?
resource "google_cloud_run_service_iam_member" "member" {
    service = google_cloud_run_service.run.name
    location = google_cloud_run_service.run.location
    role = "roles/run.invoker"
    member = "allUsers"
}
EN

回答 2

Stack Overflow用户

发布于 2021-06-17 20:07:38

查看代码-我猜您可能想要使用terraform提供秘密信息到Cloud Run的环境变量中……

我想说,这种方法可能至少有两个问题:

1/这些秘密值将存储在terrafrom状态文件中。以解密的格式。我不确定这是不是一个好主意。

2/有权访问环境变量的任何人(或任何人)都可以访问这些秘密值。在我看来--有点冒险。

我建议将秘密值存储在Secret Manager... - see documentation here中,并且只提供秘密名称作为环境变量...

因此,Cloud Run代码应该获取环境变量,并从secret Manager获取对应的保密值。

为了实现这一点,可以通过terraform创建秘密(作为占位符),因此可以在Cloud Run中平滑地提供这些名称。

Cloud Run服务帐户应获取相关IAM角色以访问机密。这也可以使用terraform来完成。

最后,不要忘记(使用UI控制台或gcloud CLI命令)使用实际值(或GCP术语中的版本)填充秘密,并修改Cloud运行代码,以便它可以处理异常-缺少秘密值或不正确的值。

票数 1
EN

Stack Overflow用户

发布于 2021-06-18 01:10:32

我解决了。我应该在模板下添加元数据。这是正确的:

代码语言:javascript
复制
variable "database_password" {
type = string
}
variable "database_user" {
    type = string
}
variable "project_name" {
    type=string
}
variable "jwt_key" {
    type = string
}
provider "google"{
    credentials=file("credentials.json")
    project=var.project_name
    region="us-west1"
}
resource "google_sql_database_instance" "instance" {
    name="socialmediadatabase"
    region="us-central1"
    database_version="POSTGRES_13"
    deletion_protection = false
    settings{
        tier="db-f1-micro"
    }
}
resource "google_sql_database" "database"{
    name="socialmedia"
    instance=google_sql_database_instance.instance.name
}
resource "google_sql_user" "database-user" {
    name = var.database_user
    instance = google_sql_database_instance.instance.name
    password = var.database_password
}
resource "google_cloud_run_service" "run" {
    name="socialmedia"
    location = "us-central1"
    template {
        spec {
            containers {
                image = "gcr.io/${var.project_name}/socialmedia:latest"
                ports {
                    container_port = 5000
                }
                env {
                    name="ENV"
                    value = "production"
                }
                env {
                    name="JWT_KEY"
                    value = var.jwt_key
                }
                env {
                    name="DB_URL"
                    value = "postgresql://${var.database_user}:${var.database_password}@/socialmedia?host=/cloudsql/${google_sql_database_instance.instance.connection_name}"
                }
            }
        }
        metadata {
            annotations = {
                "run.googleapis.com/cloudsql-instances"=google_sql_database_instance.instance.connection_name
            }
        }
    }
}
#?
resource "google_cloud_run_service_iam_member" "member" {
    service = google_cloud_run_service.run.name
    location = google_cloud_run_service.run.location
    role = "roles/run.invoker"
    member = "allUsers"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68018718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档