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

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

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

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

  4. Google Cloud CLI를 설치합니다.
  5. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  6. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

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

  8. Google Cloud CLI를 설치합니다.
  9. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  10. Cloud Key Management Service API 사용 설정

    API 사용 설정

  11. 사용자 계정에 Cloud SQL 관리자 역할이 있는지 확인합니다.

    IAM 페이지로 이동

  12. Cloud SQL 인스턴스에서 IAM 데이터베이스 인증을 사용 설정합니다.
  13. 사용자가 액세스해야 하는 데이터베이스가 포함된 각 프로젝트에 대해 필요한 사용자에게 IAM 액세스 권한을 부여해야 합니다. 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.
  14. 프로젝트의 데이터베이스에 대해 액세스가 필요한 각 서비스에 대해 서비스 계정을 추가했는지 확인합니다.
  15. IAM 그룹 인증을 사용하는 경우 프로젝트의 데이터베이스에 대한 액세스 권한이 필요한 Cloud ID 그룹을 만들었는지 확인합니다.

데이터베이스 인스턴스에 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 인스턴스 사용자 역할에 할당되지 않은 경우 사용자 이름 왼쪽에 triangle 아이콘이 표시됩니다.

    사용자에게 로그인 권한을 부여하려면 아이콘을 클릭한 후 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             = "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: 사용자의 이메일 주소
  • 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 그룹 인증을 구성하려면 다음 안내를 따르세요.

  1. Cloud ID 그룹을 아직 만들지 않았으면 Cloud SQL 인스턴스를 관리하는 프로젝트에서 그룹을 만듭니다. 자세한 내용은 Cloud ID 개요를 참조하세요.

  2. 다음 명령어를 실행하여 Cloud SQL 인스턴스에 그룹을 추가합니다.

    콘솔

    미리보기 중에는 Google Cloud 콘솔을 통해 인스턴스에 그룹을 추가할 수 없습니다.

    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
       

    REST v1

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

    • PROJECT_ID: 프로젝트 ID
    • INSTANCE_ID: Cloud ID 그룹을 추가할 인스턴스의 인스턴스 ID
    • GROUP_EMAIL: 그룹의 이메일 주소
    • OPERATION_ID: 작업의 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 ID 그룹을 추가할 인스턴스의 인스턴스 ID
    • GROUP_EMAIL: Cloud ID 그룹의 이메일 주소
    • OPERATION_ID: 작업의 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 ID 그룹을 인스턴스에 추가해도 그룹 구성원이 인스턴스에 사용자로 자동으로 추가되지 않습니다. 구성원이 인스턴스에 처음으로 로그인하면 인스턴스에 사용자 또는 서비스 계정이 생성됩니다.

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

인스턴스의 그룹 내 사용자 또는 서비스 계정 관리

Cloud ID 그룹의 멤버십을 관리하여 인스턴스에 대한 액세스를 제어할 수 있습니다. 자세한 내용은 Cloud ID 개요를 참조하세요.

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

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

변경사항이 전파된 후 사용자 또는 서비스 계정이 로그아웃했다가 다시 로그인해야 변경사항이 적용됩니다. 그러나 MySQL의 그룹에 대한 데이터베이스 권한을 부여하거나 취소하면 즉시 적용됩니다. 예를 들어 테이블에 대한 액세스 권한을 취소하면 Cloud ID 그룹의 구성원이 로그아웃했다가 다시 로그인하지 않아도 즉시 해당 테이블에 액세스할 수 없게 됩니다.

인스턴스에 Cloud ID가 추가되면 사용자가 로그아웃했다가 다시 로그인해야 새 그룹에서 권한을 받을 수 있습니다.

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

이 절차에서는 프로젝트 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을 다시 실행합니다.

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

다음을 바꿉니다.

  • 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 인스턴스 사용자 역할이 부여되며 모든 구성원이 이 프로젝트의 인스턴스에 로그인할 수 있습니다.

