이 튜토리얼에서는 Cloud Scheduler 및 Cloud Run Functions를 사용하여 Filestore 인스턴스의 백업을 예약하는 방법을 보여줍니다.
관리 서비스 스케줄러를 사용하여 백업을 만드는 방법에 대한 자세한 내용은 Filestore 고급 백업을 참고하세요.
목표
- Cloud Run 함수를 호출하는 데 필요한 사용자 인증 정보가 있는 Cloud Scheduler용 클라이언트 서비스 계정을 만듭니다.
- Filestore 엔드포인트를 호출하기 위한 사용자 인증 정보가 있는 Cloud Run Functions용 클라이언트 서비스 계정을 만듭니다.
- Filestore 인스턴스의 백업을 만드는 Cloud Run 함수를 만듭니다.
- Filestore 인스턴스의 백업을 삭제하는 Cloud Run 함수를 만듭니다.
- 정기적으로 두 함수 중 하나를 실행하는 Cloud Scheduler 작업을 만듭니다.
비용
이 문서에서는 비용이 청구될 수 있는 Google Cloud구성요소를 사용합니다.
- Artifact Registry API
- Cloud Build API
- Filestore API
- Cloud Functions API
- Cloud Logging API
- Pub/Sub API
- Cloud Run Admin API
- Cloud Scheduler API
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI를 설치합니다.
-
외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.
-
gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI를 설치합니다.
-
외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.
-
gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.
gcloud init - 프로젝트에 Filestore 인스턴스가 없는 경우 먼저 이를 만들어야 합니다.
Cloud Scheduler 및 Cloud Run 함수용 클라이언트 서비스 계정 만들기
아직 하지 않았다면 Google Cloud 콘솔에서 Cloud Shell 활성화를 클릭합니다.
Cloud Scheduler가 Cloud Run 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 Run 함수가 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 Run 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.comFilestore 인스턴스:
export SOURCE_INSTANCE_LOCATION=fs-location export SOURCE_INSTANCE_NAME=instance-id export SHARE_NAME=file-share-name다음을 바꿉니다.
- fs-location을 소스 Filestore 인스턴스가 있는 영역 또는 리전으로 바꿉니다.
- instance-id을 소스 Filestore 인스턴스의 인스턴스 ID로 바꿉니다.
- file-share-name은 인스턴스에서 제공하는 NFS 파일 공유에 지정하는 이름입니다.
Filestore 백업의 환경 변수를 설정합니다.
export BACKUP_REGION=backup-regionbackup-region을 백업을 저장할 리전으로 바꿉니다.
백업을 만드는 함수 만들기
Google Cloud 콘솔에서 Cloud Run Functions 페이지로 이동합니다.
함수 작성을 클릭하고 다음과 같이 함수를 구성합니다.
- 구성:
- 서비스 이름: 이 예시에서는 함수의 이름을
fsbackup으로 지정합니다. - 리전: 이 예시에서는
us-central1을 선택합니다. - 런타임: 메뉴에서 Cloud Run Functions에서 완전히 지원되는 지원되는 Python 3 런타임을 선택합니다.
- 서비스 이름: 이 예시에서는 함수의 이름을
- 트리거:
- 이 예시에서는 트리거를 설정하지 않아도 됩니다.
- 인증:
Require authentication를 선택합니다. - 인그레스:
All를 선택합니다. - 컨테이너, 볼륨, 네트워킹, 보안
- 보안 탭으로 이동하여 메뉴에서
Service Account for FS Backups-GCF(backupagent@$PROJECT_ID.iam.gserviceaccount.com)를 선택합니다.
- 보안 탭으로 이동하여 메뉴에서
- 구성:
만들기를 클릭하고 다음과 같이 구성을 계속합니다.
- 함수 진입점:
create_backup를 입력합니다. requirements.txt파일에 다음 종속 항목을 추가합니다.functions-framework==3.* google-auth==2.29.0 requests==2.31.0사용 사례에 따라 해당 버전 번호와 함께 다른 종속 항목을 지정해야 할 수도 있습니다. 자세한 내용은 사전 설치된 패키지를 참고하세요.
인라인 편집기를 사용하여 다음 Python 코드 샘플을
main.py파일에 복사합니다.백업 만들기
이 코드 샘플에서는 만든 시간에 함께 추가된
mybackup-라는 백업을 만듭니다.PROJECT_ID = 'project-id' SOURCE_INSTANCE_LOCATION = 'fs-location' SOURCE_INSTANCE_NAME = 'instance-id' SOURCE_FILE_SHARE_NAME = 'file-share-name' BACKUP_REGION = 'backup-region' import functions_framework 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") @functions_framework.http def create_backup(request): trigger_run_url = "https://file.googleapis.com/v1/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_LOCATION, 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']) return "Backup creation has begun!"다음을 바꿉니다.
- project-id를 소스 Filestore 인스턴스의 Google Cloud 프로젝트 ID로 바꿉니다.
- fs-location을 소스 Filestore 인스턴스의 영역 또는 리전으로 바꿉니다.
- instance-id을 소스 Filestore 인스턴스의 이름으로 바꿉니다.
- file-share-name을 파일 공유 이름으로 바꿉니다.
- backup-region을 백업을 저장할 리전으로 바꿉니다.
테스트를 클릭합니다.
Cloud Shell에서 새 탭 세션이 열립니다. 성공하면 다음 메시지가 반환됩니다.
Backup creation has begun!저장 및 재배포를 클릭하고 배포가 완료될 때까지 기다립니다.
이전 Cloud Shell 탭으로 다시 전환합니다.
백업 삭제
이 코드 샘플에서는 사전 정의된 기간이 지난 백업을 삭제합니다.
한 번에 소스 인스턴스당 하나의 백업만 삭제할 수 있습니다. 자세한 내용은 백업을 참고하세요.
다음 수정사항을 사용하여 백업을 만드는 데 사용한 함수와 같은 방식으로 이 함수를 구성합니다.
- 함수 이름:
deletefsbackup - 진입점:
delete_backup
PROJECT_ID = 'project-id' BACKUP_REGION = 'region' BACKUP_RETENTION_TIME_HRS = hours import functions_framework 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) retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60 @functions_framework.http def delete_backup(request): now = time.time() backup_list = [] trigger_run_url = "https://file.googleapis.com/v1/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.") return "No backups to delete." else: backup_list.extend(data['backups']) while "nextPageToken" in data.keys(): nextPageToken = data['nextPageToken'] trigger_run_url_next = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken) r = authed_session.get(trigger_run_url_next) data = r.json() backup_list.extend(data['backups']) for i in backup_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"))) i['backup_timestamp'] = backup_time sorted_backup_list = sorted(backup_list, key=lambda d: d['backup_timestamp']) oldest_backup = sorted_backup_list[0] if now - oldest_backup['backup_timestamp'] > retention_seconds: print(oldest_backup['name'] + " is older than the indicated retention time.") r = authed_session.delete("https://file.googleapis.com/v1/{}".format(oldest_backup['name'])) data = r.json() print(data) if r.status_code == requests.codes.ok: print(str(r.status_code) + ": Deleting " + oldest_backup['name'] + " in the background.") else: raise RuntimeError(data['error']) return "Backup deletion has begun!" return "All backups are within the indicated retention period."다음을 바꿉니다.
- 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.serviceAgentCloud Run 함수의 클라이언트 서비스 계정에 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 클라이언트 서비스 계정에
roles/run.invoker역할을 부여합니다. 다음run services add-iam-policy-binding명령어를 실행합니다.백업 만들기
gcloud run services add-iam-policy-binding fsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/run.invoker \ --region=us-central1이제 Cloud Scheduler의 클라이언트 서비스 계정만
fsbackup을 호출할 수 있습니다.백업 삭제
gcloud run services add-iam-policy-binding deletefsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/run.invoker이제 Cloud Scheduler의 클라이언트 서비스 계정만
deletefsbackup을 호출할 수 있습니다.
지정된 일정에 따라 함수를 트리거하는 Cloud Scheduler 작업 만들기
백업 만들기
이 튜토리얼의 예시에서 매주 평일 오후 10시마다 백업을 예약하려면
scheduler jobs create http명령어를 사용합니다.gcloud scheduler jobs create http fsbackupschedule \ --schedule "0 22 * * 1-5" \ --http-method=GET \ --uri=https://fsbackup-$PROJECT_NUMBER.us-central1.run.app \ --oidc-service-account-email=$SCHEDULER_CLIENT_SA \ --location=us-central1--schedule플래그는 unix-cron 형식을 사용하여 작업이 실행되는 빈도를 지정합니다. 자세한 내용은 크론 작업 일정 구성을 참조하세요.인스턴스당 시간당 최대 6개의 백업을 만들 수 있습니다.
이전 단계에서 만든 Cloud Scheduler 작업을 시작합니다. 이 예에서는
scheduler jobs runs명령어를 사용하여 즉시 실행합니다.gcloud scheduler jobs run fsbackupschedule명령어를 실행하면
fsbackupschedule작업이fsbackup함수를 즉시 호출한 다음 작업이 일시중지될 때까지 이 함수를 매주 평일 오후 10시마다 다시 호출합니다.fsbackup함수의 로그를 확인하여 함수가 제대로 실행되고status 200을 반환하는지 확인합니다.Google Cloud 콘솔에서 로그를 보려면 로그 탐색기를 사용합니다.
-
Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.
검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Logging인 결과를 선택합니다.
가장 최근 로그가 쿼리 결과 창에 표시됩니다.
-
backups list명령어를 사용하여 기존 백업의 상태를 확인합니다.gcloud filestore backups list이 명령어는 다음과 비슷한 결과를 반환합니다.
NAME LOCATION SRC_INSTANCE SRC_FILE_SHARE STATE mybackup-20201123-184500 us-central1 us-central1-c/instances/nfs-server vol1 READY
백업 삭제
이 튜토리얼의 예시에서 매주 평일 오후 10시마다 백업을 삭제하는 작업을 예약하려면
scheduler jobs create http명령어를 사용합니다.gcloud scheduler jobs create http deletefsbackupschedule \ --schedule "0 22 * * 1-5" \ --http-method=GET \ --uri=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup \ --oidc-service-account-email=$SCHEDULER_CLIENT_SA \ --oidc-token-audience=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup--schedule플래그는 unix-cron 형식을 사용하여 작업이 실행되는 빈도를 지정합니다. 자세한 내용은 크론 작업 일정 구성을 참조하세요.동일한 소스 인스턴스와 연결된 백업
delete작업은 한 번에 하나씩 실행해야 합니다. 자세한 내용은 백업을 참고하세요.이전 단계에서 만든 Cloud Scheduler 작업을 시작합니다. 이 예시에서는
scheduler jobs runs명령어를 사용하여 즉시 실행합니다.gcloud scheduler jobs run deletefsbackupschedule명령어를 실행하면
deletefsbackupschedule작업이deletefsbackup함수를 즉시 호출한 다음 작업이 일시중지될 때까지 이 함수를 매주 평일 오후 10시마다 다시 호출합니다.deletefsbackup함수의 로그를 확인하여 함수가 제대로 실행되고status 200을 반환하는지 확인합니다.Google Cloud 콘솔에서 로그를 보려면 로그 탐색기를 사용합니다.
-
Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.
검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Logging인 결과를 선택합니다.
가장 최근 로그가 쿼리 결과 창에 표시됩니다.
-
backups list명령어를 사용하여 기존 백업의 상태를 확인합니다.gcloud filestore backups list이 명령어는 다음과 비슷한 결과를 반환합니다.
NAME LOCATION SRC_INSTANCE SRC_FILE_SHARE STATE mybackup-20201123-184500 us-central1 us-central1-c/instances/nfs-server vol1 READY
백업 할당량 부족 알림
백업 예약 구현으로 인해 백업 할당량이 부족해질 수 있는 경우 백업 할당량 부족 알림을 설정하는 것이 좋습니다. 이렇게 하면 백업 할당량이 부족해질 때 알림을 받을 수 있습니다.
삭제
튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션에서는 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하는 방법은 다음과 같습니다.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.
다음 단계
- Filestore 스냅샷에 대해 알아보기
- Filestore 백업 자세히 알아보기
- Filestore Enterprise 스냅샷을 예약하는 방법을 알아봅니다.