Cloud Scheduler를 사용하여 Cloud SQL 데이터베이스 내보내기 예약

이 가이드에서는 Cloud SchedulerCloud Functions를 사용하여 MySQL용 Cloud SQL 데이터베이스를 Cloud Storage로 자동으로 내보내는 방법을 보여줍니다. Cloud Storage에서 데이터베이스를 내보내면 강력하고 다양한 재해 복구 계획을 세울 수 있습니다. 예를 들어 다른 리전으로 내보내고 다른 Cloud SQL 또는 MySQL 데이터베이스로 가져올 수 있습니다.

아키텍처

이 가이드에는 다음과 같은 Google Cloud 구성요소가 포함됩니다.

Cloud Scheduler 작업은 Pub/Sub 주제에 Cloud SQL 인스턴스 이름, 데이터베이스, 프로젝트 ID, 백업을 저장할 Cloud Storage 위치에 대한 정보가 포함된 메시지를 게시합니다. 이 이벤트는 이 페이로드를 가져오는 Cloud 함수를 트리거하고 SQL Admin API를 통해 Cloud SQL에서 데이터베이스 내보내기를 시작합니다. 데이터베이스가 내보내기를 생성하고 Cloud Storage에 저장합니다. 다음 다이어그램에서 이 프로세스를 볼 수 있습니다.

Cloud Scheduler에서 Pub/Sub로의 워크플로이며 내보내기를 시작하는 Cloud Functions를 트리거합니다.

목표

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

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

    프로젝트 선택기 페이지로 이동

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  3. Cloud Console에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

  4. Cloud SQL Admin, Cloud Functions, Cloud Scheduler, App Engine API를 사용 설정합니다.

    API 사용 설정

이 가이드에서는 Cloud Shell에서 모든 명령어를 실행합니다.

환경 설정

시작하려면 먼저 샘플 데이터가 있는 저장소를 클론합니다. 그런 후 환경을 구성하고 이 가이드에 필요한 권한이 있는 커스텀 역할을 만듭니다.

  1. 샘플 데이터가 있는 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
    

    training-data-analyst 저장소의 데이터를 사용하여 가상 레코드가 있는 데이터베이스를 만듭니다.

  2. 다음 환경 변수를 구성합니다.

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="sql-export-tutorial"
    export BUCKET_NAME=${USER}-mysql-$(date +%s)
    export SQL_INSTANCE="${DEMO}-sql"
    export GCF_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export SQL_ROLE="sqlExporter"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-west2"
    
  3. 이 가이드에 필요한 권한만 있는 두 개의 커스텀 역할을 만듭니다.

    gcloud iam roles create ${STORAGE_ROLE} --project ${PROJECT_ID} \
        --title "Simple Storage Role" \
        --description "Grant permissions to view and create objects in Cloud Storage" \
        --permissions "storage.objects.create,storage.objects.get"
    
    gcloud iam roles create ${SQL_ROLE} --project ${PROJECT_ID} \
        --title "SQL Exporter Role" \
        --description "Grant permissions to export data from a Cloud SQL instance to a Cloud Storage bucket as a SQL dump or CSV file" \
        --permissions "cloudsql.instances.export"
    

    이러한 역할은 최소 권한 원칙에 따라 Cloud Functions 및 Cloud SQL 서비스 계정의 액세스 범위를 줄입니다.

Cloud Storage 버킷 및 Cloud SQL 인스턴스 만들기

이 섹션에서는 먼저 Cloud Storage 버킷 및 Cloud SQL MySQL 인스턴스를 만듭니다. 그런 다음 샘플 데이터베이스를 만들고 샘플 데이터로 채 웁니다.

Cloud Storage 버킷 만들기

gsutil 명령줄 도구를 사용하여 Cloud Storage 버킷을 만듭니다.

  • 데이터 내보내기를 저장할 Cloud Storage 버킷을 만듭니다.

    gsutil mb -l ${REGION} gs://${BUCKET_NAME}
    

Cloud SQL 인스턴스를 만들고 해당 서비스 계정에 대해 권한을 부여합니다.

