백업 예약


이 가이드에서는 Cloud Scheduler 및 Cloud Functions를 사용하여 기본 HDD 및 기본 SSD 등급 Filestore 인스턴스의 백업을 예약하는 방법을 보여줍니다.

목표

  • Cloud Functions 함수를 호출하는 데 필요한 사용자 인증 정보가 있는 Cloud Scheduler용 클라이언트 서비스 계정을 만듭니다.
  • Filestore 엔드포인트를 호출하기 위한 사용자 인증 정보가 있는 Cloud Functions에서 사용할 클라이언트 서비스 계정을 만듭니다.
  • 파일 공유의 백업을 만들거나 삭제하는 Cloud Functions 함수를 만듭니다.
  • 정기적으로 백업 만들기(또는 백업 삭제) 함수를 실행하는 Cloud Scheduler 작업을 만듭니다.

비용

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

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

시작하기 전에

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

  4. Enable the Cloud Scheduler, Cloud Functions, and Filestore APIs.

    Enable the APIs

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

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

    Go to project selector

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

  9. Enable the Cloud Scheduler, Cloud Functions, and Filestore APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 프로젝트에 Filestore 인스턴스가 없는 경우 먼저 이를 만들어야 합니다.

Cloud Scheduler 및 Cloud Functions용 클라이언트 서비스 계정 만들기

  1. Cloud Scheduler가 Cloud Functions 함수를 호출하기 위해 실행하는 클라이언트 서비스 계정을 만듭니다. 이 예시에서는 iam service-accounts create 명령어를 사용하여 계정 이름을 schedulerunner로 지정하고 표시 이름을 'Service Account for FS Backups-Scheduler'로 설정합니다.

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  2. Cloud Functions가 Filestore 엔드포인트를 호출하기 위해 실행하는 클라이언트 서비스 계정을 만듭니다. 이 예시에서는 계정의 이름을 backupagent로 지정하고 표시 이름을 'Service Account for FS Backups-GCF'로 설정합니다.

    gcloud iam service-accounts create backupagent \
        --display-name="Service Account for FS Backups-GCF"
    

    iam service-accounts list 명령어를 실행하여 서비스 계정이 생성되었는지 여부를 확인할 수 있습니다.

    gcloud iam service-accounts list
    

    이 명령어는 다음과 같은 결과를 반환합니다.

    NAME                                         EMAIL                                                   DISABLED
    Service Account for FS Backups-GCF           backupagent@$PROJECT_ID.iam.gserviceaccount.com         False
    Service Account for FS Backups-Scheduler     schedulerunner@$PROJECT_ID.iam.gserviceaccount.com      False
    

환경 변수 설정

