이 튜토리얼에서는 Cloud Scheduler 및 Cloud Run 함수를 사용하여 Filestore 인스턴스의 백업을 예약하는 방법을 보여줍니다.
목표
- Cloud Run 함수를 호출하는 데 필요한 사용자 인증 정보가 있는 Cloud Scheduler용 클라이언트 서비스 계정을 만듭니다.
- Filestore 엔드포인트를 호출하기 위한 사용자 인증 정보가 있는 Cloud Run 함수용 클라이언트 서비스 계정을 만듭니다.
- 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
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure 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.
- 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.
-
Make sure 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 프로젝트에 Filestore 인스턴스가 없는 경우 먼저 이를 만들어야 합니다.
Cloud Scheduler 및 Cloud Run 함수용 클라이언트 서비스 계정 만들기
아직 Cloud Shell을 활성화하지 않았다면 Google Cloud 콘솔에서 Cloud Shell 활성화를 클릭합니다.
Cloud Scheduler가 Cloud Run 함수 함수를 호출하기 위해 실행하는 클라이언트 서비스 계정을 만듭니다. 이 예시에서는
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 함수의 클라이언트 서비스 계정:
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 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-region
backup-region을 백업을 저장할 리전으로 바꿉니다.
백업을 만드는 함수 만들기
Google Cloud 콘솔에서 Cloud Run 함수 페이지로 이동합니다.
함수 만들기를 클릭하고 다음과 같이 함수를 구성합니다.
- 기본사항:
- 환경: 이 예에서는 기본값인
2nd gen
를 선택합니다. - 함수 이름: 이 예시에서는 함수의 이름을
fsbackup
으로 지정합니다. - 리전: 이 예시에서는
us-central1
을 선택합니다.
- 환경: 이 예에서는 기본값인
- 트리거:
- 트리거 유형: 메뉴에서
HTTPS
를 선택합니다. - 인증:
Require authentication
를 선택합니다.
- 트리거 유형: 메뉴에서
- 런타임, 빌드, 연결, 보안 설정:
- 런타임 > 런타임 서비스 계정 > 서비스 계정: 메뉴에서
Service Account for FS Backups-GCF
(backupagent@$PROJECT_ID.iam.gserviceaccount.com
)를 선택합니다. - 연결 > 인그레스 설정:
Allow all traffic
을 선택합니다.
- 런타임 > 런타임 서비스 계정 > 서비스 계정: 메뉴에서
- 기본사항:
다음을 클릭하고 다음과 같이 구성을 계속합니다.
- 런타임: 메뉴에서
Python 3.8
또는 이후 버전(Cloud Run 함수에서 완전히 지원됨)을 선택합니다. - 소스 코드:
Inline editor
. - 진입점:
create_backup
을 입력합니다. requirements.txt
파일에 다음 종속 항목을 추가합니다.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 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/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에서 새 탭 세션이 열립니다. 성공하면 다음 메시지가 반환됩니다.
Function is ready to test.
배포를 클릭하고 배포가 완료될 때까지 기다립니다.
이전 Cloud Shell 탭으로 다시 전환합니다.
백업 삭제
이 코드 샘플에서는 사전 정의된 기간이 지난 백업을 삭제합니다.
한 번에 소스 인스턴스당 백업 1개만 삭제할 수 있습니다. 자세한 내용은 백업을 참고하세요.
다음과 같이 수정하여 백업을 만드는 데 사용한 함수와 동일한 방식으로 이 함수를 구성합니다.
- 함수 이름:
deletefsbackup
- 진입점:
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) retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60 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.serviceAgent
Cloud 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/cloudfunctions.invoker
역할을 부여합니다. 다음functions add-iam-policy-binding
명령어를 실행합니다.백업 만들기
gcloud functions add-iam-policy-binding fsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/cloudfunctions.invoker
기본 Cloud Run 서비스에
roles/run.invoker
역할이 부여되어야 하며gcloud functions add-invoker-policy-binding
명령어를 실행하여 적용할 수 있음을 나타내는 메시지가 표시됩니다. 응답하라는 메시지가 표시되면Y
를 입력합니다.이제 Cloud Scheduler의 클라이언트 서비스 계정만
fsbackup
을 호출할 수 있습니다.백업 삭제
gcloud functions add-iam-policy-binding deletefsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/cloudfunctions.invoker
기본 Cloud Run 서비스에
roles/run.invoker
역할이 부여되어야 하며gcloud functions add-invoker-policy-binding
명령어를 실행하여 적용할 수 있음을 나타내는 메시지가 표시됩니다. 응답하라는 메시지가 표시되면Y
를 입력합니다.이제 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://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 형식을 사용하여 작업이 실행되는 빈도를 지정합니다. 자세한 내용은 크론 작업 일정 구성을 참조하세요.인스턴스당 시간당 최대 6개의 백업을 만들 수 있습니다.
이전 단계에서 만든 Cloud Scheduler 작업을 시작합니다. 이 예에서는
scheduler jobs runs
명령어를 사용하여 즉시 실행합니다.gcloud scheduler jobs run fsbackupschedule
명령어를 실행하면
fsbackupschedule
작업은fsbackup
함수를 즉시 호출한 다음 작업이 일시중지될 때까지 이 함수를 매주 평일 오후 10시마다 다시 호출합니다.fsbackup
함수가 제대로 실행되고status 200
을 반환하는지 확인하려면fsbackup
함수의 로그를 확인하세요.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
을 반환하는지 확인하려면deletefsbackup
함수의 로그를 확인하세요.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
백업 할당량 부족 알림
백업 예약 구현으로 인해 백업 할당량이 부족해질 수 있는 경우 백업 할당량 부족 알림을 설정하는 것이 좋습니다. 이렇게 하면 백업 할당량이 부족해질 때 알림을 받을 수 있습니다.
삭제
튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하는 방법은 다음과 같습니다.
- 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 스냅샷을 예약하는 방법을 알아보세요.