다음으로 Cloud SQL 인스턴스를 만들고 서비스 계정에 Cloud Storage로 데이터를 내보낼 수 있는 권한을 부여합니다.

  1. MySQL 5.7용 Cloud SQL 인스턴스 만들기:

    gcloud sql instances create ${SQL_INSTANCE} --database-version MYSQL_5_7 --region ${REGION}
    

    이 작업을 완료하는 데 몇 분 정도 걸립니다.

  2. Cloud SQL 인스턴스가 실행 중인지 확인합니다.

    gcloud sql instances list --filter name=${SQL_INSTANCE}
    

    출력은 다음과 유사합니다.

    NAME                     DATABASE_VERSION  LOCATION    TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    sql-export-tutorial-sql  MYSQL_5_7         us-west2-b  db-n1-standard-1  34.94.173.98     -                RUNNABLE
    
  3. Cloud SQL 서비스 계정에 단순 저장소 역할을 사용하여 Cloud Storage로 데이터를 내보낼 권한을 부여합니다.

    export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \
        --project ${PROJECT_ID} \
        --format "value(serviceAccountEmailAddress)"`)
    
    gsutil iam ch serviceAccount:${SQL_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
    

Cloud SQL 인스턴스에 샘플 데이터를 채웁니다.

이제 파일을 버킷에 업로드하고 샘플 데이터베이스를 만들고 채울 수 있습니다.

  1. 클론한 저장소로 이동합니다.

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. 디렉터리에 있는 파일을 새 버킷에 업로드합니다.

    gsutil cp * gs://${BUCKET_NAME}
    
  3. 샘플 데이터베이스를 만들고 채웁니다. 메시지가 표시될 때마다 yes를 클릭하여 계속합니다.

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \
        --database recommendation_spark \
        --table Accommodation
    
    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \
        --database recommendation_spark \
        --table Rating
    

Pub/Sub 주제, Cloud 함수, Cloud Scheduler 작업 만들기

이 섹션에서는 커스텀 서비스 계정을 만들고 생성한 커스텀 SQL 역할에 결합합니다. 그런 다음 Cloud 함수의 실행을 트리거하는 데 사용되는 Pub/Sub 주제를 만듭니다. 또한 데이터 내보내기 함수를 주기적으로 실행하는 Cloud Scheduler 작업을 만듭니다.

Cloud 함수의 서비스 계정 만들기

첫 번째 단계는 커스텀 서비스 계정을 만들고 사용자가 만든 커스텀 SQL 역할에 결합하는 것입니다.

  1. Cloud 함수에서 사용할 IAM 서비스 계정을 만듭니다.

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. Cloud 함수 서비스 계정에 커스텀 SQL 역할에 대한 액세스 권한을 부여합니다.

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
    

Pub/Sub 주제 만들기

다음 단계에서는 Cloud SQL 데이터베이스와 상호작용하는 Cloud 함수를 트리거하기 위해 사용되는 Pub/Sub 주제를 만듭니다.

  • Pub/Sub 주제를 만듭니다.

    gcloud pubsub topics create ${PUBSUB_TOPIC}
    

Cloud 함수 만들기

다음으로 Cloud 함수를 만듭니다.

  1. 다음을 Cloud Shell에 붙여넣어 main.py 파일을 만듭니다.

    cat <<EOF > main.py
    
    import base64
    import logging
    import json
    
    from datetime import datetime
    from httplib2 import Http
    
    from googleapiclient import discovery
    from googleapiclient.errors import HttpError
    from oauth2client.client import GoogleCredentials
    
    def main(event, context):
        pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8'))
        credentials = GoogleCredentials.get_application_default()
    
        service = discovery.build('sqladmin', 'v1beta4', http=credentials.authorize(Http()), cache_discovery=False)
    
        datestamp = datetime.now().strftime("%Y%m%d%H%M") # format timestamp: YearMonthDayHourMinute
        uri = "{0}/backup-{1}-{2}.gz".format(pubsub_message['gs'], pubsub_message['db'], datestamp)
    
        instances_export_request_body = {
          "exportContext": {
            "kind": "sql#exportContext",
            "fileType": "SQL",
            "uri": uri,
            "databases": [
              pubsub_message['db']
            ]
          }
        }
    
        try:
          request = service.instances().export(
                project=pubsub_message['project'],
                instance=pubsub_message['instance'],
                body=instances_export_request_body
            )
          response = request.execute()
        except HttpError as err:
            logging.error("Could NOT run backup. Reason: {}".format(err))
        else:
          logging.info("Backup task status: {}".format(response))
    EOF
    
  2. 다음을 Cloud Shell에 붙여넣어 requirements.txt 파일을 만듭니다.

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. 코드를 배포합니다. 새 함수의 인증되지 않은 호출을 허용할지 묻는 메시지가 표시되면 no로 응답합니다.

    gcloud functions deploy ${GCF_NAME} \
        --trigger-topic ${PUBSUB_TOPIC} \
        --runtime python37 \
        --entry-point main \
        --service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    

Cloud Scheduler 작업 만들기

마지막으로 데이터 내보내기 함수를 주기적으로 실행하는 Cloud Scheduler 작업을 만듭니다.

  1. Cloud Scheduler 작업을 위한 App Engine 인스턴스를 만듭니다.

    gcloud app create --region=${REGION}
    
  2. 데이터 내보내기 함수를 주기적으로 실행하는 Cloud Scheduler 작업을 만듭니다.

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} --schedule '0 23 * * *' --topic ${PUBSUB_TOPIC} --message-body '{"db":"recommendation_spark","instance":'\"${SQL_INSTANCE}\"',"project":'\"${PROJECT_ID}\"',"gs":'\"gs://${BUCKET_NAME}\"'}' --time-zone 'America/Los_Angeles'
    

    이 작업은 매일 오후 11시에 실행되도록 예약되어 있습니다.

솔루션 테스트

마지막 단계는 솔루션을 테스트하는 것입니다. 먼저 Cloud Scheduler 작업을 실행합니다.

  1. Cloud Scheduler 작업을 수동으로 실행하여 데이터베이스의 MySQL 덤프를 트리거합니다.

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. MySQL 인스턴스에서 수행된 작업을 나열하고 EXPORT 유형의 작업이 있는지 확인합니다.

    gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
    

    출력에 완료된 내보내기 작업이 표시됩니다. 예를 들면 다음과 같습니다.

    NAME                                  TYPE    START                          END                            ERROR  STATUS
    8b031f0b-9d66-47fc-ba21-67dc20193749  EXPORT  2020-02-06T21:55:22.240+00:00  2020-02-06T21:55:32.614+00:00  -      DONE
    
  3. 데이터베이스 덤프 파일이 생성되었는지 확인하려면 Cloud Storage 버킷을 확인합니다.

    gsutil ls gs://${BUCKET_NAME} | grep backup-recommendation_spark
    

    이전 단계의 STATUS 작업이 DONE를 반환하면 backup-database_name-timestamp.gz이라는 파일이 표시됩니다.

삭제

다음 단계에 따라 이 가이드에서 사용된 리소스에 대해 Google Cloud 계정에 요금이 청구되지 않도록 할 수 있습니다. 비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제 를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계