로컬 환경에서 다음 환경 변수를 설정합니다.

  • Google Cloud 프로젝트 ID 및 프로젝트:

    export PROJECT_ID=`gcloud config get-value core/project`
    export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format='value(projectNumber)'`
    
  • Cloud Scheduler 서비스 에이전트 및 Cloud Scheduler 및 Cloud Functions의 클라이언트 서비스 계정:

    export SCHEDULER_SA=service-$PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
    export SCHEDULER_CLIENT_SA=schedulerunner@$PROJECT_ID.iam.gserviceaccount.com
    export GCF_CLIENT_SA=backupagent@$PROJECT_ID.iam.gserviceaccount.com
    
  • Filestore 인스턴스:

    export FS_ZONE=zone
    export INSTANCE_NAME=instance-id
    export SHARE_NAME=datafile-share-name
    

    다음을 바꿉니다.

    • zone은 Filestore 인스턴스가 있는 영역입니다.
    • instance-id는 Filestore 인스턴스의 인스턴스 ID입니다.
    • file-share-name은 인스턴스에서 제공하는 NFS 파일 공유에 지정하는 이름입니다.
  • Filestore 백업의 환경 변수를 설정합니다.

    export FS_BACKUP_LOCATION=region
    

    region을 백업을 저장할 리전으로 바꿉니다.

백업을 만드는 함수 만들기

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

    Cloud Functions 페이지로 이동

  2. 함수 만들기를 클릭하고 다음과 같이 함수를 구성합니다.

    • 기본사항:
      • 함수 이름: 이 예시에서는 함수의 이름을 fsbackup으로 지정합니다.
      • 리전: 이 예시에서는 us-central1을 사용합니다.
    • 트리거:
      • 트리거 유형: HTTP.
      • 인증: Require authentication.
    • 런타임, 빌드, 연결 설정:
      • 런타임 서비스 계정: Service Account for FS Backups-GCF(backupagent@$PROJECT_ID.iam.gserviceaccount.com).
      • 인그레스 설정: Allow all traffic.
    • 소스 코드: Inline editor.
    • 런타임: Python 3.7.
    • 진입점: create_backup
    • requirements.txt에서 다음 종속 항목을 추가합니다.

      google-auth==1.19.2
      requests==2.24.0
      
    • 다음 Python 코드 샘플을 main.py 인라인 편집기에 복사합니다.

      백업 만들기

      이 코드 샘플에서는 만든 시간에 함께 추가된 mybackup-라는 백업을 만듭니다.

      PROJECT_ID = 'project-id'
      SOURCE_INSTANCE_ZONE = 'filestore-zone'
      SOURCE_INSTANCE_NAME = 'filestore-name'
      SOURCE_FILE_SHARE_NAME = 'file-share-name'
      BACKUP_REGION = 'backup-region'
      
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      def get_backup_id():
          return "mybackup-" + time.strftime("%Y%m%d-%H%M%S")
      
      def create_backup(request):
          trigger_run_url = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups?backupId={}".format(PROJECT_ID, BACKUP_REGION, get_backup_id())
          headers = {
            'Content-Type': 'application/json'
          }
          post_data = {
            "description": "my new backup",
            "source_instance": "projects/{}/locations/{}/instances/{}".format(PROJECT_ID, SOURCE_INSTANCE_ZONE, SOURCE_INSTANCE_NAME),
            "source_file_share": "{}".format(SOURCE_FILE_SHARE_NAME)
          }
          print("Making a request to " + trigger_run_url)
          r = authed_session.post(url=trigger_run_url, headers=headers, data=json.dumps(post_data))
          data = r.json()
          print(data)
          if r.status_code == requests.codes.ok:
            print(str(r.status_code) + ": The backup is uploading in the background.")
          else:
            raise RuntimeError(data['error'])
      

      다음을 바꿉니다.

      • project-id를 소스 Filestore 인스턴스의 Google Cloud 프로젝트 ID로 바꿉니다.
      • filestore-zone을 소스 Filestore 인스턴스의 영역으로 바꿉니다.
      • filestore-name을 소스 Filestore 인스턴스의 이름으로 바꿉니다.
      • file-share-name을 파일 공유 이름으로 바꿉니다.
      • backup-region을 백업을 저장할 리전으로 바꿉니다.

      백업 삭제

      이 코드 샘플에서는 사전 정의된 기간이 지난 백업을 삭제합니다.

      다음을 제외하고 백업 만들기 함수와 같은 방식으로 이 함수를 구성합니다.

      • 함수 이름: deletefsbackups
      • 진입점: delete_backup
      PROJECT_ID = 'project-id'
      BACKUP_REGION = 'region'
      BACKUP_RETENTION_TIME_HRS = hours
      
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      now = time.time()
      retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
      
      def delete_backup(request):
          list = []
          trigger_run_url = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups".format(PROJECT_ID, BACKUP_REGION)
          r = authed_session.get(trigger_run_url)
          data = r.json()
          if not data:
              print("No backups to delete.")
          else:
              list.extend(data['backups'])
              while 'nextPageToken' in data.keys():
                  nextPageToken = data['nextPageToken']
                  trigger_run_url_next = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                  r = authed_session.get(trigger_run_url_next)
                  data = r.json()
                  list.extend(data['backups'])
          for i in list:
              backup_time = i['createTime']
              backup_time = backup_time[:-4]
              backup_time = float(time.mktime(time.strptime(backup_time, "%Y-%m-%dT%H:%M:%S.%f")))
              if now - backup_time > retention_seconds:
                  print("Deleting " + i['name'] + " in the background.")
                  r = authed_session.delete("https://file.googleapis.com/v1beta1/{}".format(i['name']))
                  data = r.json()
                  print(data)
                  if r.status_code == requests.codes.ok:
                    print(str(r.status_code) + ": Deleting " + i['name'] + " in the background.")
                  else:
                    raise RuntimeError(data['error'])
      

      다음을 바꿉니다.

      • project-id를 백업의 Google Cloud 프로젝트 ID로 바꿉니다.
      • region을 해당 백업이 있는 리전으로 바꿉니다.
      • hours를 백업을 보관할 시간으로 바꿉니다. 예를 들어 10일 동안 백업을 보관하려면 240을 입력합니다.

클라이언트 서비스 계정에 IAM 역할 할당

  1. Cloud Scheduler 서비스 에이전트를 roles/cloudscheduler.serviceAgent 역할이 있는 Cloud Scheduler 클라이언트 서비스 계정의 IAM 정책에 추가합니다. 이렇게 하면 서비스 에이전트가 백업을 만드는 함수를 호출하기 위해 클라이언트 서비스 계정을 가장할 수 있습니다. iam service-accounts add-iam-policy-binding 명령어를 실행합니다.

    gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \
        --member=serviceAccount:$SCHEDULER_SA \
        --role=roles/cloudscheduler.serviceAgent
    
  2. Cloud Functions의 클라이언트 서비스 계정에 Filestore 엔드포인트를 호출할 수 있도록 roles/file.editor 역할을 부여합니다. projects add-iam-policy-binding 명령어를 실행합니다.

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$GCF_CLIENT_SA \
        --role=roles/file.editor
    
  3. Cloud Scheduler의 클라이언트 서비스 계정에 fsbackup 함수의 roles/cloudfunctions.invoker 역할을 부여합니다. 다음 functions add-iam-policy-binding 명령어를 실행합니다.

    gcloud functions add-iam-policy-binding fsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/cloudfunctions.invoker
    

    이제 Cloud Scheduler의 클라이언트 서비스 계정만 fsbackup을 호출할 수 있습니다.

지정된 일정에 따라 fsbackup 함수를 트리거하는 Cloud Scheduler 작업 만들기

  1. 이 튜토리얼의 예시에서 매주 평일 오후 10시마다 백업을 예약하려면 scheduler jobs create http 명령어를 사용합니다.

    gcloud beta scheduler jobs create http fsbackupschedule \
        --schedule "0 22 * * 1-5" \
        --http-method=GET \
        --uri=https://us-central1-$PROJECT_ID.cloudfunctions.net/fsbackup \
        --oidc-service-account-email=$SCHEDULER_CLIENT_SA    \
        --oidc-token-audience=https://us-central1-$PROJECT_ID.cloudfunctions.net/fsbackup
    

    --schedule 플래그는 unix-cron 형식을 사용하여 작업이 실행되는 빈도를 지정합니다. 자세한 내용은 크론 작업 일정 구성을 참조하세요.

  2. 이전 단계에서 만든 Cloud Scheduler 작업을 시작합니다. 이 예시에서는 scheduler jobs runs 명령어를 사용합니다.

    gcloud scheduler jobs run fsbackupschedule
    

    명령어를 실행하면 fsbackupschedule 작업이 'fsbackups' 함수를 즉시 호출한 다음 작업이 일시중지될 때까지 이 함수를 매주 평일 오후 10시마다 다시 호출합니다.

  3. 함수가 제대로 실행되고 status 200을 반환하는지 확인하려면 fsbackups 함수의 로그를 확인하세요.

  4. backups list 명령어를 사용하여 백업이 생성되었는지 확인합니다.

    gcloud beta filestore backups list
    

    이 명령어는 다음과 비슷한 결과를 반환합니다.

    NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
    mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
    

백업 할당량 부족 알림

백업 예약 구현으로 인해 백업 할당량이 부족해질 수 있는 경우 백업 할당량 부족 알림을 설정하는 것이 좋습니다. 이렇게 하면 백업 할당량이 부족해질 때 알림을 받을 수 있습니다.

삭제

튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

다음 단계