이 가이드에서는 Cloud Scheduler 및 Cloud Functions를 사용하여 Redis용 Memorystore 데이터베이스를 Cloud Storage에 자동으로 내보내는 방법을 보여줍니다. Cloud Storage에서 데이터베이스를 내보내면 강력하고 다양한 재해 복구 계획을 세울 수 있습니다. 예를 들어 다른 리전으로 내보내고 다른 Redis용 Memorystore 인스턴스로 가져올 수 있습니다.
아키텍처
이 가이드에는 다음과 같은 Google Cloud 구성요소가 포함됩니다.
- Cloud Scheduler 작업: 설정된 일정에 따라 호출을 실행하여 데이터베이스 내보내기를 시작하는 작업입니다.
- Cloud Functions: Memorystore에서 Cloud Storage로 데이터를 내보내는 함수입니다.
- Pub/Sub 메시지: 각 데이터 내보내기 이벤트마다 전송 및 수신되는 메시지입니다.
- Cloud Storage 버킷: 내보낸 데이터를 저장할 버킷입니다.
- Redis용 Memorystore: 데이터를 내보낼 소스 데이터베이스입니다.
Cloud Scheduler 작업은 Pub/Sub 주제에 Memorystore 인스턴스 ID, 프로젝트 ID, 현재 위치한 리전, 백업을 저장할 Cloud Storage 위치에 대한 정보가 포함된 메시지를 게시합니다. 이 이벤트는 이 페이로드를 가져오고 API를 통해 Redis용 Memorystore에서 데이터베이스 내보내기를 시작하는 Cloud 함수를 트리거합니다. 데이터베이스가 내보내기를 생성하고 Cloud Storage에 저장합니다. 다음 다이어그램은 이 워크플로를 보여줍니다.
목표
- Cloud Storage 버킷 및 Memorystore 인스턴스를 만듭니다.
- Pub/Sub 주제, Cloud 함수, Cloud Scheduler 작업을 만듭니다.
- Cloud Scheduler 작업을 수동으로 실행하여 데이터베이스 데이터 내보내기를 트리거합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
-
Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
-
Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.
-
API Memorystore for Redis, Cloud Functions, Cloud Scheduler, and Cloud Build 사용 설정
이 튜토리얼에서는 Cloud Shell에서 모든 명령어를 실행합니다.
환경 설정하기
시작하려면 먼저 환경을 구성한 후 이 가이드에 필요한 권한이 있는 커스텀 역할을 만듭니다.
Cloud Shell에서 다음 환경 변수를 구성합니다.
export PROJECT_ID=`gcloud config get-value project` export DEMO="mem-exporter" export BUCKET_NAME=${USER}-mem-$(date +%s) export MEM_INSTANCE="${DEMO}-instance" export FUNCTION_NAME="${DEMO}-gcf" export PUBSUB_TOPIC="${DEMO}-topic" export SCHEDULER_JOB="${DEMO}-job" export MEM_EXPORT_ROLE="memExporter" export STORAGE_ROLE="simpleStorageRole" export REGION="us-central1"
이 가이드에 필요한 권한만 있는 두 개의 커스텀 역할을 만듭니다.
gcloud iam roles create ${STORAGE_ROLE} --project=${PROJECT_ID} \ --title="Simple Storage Role" \ --description="Grant permissions to view and create objects in Cloud Storage" \ --permissions="storage.objects.create,storage.buckets.get" gcloud iam roles create ${MEM_EXPORT_ROLE} --project=${PROJECT_ID} \ --title="Memorystore Exporter Role" \ --description="Grant permissions to export data from a Memorystore instance to a Cloud Storage bucket" \ --permissions="redis.instances.export"
이러한 역할은 최소 권한의 원칙에 따라 Cloud Functions 및 Memorystore 서비스 계정의 액세스 범위를 줄입니다.
Cloud Storage 버킷 및 Memorystore 인스턴스 만들기
이 섹션에서는 먼저 Cloud Storage 버킷과 Redis용 Memorystore 인스턴스를 만듭니다. 그런 다음 Memorystore를 샘플 데이터로 채웁니다.
Cloud Storage 버킷 만들기
gsutil
명령줄 도구를 사용하여 Cloud Storage 버킷을 만듭니다.
데이터 내보내기를 저장할 Cloud Storage 버킷을 만듭니다.
gsutil mb -l ${REGION} gs://${BUCKET_NAME}
Memorystore 인스턴스를 만들고 서비스 계정에 권한 부여
다음으로 Memorystore 인스턴스를 만들고 서비스 계정에 Cloud Storage로 데이터를 내보낼 수 있는 권한을 부여합니다.
Redis용 Memorystore 4 인스턴스를 만듭니다.
gcloud redis instances create ${MEM_INSTANCE} --size=1 --region=${REGION}
이 작업을 완료하는 데 몇 분 정도 걸립니다.
Memorystore 인스턴스가
READY
인지 확인합니다.gcloud redis instances list --region=${REGION}
결과는 다음과 유사합니다.
INSTANCE_NAME VERSION REGION TIER SIZE_GB HOST PORT NETWORK RESERVED_IP STATUS CREATE_TIME redis-instance REDIS_4_0 us-central1 BASIC 1 10.61.20.131 6379 default 10.61.20.128/29 READY 2020-04-23T18:38:54
이전에 만든 커스텀
Simple Storage
역할을 사용하여 Memorystore 서비스 계정에 Cloud Storage로 데이터를 내보낼 수 있는 권한을 부여합니다.export MEM_SA=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} \ --project ${PROJECT_ID} \ --format "value(persistenceIamIdentity)") gsutil iam ch ${MEM_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
예약된 데이터 내보내기 태스크 만들기
이 섹션에서는 커스텀 서비스 계정을 만들고 생성한 커스텀 Redis 역할에 결합합니다. 그런 다음 Cloud 함수의 실행을 트리거하는 데 사용되는 Pub/Sub 주제를 만듭니다. 또한 데이터 내보내기 함수를 주기적으로 실행하는 Cloud Scheduler 작업을 만듭니다.
Cloud 함수의 서비스 계정 만들기
첫 번째 단계는 서비스 계정을 만들고 이를 역할에 바인딩하는 것입니다.
Cloud 함수에서 사용할 IAM 서비스 계정을 만들고 변수에 저장합니다.
gcloud iam service-accounts create ${FUNCTION_NAME} \ --display-name="Service Account for GCF and Memorystore" export GCF_SA=$(gcloud iam service-accounts list --filter="${FUNCTION_NAME}" --format="value(email)")
서비스 계정에 커스텀
Memorystore Exporter
역할에 대한 액세스 권한을 부여하여 Memorystore 내보내기를 요청할 수 있도록 합니다.gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${GCF_SA}" \ --role="projects/${PROJECT_ID}/roles/${MEM_EXPORT_ROLE}"
커스텀
Simple Storage
역할에 대한 액세스 권한을 서비스 계정에 부여합니다.gsutil iam ch \ serviceAccount:${GCF_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} \ gs://${BUCKET_NAME}
Pub/Sub 주제 만들기
다음 단계는 Memorystore 데이터베이스와 상호작용하는 Cloud 함수를 트리거하는 데 사용되는 Pub/Sub 주제를 만드는 것입니다.
Pub/Sub 주제를 만듭니다.
gcloud pubsub topics create ${PUBSUB_TOPIC}
Cloud 함수 만들기
다음으로 Cloud 함수를 만듭니다.
Cloud 함수 코드 폴더를 만듭니다.
mkdir scheduler_gcf_code && cd scheduler_gcf_code
다음을 Cloud Shell에 붙여넣어
main.py
파일을 만듭니다.cat <<EOF > main.py import base64 import logging import json from datetime import datetime from httplib2 import Http from googleapiclient import discovery from googleapiclient.errors import HttpError from oauth2client.client import GoogleCredentials def main(event, context): pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8')) credentials = GoogleCredentials.get_application_default() service = discovery.build('redis', 'v1beta1', http=credentials.authorize(Http()), cache_discovery=False) datestamp = datetime.now().strftime("%Y%m%d%H%M") # format timestamp: YearMonthDayHourMinute instance_name=pubsub_message['name'].split("/")[-1] uri = f"{pubsub_message['gs']}/backup-{instance_name}-{datestamp}.rdb" request_body = { "outputConfig": { "gcsDestination" : { "uri": uri } } } try: request = service.projects().locations().instances().export( name=pubsub_message['name'], body=request_body ) response = request.execute() except HttpError as err: logging.error(f"Could NOT run backup. Reason: {err}") else: logging.info(f"Backup task status: {response}") EOF
다음을 Cloud Shell에 붙여넣어
requirements.txt
파일을 만듭니다.cat <<EOF > requirements.txt google-api-python-client Oauth2client EOF
코드를 배포합니다.
gcloud functions deploy ${FUNCTION_NAME} \ --trigger-topic=${PUBSUB_TOPIC} \ --runtime=python37 \ --entry-point=main \ --service-account=${FUNCTION_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \ --ingress-settings=internal-and-gclb
Cloud Scheduler 작업 만들기
마지막으로 데이터 내보내기 함수를 주기적으로 실행하는 Cloud Scheduler 작업을 만듭니다.
Memorystore 전체 이름을 변수에 저장합니다.
export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
데이터 내보내기 함수를 주기적으로 실행하는 Cloud Scheduler 작업을 만듭니다.
gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \ --schedule='0 23 * * *' --topic=${PUBSUB_TOPIC} \ --message-body='{"name":'\"${MEM_NAME}\"',"gs":'\"gs://${BUCKET_NAME}\"'}' \ --time-zone='America/Los_Angeles' --location=${REGION}
이 작업은 매일 오후 11시(태평양 표준시)에 실행되도록 예약되어 있습니다.
메시지 본문에는 내보낼 Memorystore 인스턴스의 이름과 대상 Cloud Storage 버킷이 포함됩니다.
솔루션 테스트
마지막 단계는 솔루션을 테스트하는 것입니다. 먼저 Cloud Scheduler 작업을 실행합니다.
Cloud Scheduler 작업을 수동으로 실행하여 데이터베이스의 Memorystore 내보내기를 트리거합니다.
gcloud scheduler jobs run ${SCHEDULER_JOB} --location=${REGION}
Memorystore 인스턴스에서 수행된 작업을 나열하고
EXPORT
유형의 작업이 있는지 확인합니다.gcloud redis operations list --region=${REGION} --filter="${MEM_INSTANCE}"
다음 출력 예시는
DONE
상태가 완료되었음을 나타내는True
인 내보내기 작업을 보여줍니다.DONE
상태에False
가 표시되면 작업이 아직 처리 중이라는 의미입니다. 1분 정도 기다린 후 이전 명령어를 다시 실행합니다.OPERATION_NAME REGION TYPE TARGET DONE CREATE_TIME DURATION operation-1592329364987-5a837122a600c-b22c2703-5077c6b7 us-central1 export mem-exporter-instance True 2020-06-16T17:42:45 16S
내보내기 파일이 생성되었는지 확인하려면 Cloud Storage 버킷을 확인합니다.
gsutil ls -l gs://${BUCKET_NAME}/*.rdb
backup-INSTANCE_NAME-TIMESTAMP.rdb
라는 파일이 표시됩니다.
삭제
다음 단계에 따라 이 튜토리얼에서 사용된 리소스에 대해 Google Cloud 계정에 요금이 청구되지 않도록 할 수 있습니다. 비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.
다음 단계
- Cloud Scheduler를 사용하여 컴퓨팅 인스턴스를 예약하는 방법 알아보기
- Cloud Scheduler를 사용하여 Cloud SQL 데이터베이스 내보내기 예약에 대해 알아보기
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기. Cloud 아키텍처 센터 살펴보기