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

이 페이지에서는 IAM 데이터베이스 인증을 사용하는 사용자 또는 서비스 계정을 데이터베이스에 추가하고 이러한 사용자 및 서비스 계정을 관리하는 방법을 설명합니다. IAM 통합에 대한 자세한 내용은 IAM 인증을 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  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. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  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. 사용자가 액세스해야 하는 데이터베이스가 포함된 각 프로젝트에 대해 필요한 사용자에게 IAM 액세스 권한을 부여해야 합니다. 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.
  13. 프로젝트의 데이터베이스에 대해 액세스가 필요한 각 서비스에 대해 서비스 계정을 추가했는지 확인합니다.

데이터베이스 인스턴스에 IAM 사용자 또는 서비스 계정 추가

데이터베이스 인스턴스에 액세스하려는 각 IAM 사용자에 대해 새 데이터베이스 사용자를 만들어야 합니다. 데이터베이스 사용자 이름은 IAM 사용자의 이메일 주소(예: test-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. 사용자가 Cloud SQL 인스턴스 사용자 역할에 할당되지 않은 경우 사용자 이름 왼쪽에 삼각형 아이콘이 표시됩니다.

    사용자에게 로그인 권한을 부여하려면 아이콘을 클릭한 후 IAM 역할 추가를 선택합니다. 아이콘이 더 이상 표시되지 않습니다. 이제 사용자가 역할의 구성원입니다.

gcloud

사용자 계정 만들기

test-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             = "postgres-db-auth-instance-name-test"
  region           = "us-west4"
  database_version = "POSTGRES_14"
  settings {
    tier = "db-custom-2-7680"
    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"
}

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

# Create a new IAM service account

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

resource "google_sql_user" "iam_service_account_user" {
  # Note: for PostgreSQL only, Google Cloud requires that you omit the
  # ".gserviceaccount.com" suffix
  # from the service account email due to length limits on database usernames.
  name     = trimsuffix(google_service_account.default.email, ".gserviceaccount.com")
  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: 사용자의 이메일 주소
  • operation-id: 작업의 ID

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
  • operation-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: 사용자의 이메일 주소
  • operation-id: 작업의 ID

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
  • operation-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"
}

사용자 또는 서비스 계정에 IAM 정책 binding 추가

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

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

콘솔

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

    IAM으로 이동

  2. 추가를 클릭합니다.
  3. 새 구성원에 이메일 주소를 입력합니다. 개별 사용자, 서비스 계정 또는 그룹을 구성원으로 추가할 수 있지만 모든 프로젝트에는 회원으로 주 구성원이 1명 이상 있어야 합니다.
  4. 역할에서 Cloud SQL로 이동하여 Cloud SQL 인스턴스 사용자Cloud SQL 클라이언트를 선택합니다.
  5. 개별 사용자 및 서비스 계정의 경우 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
  

--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
  

--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

REST

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

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

IAM 사용자에게 데이터베이스 권한 부여

IAM 사용자가 데이터베이스 인스턴스에 추가되면 기본적으로 해당 새 사용자에게는 데이터베이스에 대한 권한이 부여되지 않습니다.

사용자 또는 서비스 계정이 데이터베이스에 연결되면 PUBLIC으로 액세스 권한이 부여된 모든 데이터베이스 객체에 대해 쿼리를 실행할 수 있습니다.

추가 액세스 권한이 필요한 경우 GRANT 문을 사용하여 추가 권한을 부여할 수 있습니다. 사용자 및 서비스 계정에 부여할 수 있는 전체 권한 목록은 GRANT 참조 페이지를 참조하세요. 명령줄에서 GRANT를 실행합니다.

다음을 바꿉니다.

  • USERNAME: 사용자의 이메일 주소. 특수문자(@.)가 포함되어 있으므로 이메일을 따옴표로 묶어야 합니다.
  • TABLE_NAME: 사용자에게 액세스 권한을 부여할 테이블의 이름
grant select on TABLE_NAME to "USERNAME";

데이터베이스에서 IAM 사용자 또는 서비스 계정 삭제

데이터베이스에서 사용자 또는 서비스 계정을 삭제하려면 인스턴스에서 계정을 삭제합니다.

콘솔

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

    Cloud SQL 인스턴스로 이동

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

gcloud

사용자 취소하기

test-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"
}

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

감사 로그를 사용 설정하여 데이터베이스에 대한 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: "..."
}

로그인 실패 문제 해결

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

PGPASSWORD=not-a-password psql --host=... --username=... --dbname=...
psql: error: could not connect to server: FATAL:  Cloud SQL IAM user authentication failed for user "..."
FATAL:  pg_hba.conf rejects connection for host "...", user "...", database "...", SSL off

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

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

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인지 확인합니다. Google Cloud 콘솔 또는 gcloud sql users list 명령어를 사용하여 이를 확인할 수 있습니다. IAM 사용자의 경우 데이터베이스 사용자 이름이 IAM 사용자의 이메일인지 확인합니다.

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

다음 단계