IAM 데이터베이스 인증으로 사용자 관리

이 페이지에서는 IAM 데이터베이스 인증을 사용하는 Cloud SQL 인스턴스에 사용자, 서비스 계정, 그룹을 추가하고 관리하는 방법을 설명합니다.

IAM 통합에 대한 자세한 내용은 IAM 인증을 참조하세요.

시작하기 전에

  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 관리자 역할이 있는지 확인합니다.

    IAM 페이지로 이동

  11. Cloud SQL 인스턴스에서 IAM 데이터베이스 인증을 사용 설정합니다.
  12. Cloud SQL 인스턴스에 로그인할 수 있도록 IAM 사용자, 서비스 계정 또는 그룹과 같은 IAM 사용자에게 필요한 cloudsql.instanceUser IAM 역할을 할당합니다.
    • Cloud SQL 인스턴스에 개별 사용자 또는 개별 서비스 계정을 추가하는 경우 각 사용자 및 서비스 계정에 IAM 역할을 개별적으로 할당해야 합니다.
    • 그룹을 추가하는 경우 그룹의 구성원이 IAM 역할과 연결된 IAM 권한을 자동으로 상속하므로 그룹에 IAM 역할을 할당해야 합니다. Cloud Identity에서 그룹을 만드는 방법에 관한 자세한 내용은 Google Cloud 콘솔에서 Google 그룹 만들기 및 관리를 참고하세요.
    • Google Cloud 콘솔의 IAM 페이지, gcloud CLI, Terraform 또는 Cloud SQL Admin API를 사용하여 Cloud SQL 인스턴스가 포함된 프로젝트에 역할을 부여할 수 있습니다. 자세한 내용은 사용자, 서비스 계정 또는 그룹에 IAM 정책 바인딩 추가를 참조하세요.
  13. 서비스 계정을 사용하는 경우 프로젝트의 데이터베이스에 액세스해야 하는 각 서비스에 대해 서비스 계정을 추가했는지 확인합니다.
  14. 서비스 계정 만들기에 관한 자세한 내용은 서비스 계정 만들기를 참조하세요.

사용자, 서비스 계정 또는 그룹에 IAM 정책 바인딩 추가

이 절차에서는 프로젝트 ID 및 binding이 제공된 특정 프로젝트의 IAM 정책에 정책 binding을 추가합니다. binding 명령어는 구성원, 역할, 선택적인 조건으로 구성됩니다.

데이터베이스 사용자 이름은 IAM 사용자의 이메일 주소(예: example-user@example.com)여야 합니다. 특수문자 (@.)가 포함되어 있으므로 소문자로만 작성하고 따옴표를 사용해야 합니다.

콘솔

  1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

    IAM으로 이동

  2. 추가를 클릭합니다.
  3. 새 구성원에 이메일 주소를 입력합니다. 개별 사용자, 서비스 계정 또는 그룹을 구성원으로 추가할 수 있지만 모든 프로젝트에는 회원으로 주 구성원이 1명 이상 있어야 합니다.
  4. 역할에서 Cloud SQL로 이동하여 Cloud SQL 인스턴스 사용자를 선택합니다.
  5. 선택사항: Cloud SQL 인증 프록시 또는 Cloud SQL 언어 커넥터를 사용하여 연결하려면 Cloud SQL 클라이언트도 선택합니다.
  6. 저장을 클릭합니다.

gcloud

--role=roles/cloudsql.instanceUser 플래그로 gcloud projects add-iam-policy-binding를 실행합니다.

사용자 계정에 정책 바인딩 추가

다음을 바꿉니다.

  • PROJECT_ID: 사용자에게 사용할 권한을 승인하려는 프로젝트의 ID입니다.
  • USERNAME: 사용자의 이메일 주소입니다.
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:USERNAME \
    --role=roles/cloudsql.instanceUser
  

Cloud SQL 인증 프록시 또는 Cloud SQL 언어 커넥터를 사용하여 연결하려면 --role=roles/cloudsql.client 플래그를 사용하여 gcloud projects add-iam-policy-binding를 다시 실행합니다.

서비스 계정에 정책 바인딩 추가

다음을 바꿉니다.

  • PROJECT_ID: 사용자에게 사용할 권한을 승인하려는 프로젝트의 ID입니다.
  • SERVICE_ACCT: 서비스 계정의 이메일 주소입니다.
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCT \
    --role=roles/cloudsql.instanceUser
  

Cloud SQL 인증 프록시 또는 Cloud SQL 언어 커넥터를 사용하여 연결하려면 --role=roles/cloudsql.client 플래그를 사용하여 gcloud projects add-iam-policy-binding를 다시 실행합니다.

Cloud Identity 그룹에 정책 바인딩 추가

다음을 바꿉니다.

  • PROJECT_ID: 그룹 구성원이 사용하도록 승인하려는 프로젝트의 ID입니다.
  • GROUP_EMAIL_ADDRESS: 그룹의 이메일 주소입니다. 예를 들면 example-group@example.com입니다.
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=group:GROUP_EMAIL_ADDRESS \
    --role=roles/cloudsql.instanceUser
   

지정된 그룹의 모든 구성원에게 Cloud SQL 인스턴스 사용자 역할이 부여되며 모든 구성원이 이 프로젝트의 인스턴스에 로그인할 수 있습니다.

Cloud SQL 인증 프록시 또는 Cloud SQL 언어 커넥터를 사용하여 연결하려면 --role=roles/cloudsql.client 플래그를 사용하여 gcloud projects add-iam-policy-binding를 다시 실행합니다.

Terraform

