백업 예약

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

목표

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

비용

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

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

시작하기 전에

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

    프로젝트 선택기로 이동

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

  4. Cloud Scheduler, Cloud Functions, and Filestore API를 사용 설정합니다.

    API 사용 설정

  5. Cloud SDK 설치 및 초기화
  6. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

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

  8. Cloud Scheduler, Cloud Functions, and Filestore API를 사용 설정합니다.

    API 사용 설정

  9. Cloud SDK 설치 및 초기화
  10. 프로젝트에 Filestore 인스턴스가 없는 경우 먼저 이를 만들어야 합니다.

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

  1. Cloud Scheduler가 Cloud Functions 함수를 호출하기 위해 실행하는 클라이언트 서비스 계정을 만듭니다. 이 예시에서는 계정의 이름을 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"
    

    다음을 실행하여 서비스 계정이 만들어졌는지 확인할 수 있습니다.

    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 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. Cloud Console에서 Cloud Functions 페이지로 이동합니다.

    Cloud Functions 페이지로 이동

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

    • 기본사항:
      • 함수 이름: 이 예시에서는 함수의 이름을 fsbackup으로 지정합니다.
      • 리전: 이 예시에서는 us-central1을 사용합니다.
    • 트리거:
      • 트리거 유형: HTTP.
      • 인증: Require authentication.
    • 런타임, 빌드, 연결 설정:
      • 런타임 서비스 계정: Service Account for FS Backups-GCF(backupagent@$PROJECT_ID.iam.gserviceaccount.com).
    • 소스 코드: 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 역할을 부여합니다.

    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 역할을 부여합니다.

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

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

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

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

  1. 이 가이드의 예시에서 15분마다 백업을 예약하려면 명령어는 다음과 같습니다.

    gcloud beta scheduler jobs create http fsbackupschedule \
        --schedule "15 * * * *" \
        --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 작업을 시작합니다. 이 예시에서는 다음 명령어를 사용합니다.

    gcloud scheduler jobs run fsbackupschedule
    

    명령어를 실행하면 fsbackupschedule 작업은 'fsbackups' 함수를 즉시 호출한 다음 작업이 일시중지될 때까지 이 함수를 15분마다 다시 호출합니다.

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

  4. 백업이 만들어졌는지 확인합니다.

    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. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

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

다음 단계

  • Google Cloud에 대한 참조 아키텍처, 다이어그램, 튜토리얼, 권장사항 살펴보기. Cloud 아키텍처 센터 살펴보기