IAM 그룹 인증은 미리보기 버전입니다.

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"
                   "group:example-group@example.com"
      ]
    }
    {
      "role": "roles/cloudsql.client",
      "members": [
                   "user:test-user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
      ]
    }

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

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

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

다음을 바꿉니다.

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

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

    IAM 그룹 인증을 사용하는 경우 개별 사용자에게 권한을 부여하는 대신 Cloud ID 그룹에 데이터베이스 권한을 부여하세요. 기본적으로 Cloud ID 그룹을 Cloud SQL 인스턴스에 추가하는 경우 Cloud ID 그룹에는 권한이 없습니다.

    Cloud ID 그룹 내 사용자에게 데이터베이스 권한을 부여하려면 GRANT 문을 사용합니다.

    다음을 바꿉니다.

    • GROUP_NAME: Cloud ID 그룹 이메일 주소의 첫 번째 부분입니다. 예를 들어 이메일 주소 example-group@example.com을 사용해 Cloud ID 그룹 이름을 example-group으로 지정합니다.
    • HOSTNAME: 이메일 주소의 두 번째 부분으로 Cloud ID 그룹의 호스트 이름을 나타냅니다. 예를 들어 이메일 주소 example-group@example.com을 사용해 호스트 이름을 example.com으로 지정합니다.
    • DATABASE_NAME: 테이블을 호스팅하는 데이터베이스의 이름입니다.
    • TABLE_NAME: Cloud ID 그룹 구성원에게 액세스 권한을 부여할 테이블의 이름입니다.

    mysql 명령줄에서 GRANT를 실행합니다.

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

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

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

    그룹, IAM 사용자, 서비스 계정 보기

    인스턴스에 추가된 Cloud ID 그룹을 보려면 다음 명령어를 실행합니다.

    콘솔

    미리보기 중에는 Google Cloud 콘솔을 통해 인스턴스의 그룹을 볼 수 없습니다.

    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 유형입니다.

    데이터베이스에서 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 그룹 인증 사용자 또는 서비스 계정 삭제

    gcloud CLI를 사용하여 IAM 그룹 인증으로 만든 사용자 또는 서비스 계정을 삭제할 수 없습니다. 사용자나 서비스 계정이 처음으로 로그인하면 Cloud SQL에서 자동으로 이러한 계정을 만듭니다.

    이러한 계정을 삭제하는 유일한 방법은 수퍼유저 권한이 있는 사용자로 MySQL 클라이언트를 사용하는 것입니다.

    사용자 또는 서비스 계정을 삭제하는 쿼리를 생성하려면 MySQL 문서를 참조하세요.

    인스턴스에서 그룹 삭제

    인스턴스에서 Cloud ID 그룹을 삭제하면 Cloud ID 그룹에 속하는 모든 사용자 및 서비스 계정이 Cloud ID 그룹에 부여된 데이터베이스 권한을 상실합니다. Cloud ID 그룹에 속하는 사용자 및 서비스 계정은 IAM 로그인 권한이 해당 그룹에서 삭제될 때까지 계속 로그인할 수 있습니다.

    콘솔

    미리보기 중에는 Google Cloud 콘솔을 통해 인스턴스에서 그룹을 삭제할 수 없습니다.

    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 로그인 권한 삭제

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

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

    그룹에서 사용자 삭제

    Cloud ID 그룹에서 사용자를 삭제할 수 있습니다.

    삭제가 IAM을 통해 전파된 후에도 사용자에게 적절한 IAM 권한이 있으면 사용자가 데이터베이스에 로그인할 수 있습니다. 하지만 다시 로그인하면 사용자는 삭제된 Cloud ID 그룹에 속하는 데이터베이스 권한을 더 이상 갖지 않습니다.

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

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

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

    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.
    

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

    그룹이 아직 없으면 그룹을 만듭니다. 그룹 만들기에 대한 자세한 내용은 Cloud ID 개요를 참조하세요.

    기존 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를 사용하여 계정이 다시 생성됩니다.

    다음 단계