IAM 사용자 및 서비스 계정에 필요한 정책 바인딩을 추가하려면 Terraform 리소스를 사용합니다.

data "google_project" "project" {
}

resource "google_project_iam_binding" "cloud_sql_user" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.instanceUser"
  members = [
    "user:test-user@example.com",
    "serviceAccount:${google_service_account.default.email}"
  ]
}

resource "google_project_iam_binding" "cloud_sql_client" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.client"
  members = [
    "user:test-user@example.com",
    "serviceAccount:${google_service_account.default.email}"
  ]
}

변경사항 적용

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 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.

변경사항 삭제

변경사항을 삭제하려면 다음 단계를 따르세요.

  1. Terraform 구성 파일에서 삭제 보호를 사용 중지하려면 deletion_protection 인수를 false로 설정합니다.
    deletion_protection =  "false"
  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 업데이트된 Terraform 구성을 적용합니다.
    terraform apply
  1. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.

    terraform destroy

Terraform

IAM 사용자 및 서비스 계정에 필요한 정책 바인딩을 추가하려면 Terraform 리소스를 사용합니다.

data "google_project" "project" {
}

resource "google_project_iam_binding" "cloud_sql_user" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.instanceUser"
  members = [
    "group:example-group@example.com"
  ]
}

변경사항 적용

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 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.

변경사항 삭제

변경사항을 삭제하려면 다음 단계를 따르세요.

  1. Terraform 구성 파일에서 삭제 보호를 사용 중지하려면 deletion_protection 인수를 false로 설정합니다.
    deletion_protection =  "false"
  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 업데이트된 Terraform 구성을 적용합니다.
    terraform apply
  1. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.

    terraform destroy

REST

get-iam-policy 명령어에서 반환된 JSON 또는 YAML binding 정책을 수정하여 두 유형의 계정 모두에 cloudsql.instanceUsercloudsql.client 역할을 부여합니다. 업데이트된 정책을 설정해야만 이 정책 변경사항이 적용됩니다.

    {
      "role": "roles/cloudsql.instanceUser",
      "members": [
                   "user:example-user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
                   "group:example-group@example.com"
      ]
    }
    {
      "role": "roles/cloudsql.client",
      "members": [
                   "user:example-user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
      ]
    }

Cloud SQL 인스턴스에 개별 IAM 사용자 또는 서비스 계정 추가

데이터베이스에 액세스하려면 Cloud SQL 인스턴스에 추가하는 각 IAM 사용자 또는 서비스 계정에 대해 새 사용자 계정을 만들어야 합니다. IAM 그룹을 추가하는 경우 해당 그룹의 각 구성원별로 사용자 계정을 만들 필요가 없습니다.

데이터베이스 사용자 이름은 IAM 사용자의 이메일 주소여야 하며 모두 소문자여야 합니다. 예를 들면 example-user@example.com입니다.

REST 명령어를 사용할 때 특수문자(@.)가 포함되어 있으므로 사용자 이름에 따옴표를 사용해야 합니다. 서비스 계정은 service-account-name@project-id.iam.gserviceaccount.com 형식을 사용합니다.

개별 IAM 사용자 또는 서비스 계정을 추가하려면 새 사용자 계정을 추가하고 IAM을 인증 방법으로 선택합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
  3. SQL 탐색 메뉴에서 사용자를 선택합니다.
  4. 사용자 계정 추가를 클릭합니다. instance_name인스턴스에 사용자 계정 추가 탭이 열립니다.
  5. Cloud IAM 라디오 버튼을 클릭합니다.
  6. 주 구성원 필드에 추가하려는 사용자나 서비스 계정의 이메일 주소를 추가합니다.
  7. 추가를 클릭합니다. 이제 사용자 또는 서비스 계정이 사용자 계정 목록에 추가됩니다.
  8. 사용자 계정 생성 후 사용자에게 cloudsql.instanceUser IAM 역할이 할당되지 않은 경우 사용자 이름 옆에 삼각형 아이콘이 표시됩니다.

    사용자에게 로그인 권한을 부여하려면 아이콘을 클릭한 후 IAM 역할 추가를 선택합니다. 아이콘이 더 이상 표시되지 않으면 사용자 계정에 로그인 권한을 부여하는 IAM 역할이 할당된 것입니다.

gcloud

사용자 계정 만들기

example-user@example.com과 같은 이메일을 사용하여 사용자를 식별합니다.

다음을 바꿉니다.

  • USERNAME: 사용자의 이메일 주소입니다.
  • INSTANCE_NAME: 사용자에게 액세스를 승인하려는 인스턴스의 이름
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_user

서비스 계정 만들기

다음을 바꿉니다.

  • SERVICE_ACCT: 서비스 계정의 이메일 주소
  • INSTANCE_NAME: 서비스 계정이 액세스하도록 승인할 인스턴스의 이름
gcloud sql users create SERVICE_ACCT \
--instance=INSTANCE_NAME \
--type=cloud_iam_service_account

Terraform

IAM 데이터베이스 인증이 사용 설정된 인스턴스에 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
}

# Specify the email address of the IAM user to add to the instance
# This resource does not create a new IAM user account; this account must
# already exist

resource "google_sql_user" "iam_user" {
  name     = "test-user@example.com"
  instance = google_sql_database_instance.default.name
  type     = "CLOUD_IAM_USER"
}

# Create a new IAM service account

resource "google_service_account" "default" {
  account_id   = "cloud-sql-mysql-sa"
  display_name = "Cloud SQL for MySQL Service Account"
}

# Specify the email address of the IAM service account to add to the instance

