配置新实例和现有实例以使用 IAM 数据库身份验证

本页介绍了如何创建或修改 Cloud SQL 实例以允许配置为使用 Cloud SQL IAM 数据库身份验证的用户、服务账号或群组。如需详细了解 Cloud SQL IAM 集成,请参阅 IAM 身份验证

新创建的实例具有四个系统数据库:

  • information_schema:提供对数据库元数据的访问权限,这些元数据是关于 MySQL 服务器的信息。
  • mysql:系统架构。它包含一些表,这些表用于存储 MySQL 服务器运行时所需的信息。
  • performance_schema:用于在较低级别监控 MySQL 服务器执行的功能。
  • sys:包含一组对象,可帮助 DBA 和开发者解释由性能架构收集的数据。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. 确保您的用户账号具有 Cloud SQL Admin 和 Compute Viewer 角色。

    转到 IAM 页面

    详细了解角色和权限。

配置新实例以使用 IAM 数据库身份验证

如需配置新的 Cloud SQL 实例以进行 IAM 数据库身份验证,您需要启用 cloudsql_iam_authentication 标志。启用此标志后,您可以将 IAM 用户、服务账号或群组添加到 Cloud SQL 实例。

如需配置新的 Cloud SQL 实例以使用 IAM 数据库身份验证,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击创建实例
  3. 点击选择 MySQL
  4. 实例 ID 输入名称。
  5. 请勿在实例名称中包含敏感信息或个人身份信息,因为此名称对外可见。无需在实例名称中包含项目 ID。系统会在适当的位置(例如在日志文件中)自动包含项目 ID。
  6. 为根用户输入密码。
  7. 数据库版本菜单中,选择相应的数据库版本。
  8. 选择区域和可用区可用性部分,为实例选择区域和可用区。将实例与访问实例的资源置于相同地区内。以后无法更改选择的地区。通常,您无需指定区域。
  9. 自定义实例部分,点击显示配置选项,然后展开标志
  10. 点击添加标志
  11. 选择标志菜单中,选择 cloudsql_iam_authentication 标志。确保选择开启作为此标志的值,然后点击完成
  12. 根据需要配置其他实例设置。如需详细了解设置,请参阅设置
  13. 点击创建实例

gcloud

运行 gcloud sql instances create,注意将 --database-flags 参数设置为 cloudsql_iam_authentication=on

替换以下内容:

  • INSTANCE_NAME:新实例的名称。
  • MYSQL_VERSION:MySQL 版本(例如 MYSQL_5_7 或 MYSQL_8_0)。
  • NUMBER_OF_CORES:机器中的核心数。
  • AMOUNT_OF_MEMORY:机器中的内存量。应该提供大小单位(例如 3072MiB 或 9GiB)。
  • ZONE:首选 Compute Engine 可用区(例如 us-central1-a 或 us-central1-b)。
  • PASSWORD:为根用户创建密码。
gcloud sql instances create INSTANCE_NAME \
--database-version=MYSQL_VERSION \
--cpu=NUMBER_OF_CORES \
--memory=AMOUNT_OF_MEMORY \
--zone=ZONE_NAME \
--root-password=PASSWORD \
--database-flags=cloudsql_iam_authentication=on

Terraform

如需创建启用了 IAM 数据库身份验证的实例,请使用 Terraform 资源

