이 가이드에서는 Cloud Scheduler 및 Cloud Functions를 사용하여 기본 HDD 및 기본 SSD 등급 Filestore 인스턴스의 백업을 예약하는 방법을 보여줍니다.
목표
- Cloud Functions 함수를 호출하는 데 필요한 사용자 인증 정보가 있는 Cloud Scheduler용 클라이언트 서비스 계정을 만듭니다.
- Filestore 엔드포인트를 호출하기 위한 사용자 인증 정보가 있는 Cloud Functions에서 사용할 클라이언트 서비스 계정을 만듭니다.
- 파일 공유의 백업을 만들거나 삭제하는 Cloud Functions 함수를 만듭니다.
- 정기적으로 백업 만들기(또는 백업 삭제) 함수를 실행하는 Cloud Scheduler 작업을 만듭니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Scheduler, Cloud Functions, and Filestore APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Scheduler, Cloud Functions, and Filestore APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 프로젝트에 Filestore 인스턴스가 없는 경우 먼저 이를 만들어야 합니다.
Cloud Scheduler 및 Cloud Functions용 클라이언트 서비스 계정 만들기
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"
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을 백업을 저장할 리전으로 바꿉니다.
백업을 만드는 함수 만들기
Google Cloud 콘솔에서 Cloud Functions 페이지로 이동합니다.
함수 만들기를 클릭하고 다음과 같이 함수를 구성합니다.
- 기본사항:
- 함수 이름: 이 예시에서는 함수의 이름을
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 역할 할당
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
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
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 작업 만들기
이 튜토리얼의 예시에서 매주 평일 오후 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 형식을 사용하여 작업이 실행되는 빈도를 지정합니다. 자세한 내용은 크론 작업 일정 구성을 참조하세요.이전 단계에서 만든 Cloud Scheduler 작업을 시작합니다. 이 예시에서는
scheduler jobs runs
명령어를 사용합니다.gcloud scheduler jobs run fsbackupschedule
명령어를 실행하면
fsbackupschedule
작업이 'fsbackups' 함수를 즉시 호출한 다음 작업이 일시중지될 때까지 이 함수를 매주 평일 오후 10시마다 다시 호출합니다.함수가 제대로 실행되고
status 200
을 반환하는지 확인하려면fsbackups
함수의 로그를 확인하세요.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
백업 할당량 부족 알림
백업 예약 구현으로 인해 백업 할당량이 부족해질 수 있는 경우 백업 할당량 부족 알림을 설정하는 것이 좋습니다. 이렇게 하면 백업 할당량이 부족해질 때 알림을 받을 수 있습니다.
삭제
튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하는 방법은 다음과 같습니다.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
다음 단계
- Filestore 스냅샷에 대해 알아보기
- Filestore 백업 자세히 알아보기
- Filestore Enterprise 스냅샷 예약 방법 알아보기