resource "google_sql_user" "iam_service_account_user" {
  name     = google_service_account.default.email
  instance = google_sql_database_instance.default.name
  type     = "CLOUD_IAM_SERVICE_ACCOUNT"
}

변경사항 적용

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 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.

변경사항 삭제

변경사항을 삭제하려면 다음 단계를 따르세요.

  1. Terraform 구성 파일에서 삭제 보호를 사용 중지하려면 deletion_protection 인수를 false로 설정합니다.
    deletion_protection =  "false"
  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 업데이트된 Terraform 구성을 적용합니다.
    terraform apply
  1. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.

    terraform destroy

REST v1

사용자 계정 만들기

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID
  • INSTANCE_ID: 사용자를 추가할 인스턴스의 인스턴스 ID
  • USERNAME: 사용자의 이메일 주소입니다.

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

JSON 요청 본문:

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_USER"
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

서비스 계정 만들기

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • SERVICE_ACCT: 서비스 계정 이메일
  • PROJECT_ID: 프로젝트 ID
  • INSTANCE_ID: 서비스 계정을 추가할 인스턴스의 인스턴스 ID

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

JSON 요청 본문:

{
    "name": "SERVICE_ACCT",
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "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
  • INSTANCE_ID: 사용자를 추가할 인스턴스의 인스턴스 ID
  • USERNAME: 사용자의 이메일 주소입니다.

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

JSON 요청 본문:

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_USER"
  }

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

서비스 계정 만들기

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • SERVICE_ACCT: 서비스 계정 이메일
  • PROJECT_ID: 프로젝트 ID
  • INSTANCE_ID: 서비스 계정을 추가할 인스턴스의 인스턴스 ID

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

JSON 요청 본문:

{
    "name": "SERVICE_ACCT",
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

Cloud SQL 인스턴스에 IAM 그룹 추가

IAM 그룹 인증을 사용하고 Cloud SQL 인스턴스에 IAM 그룹을 추가하려면 이 섹션의 절차 중 하나를 사용하세요. IAM 그룹을 추가한 후에는 인스턴스에 개별 그룹 구성원을 추가할 필요가 없습니다. 자세한 내용은 Cloud SQL 인스턴스에 그룹 멤버 자동 추가를 참고하세요.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
  3. SQL 탐색 메뉴에서 사용자를 선택합니다.
  4. 사용자 계정 추가를 클릭합니다. instance_name인스턴스에 사용자 계정 추가 탭이 열립니다.
  5. Cloud IAM 라디오 버튼을 클릭합니다.
  6. 주 구성원 필드에 추가하려는 그룹의 이메일 주소를 추가합니다.
  7. 추가를 클릭합니다. 이제 그룹이 사용자 목록에 추가되었습니다.
  8. 사용자 계정 생성 후 그룹에 cloudsql.instanceUser IAM 역할이 할당되지 않은 경우 그룹 옆에 삼각형 아이콘이 표시됩니다.

    그룹 구성원에게 로그인 권한을 부여하려면 아이콘을 클릭한 후 IAM 역할 추가를 선택합니다. 아이콘이 더 이상 표시되지 않으면 그룹의 모든 구성원에게 로그인 권한을 부여하는 역할이 할당된 것입니다.

gcloud

다음을 바꿉니다.

  • GROUP_EMAIL_ADDRESS: 인스턴스에 추가하려는 Cloud ID 그룹의 이메일 주소입니다. 예를 들면 example-group@example.com입니다.
  • INSTANCE_NAME: 그룹을 추가할 인스턴스의 이름입니다.

다음 명령어를 실행합니다.

gcloud sql users create GROUP_EMAIL_ADDRESS \
  --instance=INSTANCE_NAME \
  --type=cloud_iam_group

Terraform

IAM 데이터베이스 인증이 사용 설정된 인스턴스에 IAM 사용자 및 서비스 계정을 추가하려면 Terraform 리소스를 사용합니다.

resource "google_sql_database_instance" "default" {
  name             = "mysql-iam-group-auth-instance-name"
  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
}

# Specify the email address of the Cloud Identity group to add to the instance
# This resource does not create a Cloud Identity group; the group must
# already exist

resource "google_sql_user" "iam_group" {
  name     = "example-group@example.com"
  instance = google_sql_database_instance.default.name
  type     = "CLOUD_IAM_GROUP"
}

data "google_project" "project" {
}

resource "google_project_iam_binding" "cloud_sql_user" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.instanceUser"
  members = [
    "group:example-group@example.com"
  ]
}

변경사항 적용

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 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.

변경사항 삭제

변경사항을 삭제하려면 다음 단계를 따르세요.

  1. Terraform 구성 파일에서 삭제 보호를 사용 중지하려면 deletion_protection 인수를 false로 설정합니다.
    deletion_protection =  "false"
  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 업데이트된 Terraform 구성을 적용합니다.
    terraform apply
  1. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.

    terraform destroy

REST v1

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID
  • INSTANCE_ID: Cloud Identity 그룹을 추가할 인스턴스의 인스턴스 ID입니다.
  • GROUP_EMAIL: Cloud ID 그룹의 이메일 주소

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

JSON 요청 본문:

