이 튜토리얼에서는 Cloud Scheduler 및 Cloud Run Functions를 사용하여 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.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 함수 페이지로 이동합니다.
함수 작성을 클릭하고 다음과 같이 함수를 구성합니다.
- 구성:
- 서비스 이름: 이 예시에서는 함수의 이름을
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.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/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
백업 할당량 부족 알림
백업 예약 구현으로 인해 백업 할당량이 부족해질 수 있는 경우 백업 할당량 부족 알림을 설정하는 것이 좋습니다. 이렇게 하면 백업 할당량이 부족해질 때 알림을 받을 수 있습니다.