resource "google_sql_database_instance" "default" {
  name             = "mysql-db-auth-instance-name-test"
  region           = "us-west4"
  database_version = "MYSQL_8_0"
  settings {
    tier = "db-f1-micro"
    database_flags {
      name  = "cloudsql_iam_authentication"
      value = "on"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally
  # delete this instance by use of Terraform whereas
  # `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用删除防护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 运行以下命令并在提示符处输入 yes,以移除之前使用 Terraform 配置应用的资源:

    terraform destroy

REST v1

请勿在实例名称中包含敏感信息或个人身份信息 (PII),因为此名称可供外部用户查看。

无需在实例名称中包含项目 ID。系统会在适当的位置(例如在日志文件中)自动包含项目 ID。

在使用任何请求数据之前,请先进行以下替换:

  • INSTANCE_ID:所需的实例 ID
  • REGION:所需区域,例如 us-east-1
  • PROJECT_ID:项目 ID
  • LOCATION_ID:位置 ID
  • DATABASE_VERSION:数据库版本的枚举字符串。 例如 MYSQL_8_0
  • PASSWORD:根用户的密码
  • MACHINE_TYPE:机器(层级)类型的枚举字符串,例如:db-custom-[CPUS]-[MEMORY_MBS]

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/instances

请求 JSON 正文:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    },
    "databaseFlags": [
      {
        "name": "cloudsql_iam_authentication",
        "value": "on"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}
如需了解如何为此任务构建底层 REST API 请求,请参阅 instances:insert 页面上的 APIs Explorer

REST v1beta4

请勿在实例名称中包含敏感信息或个人身份信息 (PII),因为此名称可供外部用户查看。

无需在实例名称中包含项目 ID。系统会在适当的位置(例如在日志文件中)自动包含项目 ID。

在使用任何请求数据之前,请先进行以下替换:

  • INSTANCE_ID:所需的实例 ID
  • REGION:所需区域,例如 us-east-1
  • PROJECT_ID:项目 ID
  • LOCATION_ID:位置 ID
  • DATABASE_VERSION:数据库版本的枚举字符串。 例如 MYSQL_8_0
  • PASSWORD:根用户的密码
  • MACHINE_TYPE:机器(层级)类型的枚举字符串,例如:db-custom-[CPUS]-[MEMORY_MBS]

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/locations/LOCATION_ID/instances

请求 JSON 正文:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    },
    "databaseFlags": [
      {
        "name": "cloudsql_iam_authentication",
        "value": "on"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}
如需了解如何为此任务构建底层 REST API 请求,请参阅 instances:insert 页面上的 APIs Explorer

配置现有实例以使用 IAM 数据库身份验证

如需配置现有 Cloud SQL 实例以进行 IAM 数据库身份验证,您需要启用 cloudsql_iam_authentication 标志。启用此标志后,您可以将 IAM 用户、服务账号或群组添加到 Cloud SQL 实例。

如需配置现有 Cloud SQL 实例以使用 IAM 数据库身份验证,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 点击修改
  4. 自定义实例部分,展开标志
  5. 点击添加标志
  6. 选择标志菜单中,选择 cloudsql_iam_authentication 标志。确保选择开启作为此标志的值,然后点击完成
  7. 根据需要配置其他实例设置。如需详细了解设置,请参阅设置
  8. 点击保存

gcloud

如需了解如何安装和开始使用 gcloud CLI,请参阅安装 gcloud CLI。如需了解如何启动 Cloud Shell,请参阅使用 Cloud Shell

对于此过程,请使用 gcloud sql instances patch

替换以下内容:

  • INSTANCE_NAME:新实例的名称。
gcloud sql instances patch INSTANCE_NAME \
--database-flags=cloudsql_iam_authentication=on

这将重置所有其他现有数据库标志设置。如需进一步了解如何设置数据库标志,请参阅设置数据库标志


REST v1

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID
  • LOCATION_ID:位置 ID
  • INSTANCE_ID:所需的实例 ID
  • REGION:所需区域
  • DATABASE_VERSION:数据库版本的枚举字符串。 例如 MYSQL_8_0
  • PASSWORD:根用户的密码
  • MACHINE_TYPE:机器(层级)类型的枚举字符串,例如:db-custom-[CPUS]-[MEMORY_MBS]

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/instances

请求 JSON 正文:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    }
    "databaseFlags":
    [
      {
        "name": "cloudsql_iam_authentication",
        "value": "on"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:项目 ID
  • LOCATION_ID:位置 ID
  • INSTANCE_ID:所需的实例 ID
  • REGION:所需区域
  • DATABASE_VERSION:数据库版本的枚举字符串。 例如 MYSQL_8_0
  • PASSWORD:根用户的密码
  • MACHINE_TYPE:机器(层级)类型的枚举字符串,例如:db-custom-[CPUS]-[MEMORY_MBS]

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/locations/LOCATION_ID/instances

请求 JSON 正文:

{
  "name": "INSTANCE_ID",
  "region": "REGION",
  "databaseVersion": "DATABASE_VERSION",
  "rootPassword": "PASSWORD",
  "settings": {
    "tier": "MACHINE_TYPE",
    "backupConfiguration": {
      "enabled": true
    }
    "databaseFlags":
    [
      {
        "name": "cloudsql_iam_authentication",
        "value": "on"
      }
    ]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-01T19:13:21.834Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

后续步骤