{
  "name": "GROUP_EMAIL",
  "type": "CLOUD_IAM_GROUP"
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "example-group@example.com",
  "insertTime": "2023-12-07T22:44:16.656Z",
  "startTime": "2023-12-07T22:44:16.686Z",
  "endTime": "2023-12-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "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
  • INSTANCE_ID: Cloud Identity 그룹을 추가할 인스턴스의 인스턴스 ID입니다.
  • GROUP_EMAIL: Cloud ID 그룹의 이메일 주소

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

JSON 요청 본문:

{
  "name": "GROUP_EMAIL",
  "type": "CLOUD_IAM_GROUP"
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "example-group@example.com",
  "insertTime": "2023-12-07T22:44:16.656Z",
  "startTime": "2023-12-07T22:44:16.686Z",
  "endTime": "2023-12-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

Cloud SQL 인스턴스에 그룹 구성원 자동 추가

Cloud SQL 인스턴스에 IAM 그룹을 추가하면 해당 그룹의 모든 구성원(사용자 및 서비스 계정)이 인스턴스에 인증할 수 있는 IAM 권한을 상속합니다. Cloud SQL 인스턴스에 그룹 구성원을 개별적으로 추가할 필요는 없습니다. 그룹 구성원이 인스턴스에 처음으로 로그인하여 인증에 성공하면 Cloud SQL에서 해당 그룹 구성원의 그룹 사용자 계정 또는 그룹 서비스 계정을 만듭니다. 첫 번째 로그인에 성공한 후 인스턴스에 표시된 그룹 회원을 볼 수 있습니다.

로그인에 관한 자세한 내용은 IAM 데이터베이스 인증을 사용하여 로그인을 참조하세요.

Cloud SQL 인스턴스에서 그룹 회원 관리

Cloud SQL 인스턴스에 IAM 그룹을 추가하면 해당 그룹의 모든 구성원(사용자 또는 서비스 계정)이 인스턴스에 인증할 수 있는 IAM 권한을 상속받습니다. Cloud ID에서 그룹을 관리하여 인스턴스에 대한 액세스를 제어할 수 있습니다. 예를 들어 신규 사용자에게 인스턴스에 대한 액세스 권한을 부여하려면 Cloud ID에서 사용자를 그룹 구성원으로 추가합니다. 그룹 멤버십 변경사항이 Cloud SQL 인스턴스로 자동으로 전파되므로 Cloud SQL 인스턴스 수준에서 그룹 구성원을 별도로 삭제하거나 추가할 필요가 없습니다. 구성원 추가 또는 삭제와 같은 그룹 멤버십 변경사항은 전파되는 데 약 15분 정도 걸립니다. IAM 변경에 필요한 시간 외에 추가로 소요되는 시간입니다.

MySQL에서 IAM 그룹에 데이터베이스 권한을 부여하거나 취소하면 즉시 적용됩니다. 예를 들어 테이블에 대한 액세스 권한을 취소하면 해당 IAM 그룹의 구성원이 즉시 해당 테이블에 액세스할 수 없게 됩니다.

사용자 또는 서비스 계정이 여러 IAM 그룹의 구성원일 수 있습니다. 사용자 또는 서비스 계정이 인스턴스의 여러 IAM 그룹에 속하는 경우, 이러한 각 IAM 그룹에서 결합된 모든 IAM 권한 및 데이터베이스 권한을 가집니다.

Cloud ID의 IAM 그룹에 새 구성원(사용자 또는 서비스 계정)을 추가하고 이 구성원이 인스턴스에 처음으로 로그인하면 그룹에 부여된 데이터베이스 권한이 자동으로 상속됩니다. 동일한 로그인 세션 내에서 새로 획득한 데이터베이스 권한을 사용하려면 다음 문을 사용합니다.

SET ROLE ALL;

자세한 내용은 MySQL 문서의 SET ROLE을 참고하세요.

개별 IAM 사용자 또는 서비스 계정에 데이터베이스 권한 부여

개별 IAM 사용자 또는 서비스가 Cloud SQL 인스턴스에 추가되면 기본적으로 해당 새 계정에는 데이터베이스에 대한 권한이 부여되지 않습니다.

계정에 데이터베이스 권한을 부여하려면 GRANT 문을 사용합니다. 사용자 및 서비스 계정에 부여할 수 있는 전체 권한 목록은 GRANT 참조 페이지를 참조하세요. mysql 명령줄에서 GRANT를 실행합니다.

다음을 바꿉니다.

  • USERNAME: 사용자 계정의 경우 @ 및 도메인 문자열이 잘린 IAM 사용자의 이메일 주소입니다. 예를 들어 IAM 사용자의 이메일 주소가 example-user@example.com이면 사용자 이름은 example-user입니다. 서비스 계정의 경우 @project-id.iam.gserviceaccount.com 도메인이 없는 서비스 계정의 이메일 주소입니다.
  • DATABASE_NAME: 테이블을 호스팅하는 데이터베이스의 이름
  • TABLE_NAME: 사용자에게 액세스 권한을 부여할 테이블의 이름
  • grant select on DATABASE_NAME.TABLE_NAME to "USERNAME";

    IAM 그룹에 데이터베이스 권한 부여

    IAM 그룹 인증을 사용하면 개별 사용자 또는 서비스 계정에 권한을 부여하는 대신 IAM 그룹에 데이터베이스 권한을 부여합니다. 기본적으로 Cloud SQL 인스턴스에 IAM 그룹을 추가하면 그룹에 데이터베이스 권한이 없습니다.

    IAM 그룹에 데이터베이스 권한을 부여하려면 GRANT 문을 사용합니다. Cloud SQL 인스턴스에 처음 로그인하면 각 그룹 구성원(사용자 및 서비스 계정 포함)은 그룹에 부여된 데이터베이스 권한을 자동으로 상속합니다.

    다음을 바꿉니다.

  • GROUP_NAME: @ 및 도메인 이름이 잘린 Cloud ID 그룹의 이메일 주소의 첫 번째 부분입니다. 예를 들어 IAM 그룹의 이메일 주소가 example-group@example.com이면 그룹 이름은 example-group입니다.
  • DATABASE_NAME: 테이블을 호스팅하는 데이터베이스의 이름
  • TABLE_NAME: 사용자에게 액세스 권한을 부여할 테이블의 이름
  • mysql 명령줄에서 GRANT를 실행합니다.

    grant select on DATABASE_NAME.TABLE_NAME to "GROUP_NAME"@"HOSTNAME";

    HOSTNAME을 IAM 그룹 이메일 주소의 도메인 이름으로 바꿉니다.

    권한 부여에 대한 자세한 내용은 MySQL 문서의 GRANT 참조 페이지를 참조하세요.

    IAM 그룹에 부여한 데이터베이스 권한은 즉시 적용됩니다.

    Cloud SQL 인스턴스에 추가된 IAM 사용자, 서비스 계정, 그룹 보기

    Cloud SQL 인스턴스에 추가된 IAM 사용자, 서비스 계정, 그룹을 보려면 다음 명령어를 실행합니다.

    콘솔

    1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

      Cloud SQL 인스턴스로 이동

    2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
    3. SQL 탐색 메뉴에서 사용자를 선택합니다. 이 페이지에는 인스턴스에 추가된 IAM 사용자, 서비스 계정, Cloud ID 그룹의 목록이 표시됩니다.
    4. 선택사항: 이미 인스턴스에 로그인한 IAM 사용자 또는 서비스 계정의 목록을 보려면 인증된 IAM 그룹 구성원을 클릭합니다.

    gcloud

    INSTANCE_NAME을 확인할 그룹이 있는 인스턴스의 이름으로 바꿉니다.

      gcloud sql users list --instance=INSTANCE_NAME
      

    그룹의 사용자 유형은 CLOUD_IAM_GROUP입니다.

    출력에는 Cloud SQL 인스턴스의 사용자 및 서비스 계정도 나열됩니다.

    • 그룹의 구성원인 사용자 계정은 CLOUD_IAM_GROUP_USER 유형입니다.
    • 그룹의 구성원인 서비스 계정은 CLOUD_IAM_GROUP_SERVICE_ACCOUNT 유형입니다.
    • 개별 IAM 데이터베이스 인증 사용자 계정인 사용자 계정의 유형은 CLOUD_IAM_USER입니다.
    • 개별 IAM 데이터베이스 인증 서비스 계정인 서비스 계정은 CLOUD_IAM_SERVICE_ACCOUNT 유형입니다.

    REST v1

    다음 요청에서는 users.list 메서드를 사용하여 Cloud SQL 인스턴스에 계정이 있는 사용자를 나열합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • INSTANCE_ID: 인스턴스 ID입니다.

    HTTP 메서드 및 URL:

    GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users/list

    요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    
    {
      "kind": "sql#usersList",
      "items": [
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "example-service-acct",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_SERVICE_ACCOUNT"
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "another-example-service-acct",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_GROUP_SERVICE_ACCOUNT"
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "root",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "passwordPolicy": {
            "status": {}
          }
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "example-user",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_USER"
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "another-example-user",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_GROUP_USER"
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "example-group",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_GROUP"
        }
      ]
    }
    
    

    그룹의 사용자 유형은 CLOUD_IAM_GROUP입니다.

    출력에는 Cloud SQL 인스턴스의 사용자 및 서비스 계정도 나열됩니다.

    • 그룹의 구성원인 사용자 계정은 CLOUD_IAM_GROUP_USER 유형입니다.
    • 그룹의 구성원인 서비스 계정은 CLOUD_IAM_GROUP_SERVICE_ACCOUNT 유형입니다.
    • 개별 IAM 데이터베이스 인증 사용자 계정인 사용자 계정의 유형은 CLOUD_IAM_USER입니다.
    • 개별 IAM 데이터베이스 인증 서비스 계정인 서비스 계정은 CLOUD_IAM_SERVICE_ACCOUNT 유형입니다.

    REST v1beta4

    다음 요청에서는 users.list 메서드를 사용하여 Cloud SQL 인스턴스에 계정이 있는 사용자를 나열합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • project-id: 프로젝트 ID
    • instance-id: 원하는 인스턴스 ID

    HTTP 메서드 및 URL:

    GET https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

    요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    {
      "kind": "sql#usersList",
      "items": [
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "sqlserver",
          "host": "",
          "instance": "instance-id",
          "project": "project-id",
          "sqlserverUserDetails": {
            "serverRoles": [
              "CustomerDbRootRole"
            ]
          }
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "user-id-1",
          "host": "",
          "instance": "instance-id",
          "project": "project-id",
          "sqlserverUserDetails": {
            "serverRoles": [
              "CustomerDbRootRole"
            ]
          }
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "user-id-2",
          "host": "",
          "instance": "instance-id",
          "project": "project-id",
          "sqlserverUserDetails": {
            "serverRoles": [
              "CustomerDbRootRole"
            ]
          }
        },
        {
          ...
        },
        {
          ...
        }
      ]
    }
    

    그룹의 사용자 유형은 CLOUD_IAM_GROUP입니다.

    출력에는 Cloud SQL 인스턴스의 사용자 및 서비스 계정도 나열됩니다.

    • 그룹의 구성원인 사용자 계정은 CLOUD_IAM_GROUP_USER 유형입니다.
    • 그룹의 구성원인 서비스 계정은 CLOUD_IAM_GROUP_SERVICE_ACCOUNT 유형입니다.
    • 개별 IAM 데이터베이스 인증 사용자 계정인 사용자 계정의 유형은 CLOUD_IAM_USER입니다.
    • 개별 IAM 데이터베이스 인증 서비스 계정인 서비스 계정은 CLOUD_IAM_SERVICE_ACCOUNT 유형입니다.

    Cloud SQL 인스턴스에서 개별 IAM 사용자 또는 서비스 계정 삭제

    Cloud SQL 인스턴스에서 그룹의 구성원이 아닌 개별 사용자 또는 서비스 계정을 삭제하려면 다음 명령어를 사용하여 해당 계정을 삭제합니다.

    콘솔

    1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

      Cloud SQL 인스턴스로 이동

    2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
    3. SQL 탐색 메뉴에서 사용자를 선택합니다.
    4. 삭제할 사용자에 대하여 를 클릭합니다.
    5. 삭제를 선택합니다. 이렇게 하면 이 인스턴스에 대한 액세스만 취소됩니다.

    gcloud

    사용자 취소하기

    example-user@example.com과 같은 이메일을 사용하여 사용자를 식별합니다.

    다음을 바꿉니다.

    • USERNAME: @도메인 이름이 없는 이메일 주소
    • INSTANCE_NAME: 사용자를 삭제할 인스턴스의 이름
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME

    개별 서비스 계정 삭제

    다음을 바꿉니다.

    • SERVICE_ACCT: 서비스 계정의 이메일 주소
    • INSTANCE_NAME: 사용자를 삭제할 인스턴스의 이름
    gcloud sql users delete SERVICE_ACCT \
    --instance=INSTANCE_NAME

    REST v1

    다음 요청에서는 users.delete 메서드를 사용하여 지정된 사용자 계정을 삭제합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID
    • INSTANCE_ID: 원하는 인스턴스 ID
    • USERNAME: 사용자 또는 서비스 계정의 이메일 주소

    HTTP 메서드 및 URL:

    DELETE https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users?host=&name=USERNAME

    요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
      "status": "DONE",
      "user": "user@example.com",
      "insertTime": "2020-02-07T22:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "OPERATION_ID",
      "targetId": "INSTANCE_ID",
      "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
      "targetProject": "PROJECT_ID"
    }
    

    REST v1beta4

    다음 요청에서는 users.delete 메서드를 사용하여 지정된 사용자 계정을 삭제합니다.

    요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID
    • INSTANCE_ID: 원하는 인스턴스 ID
    • USERNAME: 사용자 또는 서비스 계정의 이메일 주소

    HTTP 메서드 및 URL:

    DELETE https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users?host=&name=USERNAME

    요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

    다음과 비슷한 JSON 응답이 표시됩니다.

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
      "status": "DONE",
      "user": "user@example.com",
      "insertTime": "2020-02-07T22:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "OPERATION_ID",
      "targetId": "INSTANCE_ID",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
      "targetProject": "PROJECT_ID"
    }
    

    Cloud SQL 인스턴스에서 IAM 그룹 구성원 삭제

    Cloud SQL 인스턴스에서 IAM 그룹 구성원을 삭제하는 방법에는 두 가지가 있습니다.

    • 자동 삭제
    • 수동 삭제

    자동 삭제

    IAM 그룹 구성원을 삭제하려면 Cloud ID의 해당 IAM 그룹에서 구성원의 멤버십을 삭제해야 합니다. IAM 그룹 사용자가 Cloud ID의 모든 관련 그룹에 대한 멤버십을 잃으면 Cloud SQL에서 이러한 그룹 사용자를 인스턴스에서 자동으로 삭제합니다.

    구성원 추가 또는 삭제와 같은 그룹 멤버십 변경사항은 전파되는 데 약 15분 정도 걸립니다. IAM 변경에 필요한 시간 외에 추가로 소요되는 시간입니다.

    수동 삭제

    IAM 그룹 사용자를 자동으로 삭제할 수 없는 경우 수동으로 삭제할 수 있습니다. gcloud CLI, Google Cloud 콘솔, Terraform 또는 Cloud SQL Admin API를 사용하여 Cloud SQL 인스턴스에서 IAM 그룹 사용자를 수동으로 삭제할 수는 없습니다. 대신, 수퍼유저 권한이 있는 데이터베이스 사용자는 MySQL 클라이언트의 DROP USER 문을 사용하여 Cloud SQL 인스턴스에서 IAM 그룹 사용자를 수동으로 삭제할 수 있습니다.

    Cloud SQL 인스턴스에서 IAM 그룹 사용자를 수동으로 삭제한 후에는 Cloud SQL 인스턴스에 더 이상 로그인하지 못하도록 Cloud ID의 IAM 그룹에서도 사용자를 삭제해야 합니다.

    Cloud SQL 인스턴스에서 IAM 그룹 삭제

    Cloud SQL 인스턴스에서 추가된 IAM 그룹을 삭제할 수 있습니다. 인스턴스에서 IAM 그룹을 삭제하면 IAM 그룹에 속한 모든 사용자와 서비스 계정에서 IAM 그룹에 부여된 데이터베이스 권한을 잃게 됩니다. 또한 다음 조건이 적용됩니다.

    • IAM 그룹에 속하는 사용자 및 서비스 계정은 cloudsql.instances.login IAM 권한이 해당 그룹에서 삭제될 때까지 계속 로그인할 수 있습니다.
    • 그룹을 삭제하여 IAM 그룹 사용자 또는 서비스 계정이 인스턴스의 다른 그룹에 속하지 않게 되면 Cloud SQL에서 인스턴스에서 IAM 그룹 사용자 또는 서비스 계정을 삭제합니다.

    Cloud SQL 인스턴스에서 모든 IAM 그룹을 삭제하면 모든 IAM 그룹 사용자와 서비스 계정의 모든 데이터베이스 권한이 상실됩니다. 또한 다음 조건이 적용됩니다.

    • 모든 IAM 그룹 사용자와 서비스 계정은 인스턴스에 로그인할 수 없습니다.
    • 또한 Cloud SQL은 인스턴스에서 모든 IAM 그룹 사용자와 서비스 계정을 자동으로 삭제합니다.

    콘솔

    1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

      Cloud SQL 인스턴스로 이동

    2. 인스턴스의 개요 페이지를 열려면 인스턴스 이름을 클릭합니다.
    3. SQL 탐색 메뉴에서 사용자를 선택합니다.
    4. 삭제하려는 그룹의 를 클릭합니다.
    5. 삭제를 선택합니다. 이렇게 하면 이 인스턴스에 대한 액세스만 취소됩니다.

    gcloud

    인스턴스에서 Cloud ID 그룹을 삭제하려면 gcloud sql users delete 명령어를 사용합니다.

    다음을 바꿉니다.

    • GROUP_NAME: Cloud ID 그룹의 이메일 주소의 첫 번째 부분입니다. 예를 들어 이메일 주소 example-group@example.com을 사용해 Cloud ID 그룹 이름을 example-group으로 지정합니다.
    • HOSTNAME: 이메일 주소의 두 번째 부분으로 Cloud ID 그룹의 호스트 이름을 나타냅니다. 예를 들어 이메일 주소 example-group@example.com을 사용해 호스트 이름을 example.com으로 지정합니다.
    • INSTANCE_NAME: 삭제하려는 Cloud ID 그룹이 있는 Cloud SQL 인스턴스의 이름입니다.
    gcloud sql users delete GROUP_NAME \
       --host=HOSTNAME \
       --instance=INSTANCE_NAME

    IAM 그룹에서 IAM 로그인 권한 삭제

    IAM 그룹에서 cloudsql.instanceUser 역할을 취소하면 그룹의 모든 구성원이 프로젝트의 Cloud SQL 인스턴스에 로그인할 수 없게 됩니다. 해당 사용자 또는 서비스 계정은 여전히 로그인 권한을 보유한 다른 IAM 그룹의 구성원인 경우에만 인스턴스에 로그인할 수 있습니다.

    Cloud ID 그룹에서 역할을 취소하려면 단일 역할 취소를 참조하세요.

    IAM 그룹에서 사용자 삭제

    사용자 또는 서비스 계정과 같은 IAM 그룹 구성원은 Cloud ID의 IAM 그룹에서 삭제할 수 있습니다.

    삭제가 IAM을 통해 전파된 후에는 사용자가 다른 그룹으로부터 로그인 권한을 받거나 로그인 권한을 직접 부여받지 않는 한 더 이상 데이터베이스에 로그인할 수 없습니다. 또한 그룹에서 삭제된 사용자는 그룹의 데이터베이스 권한을 상실합니다.

    IAM 그룹 사용자가 인스턴스의 그룹에 속하지 않으면 Cloud SQL에서 자동으로 인스턴스에서 사용자를 삭제합니다.

    감사 로그에서 로그인 정보 보기

    감사 로그를 사용 설정하여 데이터베이스에 대한 IAM 로그인을 캡처할 수 있습니다. 로그인 문제가 있으면 감사 로그를 사용해 문제를 진단할 수 있습니다.

    구성되면 로그 탐색기를 사용하여 성공한 로그인의 데이터 액세스 감사 로그를 볼 수 있습니다.

    IAM 그룹 인증의 경우 감사 로그에 개별 사용자 및 서비스 계정의 활동 및 로그인이 표시됩니다.

    예를 들어 로그에 다음과 비슷한 정보가 포함될 수 있습니다.

    {
     insertId: "..."
     logName: "projects/.../logs/cloudaudit.googleapis.com%2Fdata_access"
     protoPayload: {
      @type: "type.googleapis.com/google.cloud.audit.AuditLog"
      authenticationInfo: {
       principalEmail: "..."
      }
      authorizationInfo: [
       0: {
        granted: true
        permission: "cloudsql.instances.login"
        resource: "instances/..."
        resourceAttributes: {
        }
       }
      ]
      methodName: "cloudsql.instances.login"
      request: {
       @type: "type.googleapis.com/google.cloud.sql.authorization.v1.InstancesLoginRequest"
       clientIpAddress: "..."
       database: "..."
       databaseSessionId: ...
       instance: "projects/.../locations/us-central1/instances/..."
       user: "..."
      }
      requestMetadata: {
       callerIp: "..."
       destinationAttributes: {
       }
       requestAttributes: {
        auth: {
        }
        time: "..."
       }
      }
      resourceName: "instances/..."
      serviceName: "cloudsql.googleapis.com"
      status: {
      }
     }
     receiveTimestamp: "..."
     resource: {
      labels: {
       database_id: "...:..."
       project_id: "..."
       region: "us-central"
      }
      type: "cloudsql_database"
     }
     severity: "INFO"
     timestamp: "..."
    }
    

    로그인 실패 문제 해결

    로그인 시도가 실패하면 MySQL이 보안을 위해 최소한의 오류 메시지를 반환합니다. 예를 들면 다음과 같습니다.

    $MYSQL_PWD=`gcloud-access-token mysql` --enable-cleartext-plugin --ssl-ca=server-ca.pem
    --ssl-cert=client-cert.pem --ssl-key=client-key.pem   --host=ip_address --user=testuser
    Access denied for user 'testuser'@'...' (using password: NO)
    

    MySQL 오류 로그에서 오류에 대한 세부정보를 검토할 수 있습니다. 자세한 내용은 로그 보기를 참조하세요.

    예를 들어 이전 오류의 경우 다음 로그 항목에 문제 해결을 위해 수행할 수 있는 작업이 설명되어 있습니다.

    F ... [152172]: [1-1] db=...,user=... FATAL:  Cloud SQL IAM user authentication failed for user "..."
    I ... [152172]: [2-1] db=...,user=... DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, log in cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
    

    표시된 오류 메시지를 확인합니다. 메시지에 사용자가 'Cloud SQL IAM 사용자 인증' 또는 'Cloud SQL IAM 서비스 계정 인증'을 사용한 것으로 표시되지 않으면 로그인에 사용된 데이터베이스 사용자 유형이 CLOUD_IAM_USER 또는 CLOUD_IAM_SERVICE_ACCOUNT인지 확인합니다. IAM 사용자의 경우 데이터베이스 사용자 이름이 @ 및 도메인이 없는 IAM 사용자의 이메일 주소인지 확인합니다. 서비스 계정의 경우 @project-id.iam.gserviceaccount.com이 없는 서비스 계정의 이메일인지 확인합니다.

    IAM 데이터베이스 인증을 사용한 경우 오류 메시지의 세부정보를 확인합니다. 데이터베이스 오류 로그에서 오류 메시지를 찾을 수 있습니다. 비밀번호로 전송한 액세스 토큰(OAuth 2.0)이 잘못된 것으로 표시된 경우, gcloud auth application-default print-access-token gcloud 명령어를 사용하여 다음과 같이 토큰 세부정보를 찾을 수 있습니다.

    curl -H "Content-Type: application/x-www-form-urlencoded" \
    -d "access_token=$(gcloud auth application-default print-access-token)" \
    https://www.googleapis.com/oauth2/v1/tokeninfo

    토큰이 원하는 IAM 사용자 또는 서비스 계정을 위한 것이고 만료되지 않았는지 확인합니다.

    세부정보에 권한이 없다고 표시되는 경우 인스턴스의 프로젝트의 IAM 정책에 사전 정의된 Cloud SQL Instance User 역할 또는 커스텀 역할을 사용하여 IAM 사용자 또는 서비스 계정에 cloudsql.instances.login 권한이 부여되었는지 확인합니다. 추가 도움이 필요하면 IAM 정책 문제 해결 도구를 사용하세요.

    IAM 데이터베이스 인증을 사용할 수 없어서 로그인이 실패한 경우에는 기본 MySQL 사용자 및 비밀번호를 사용하여 로그인할 수 있습니다. 이 로그인 방법을 사용해도 사용자가 전체 데이터베이스에 액세스할 수 있습니다. 연결이 보안 연결인지 확인합니다.

    IAM 그룹 인증을 사용하는 사용자 계정 문제 해결

    이 섹션에는 IAM 그룹 인증의 문제 해결 시나리오가 나와 있습니다.

    데이터베이스에 그룹을 추가할 수 없음

    인스턴스에 그룹을 추가하려고 시도할 때 다음 오류가 발생합니다.

    (gcloud.sql.users.create) HTTPError 400: Invalid request: Provided CLOUD_IAM_GROUP: EMAIL, does not exist.
    

    입력한 이메일 주소가 유효한 그룹인지 확인합니다.

    그룹이 아직 없는 경우 그룹을 만듭니다. 그룹 만들기에 관한 자세한 내용은 Google Cloud 콘솔에서 Google 그룹 만들기 및 관리하기를 참조하세요.

    다음 오류가 표시되는 경우:

    (gcloud.sql.users.create) HTTPError 400: Invalid request: IAM Group Authentication is disabled.
    

    그런 다음 IAM 그룹 인증을 사용하기 전에 Cloud SQL 인스턴스에 다음과 같은 유지보수 업데이트가 필요합니다.

    R20240514.00_04 이상

    셀프서비스 유지보수를 사용하여 인스턴스에 유지보수 업데이트를 적용할 수 있습니다. 자세한 내용은 셀프서비스 유지보수를 참조하세요.

    기존 IAM 사용자 또는 서비스 계정이 IAM 그룹에 부여된 데이터베이스 권한을 상속하지 않음

    기존 IAM 사용자 또는 서비스 계정이 그룹의 올바른 데이터베이스 권한을 상속하지 않는 경우 다음 단계를 완료합니다.

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동

      계정이 Cloud SQL 인스턴스에 추가된 그룹의 구성원인지 확인합니다.

    2. 인스턴스의 사용자와 서비스 계정을 나열합니다.

      gcloud sql users list --instance=INSTANCE_NAME

      출력에서 사용자나 서비스 계정이 CLOUD_IAM_USER 또는 CLOUD_IAM_SERVICE_ACCOUNT로 나열되었는지 확인합니다.

    3. 사용자나 서비스 계정이 CLOUD_IAM_USER 또는 CLOUD_IAM_SERVICE_ACCOUNT로 나열되었으면 인스턴스에서 계정을 삭제합니다. 삭제할 계정은 그룹의 데이터베이스 권한을 상속하지 않는 개별 IAM 계정입니다.

    4. 사용자 또는 서비스 계정으로 인스턴스에 다시 로그인합니다.

      인스턴스에 다시 로그인하면 올바른 계정 유형인 CLOUD_IAM_GROUP_USER 또는 CLOUD_IAM_GROUP_SERVICE_ACCOUNT로 계정이 다시 생성됩니다.

    다음 단계