이 튜토리얼에서는 리소스 라벨을 사용해서 정기적으로 Compute Engine 인스턴스를 자동 시작 및 중지하기 위해 Cloud Scheduler 및 Cloud Run 함수를 사용하는 방법을 보여줍니다.
목표
- Cloud Run 함수를 사용하여 Compute Engine 인스턴스를 시작하고 중지하는 함수 집합을 작성하고 배포합니다.
- 일반적인 업무 시간에 맞게 월-금 오전 9시-오후5시까지 실행되도록
dev
리소스 라벨을 사용해서 인스턴스를 예약하는 Cloud Scheduler로 작업 집합을 만듭니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
- Cloud Scheduler
- Cloud Run functions
- Pub/Sub
- Compute Engine
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- Cloud Scheduler의 환경을 설정합니다.
-
Enable the Cloud Run functions, Pub/Sub, and Compute Engine APIs.
애플리케이션 아키텍처
이 솔루션에는 다음과 같은 Google Cloud 구성요소가 포함됩니다.
- Compute Engine 인스턴스: 일정에 따라 실행
- Cloud Run 함수: 예약하려는 인스턴스 시작 및 중지
- Pub/Sub 메시지: 시작 및 중지 이벤트마다 전송 또는 수신
- Cloud Scheduler 작업: 인스턴스를 시작하거나 중지하도록 설정된 일정에 따라 호출
위치 요구사항
일부 구성요소는 특정 리전에서만 지원됩니다.
- Compute Engine 인스턴스: 리전 및 영역에 나열된 모든 리전에서 지원됩니다.
- Cloud Run 함수: 위치에 나열된 리전에서 지원됩니다.
- Pub/Sub 메시지: Pub/Sub이 글로벌 서비스이므로 전역적으로 지원됩니다.
- Pub/Sub 대상을 사용하는 Cloud Scheduler 작업: 모든 Google Cloud 위치에서 지원됩니다.
Pub/Sub 대신에 HTTP는 어떤가요?
Pub/Sub 트리거 대신 Cloud Run 함수 HTTP 트리거를 사용하여 이 아키텍처를 간소화하는 것이 좋습니다.
이 튜토리얼에서는 이전에 이 메서드가 HTTP를 사용하는 것보다 더 안전했기 때문에 Pub/Sub를 Cloud Run 함수 트리거로 사용합니다. 하지만 HTTP도 유효한 선택이며 이제 인증을 요구하여 보안을 유지할 수 있습니다.
Cloud Run 함수 보안에 대한 자세한 내용은 Cloud Run 함수 보안 개요를 참조하세요. HTTP 트리거와 Pub/Sub 트리거 간의 비교는 Cloud Run 함수 트리거 문서를 참조하세요.
Compute Engine 인스턴스 설정
콘솔
- Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
VM 인스턴스 페이지로 이동합니다. - 인스턴스 만들기를 클릭합니다.
- 이름을
dev-instance
로 설정합니다. - 라벨에서, 라벨 추가를 클릭합니다.
- 라벨 추가를 클릭합니다.
- 키에
env
를 입력하고 값에dev
를 입력합니다. - 리전에서 us-west1을 선택합니다.
- 영역에서 us-west1-b를 선택합니다.
- 저장을 클릭합니다.
- 페이지 하단에 있는 만들기를 클릭합니다.
gcloud
gcloud compute instances create dev-instance \ --network default \ --zone us-west1-b \ --labels=env=dev
Pub/Sub에서 트리거한 함수를 Cloud Run 함수를 통해 배포
함수 만들기 및 배포
콘솔
시작 함수를 만듭니다.
- Google Cloud 콘솔에서 Cloud Run 함수 페이지로 이동합니다.
Cloud Run 함수 페이지로 이동 - 함수 만들기를 클릭합니다.
- 환경에서 1세대를 선택합니다.
- 함수 이름을
startInstancePubSub
로 설정합니다. - 리전을 기본값으로 둡니다.
- 트리거 유형으로 Cloud Pub/Sub를 선택합니다.
- Cloud Pub/Sub 주제 선택에서 주제 만들기를 클릭합니다.
- 주제 만들기 대화상자가 나타납니다.
- 주제 ID에
start-instance-event
를 입력합니다. - 만들기를 클릭하여 대화상자를 닫습니다.
- 주제 ID에
- 트리거 상자 아래에서 저장을 클릭합니다.
- 페이지 하단에서 다음을 클릭합니다.
- 런타임에서 Node.js 16 이상을 선택합니다.
- 진입점에
startInstancePubSub
를 입력합니다. - 코드 편집기 왼쪽에서 index.js를 선택합니다.
시작 코드를 다음 코드로 바꿉니다.
코드 편집기 왼쪽에서 package.json을 선택합니다.
시작 코드를 다음 코드로 바꿉니다.
페이지 하단의 배포를 클릭합니다.
중지 함수를 만듭니다.
- Google Cloud 콘솔에서 아직 Cloud Run 함수 페이지에 있어야 합니다.
- 함수 만들기를 클릭합니다.
- 환경에서 1세대를 선택합니다.
- 함수 이름을
stopInstancePubSub
로 설정합니다. - 리전을 기본값으로 둡니다.
- 트리거 유형으로 Cloud Pub/Sub를 선택합니다.
- Cloud Pub/Sub 주제 선택에서 주제 만들기를 클릭합니다.
- 주제 만들기 대화상자가 나타납니다.
- 주제 ID에
stop-instance-event
를 입력합니다. - 만들기를 클릭하여 대화상자를 닫습니다.
- 주제 ID에
- 트리거 상자 아래에서 저장을 클릭합니다.
- 페이지 하단에서 다음을 클릭합니다.
- 런타임에서 Node.js 16 이상을 선택합니다.
- 진입점에
stopInstancePubSub
를 입력합니다. - 코드 편집기 왼쪽에서 index.js를 선택합니다.
시작 코드를 다음 코드로 바꿉니다.
코드 편집기 왼쪽에서 package.json을 선택합니다.
시작 코드를 다음 코드로 바꿉니다.
페이지 하단의 배포를 클릭합니다.
gcloud
Pub/Sub 주제를 만듭니다.
gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event
코드 가져오기
코드를 다운로드합니다.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
또는 zip 파일로 샘플을 다운로드하고 압축을 풀 수 있습니다.
해당 디렉터리로 이동합니다.
cd nodejs-docs-samples/functions/scheduleinstance/
시작 및 중지 함수를 만듭니다.
nodejs-docs-samples/functions/scheduleinstance/
디렉터리가 표시됩니다.
gcloud functions deploy startInstancePubSub \ --trigger-topic start-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
gcloud functions deploy stopInstancePubSub \ --trigger-topic stop-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
(선택사항) 함수 작동 확인
콘솔
인스턴스 중지
- Google Cloud 콘솔에서 Cloud Run 함수 페이지로 이동합니다.
Cloud Run 함수 페이지로 이동 - 이름이
stopInstancePubSub
인 함수를 클릭합니다. - 다음과 같은 여러 개의 탭이 표시됩니다. 일반, 트리거, 소스, 권한, 테스트. 테스트 탭을 클릭합니다.
트리거 이벤트에 다음을 입력합니다.
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
이것은 단순히
{"zone":"us-west1-b", "label":"env=dev"}
를 위한 base64 인코딩 문자열입니다.문자열을 직접 인코딩하려면 온라인 base64 인코딩 툴을 자유롭게 사용해도 좋습니다.
함수 테스트 버튼을 클릭합니다.
실행이 완료되면 출력에
Successfully stopped instance dev-instance
가 표시됩니다. 실행이 완료되려면 최대 60초가 소요될 수 있습니다.error: 'Error: function failed to load.'
가 표시될 경우, 10초 또는 함수가 배포를 완료할 때까지 기다린 후 다시 시도하세요.대신
error: 'Error: function execution attempt timed out.'
이 표시되면 다음 단계로 이동해서 인스턴스가 종료되는 시간이 오래 걸리는지 확인합니다.실행이 완료되었지만 아무것도 표시되지 않는다면 시간이 초과되었을 것입니다. 다음 단계로 이동하여 인스턴스가 종료되는 데 오래 걸리는지 확인합니다.
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
VM 인스턴스 페이지로 이동합니다.dev-instance
라는 인스턴스의 이름 옆에 인스턴스가 중지되었음을 의미하는 회색 사각형이 있는지 확인합니다. 종료를 완료하는 데 최대 30초가 소요될 수 있습니다.- 완료가 안 되는 것처럼 보일 경우, 페이지 상단의 새로고침을 클릭해 보세요.
인스턴스 시작
- Google Cloud 콘솔에서 Cloud Run 함수 페이지로 이동합니다.
Cloud Run 함수 페이지로 이동 - 이름이
startInstancePubSub
인 함수를 클릭합니다. - 다음과 같은 여러 개의 탭이 표시됩니다. 일반, 트리거, 소스, 권한, 테스트. 테스트 탭을 클릭합니다.
트리거 이벤트에 다음을 입력합니다.
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- 마찬가지로 이것은 단순히
{"zone":"us-west1-b", "label":"env=dev"}
를 위한 base64 인코딩 문자열입니다.
- 마찬가지로 이것은 단순히
함수 테스트 버튼을 클릭합니다.
실행이 완료되면 출력에
Successfully started instance dev-instance
가 표시됩니다.Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
VM 인스턴스 페이지로 이동합니다.이름이
dev-instance
인 인스턴스의 이름 옆에 실행 중임을 나타내는 녹색 체크표시가 있는지 확인합니다. 시작을 완료하는 데 최대 30초가 소요될 수 있습니다.
gcloud
인스턴스 중지
인스턴스를 중지하는 함수를 호출합니다.
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
이것은 단순히
{"zone":"us-west1-b", "label":"env=dev"}
를 위한 base64 인코딩 문자열입니다.문자열을 직접 인코딩하려면 필요한 툴을 자유롭게 사용해도 좋습니다. 다음은
base64
명령줄 도구를 사용한 예시입니다.echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
함수가 완료되면 다음과 같이 표시됩니다.
result: Successfully stopped instance dev-instance
실행이 완료되려면 최대 60초가 소요될 수 있습니다.
다음과 같은 오류가 표시될 경우:
error: 'Error: function failed to load.`
10초 또는 함수가 배포를 완료할 때까지 기다린 후 다시 시도하세요.
다음과 같은 오류가 표시될 경우:
error: `Error: function execution attempt timed out.`
다음 단계로 이동하여 인스턴스가 종료되는 데 오래 걸리는지 확인합니다.
아무 결과도 표시되지 않는 경우, 함수의 실행 시간이 초과되었을 것입니다. 다음 단계로 이동하여 인스턴스가 종료되는 데 오래 걸리는지 확인합니다.
인스턴스의 상태가
TERMINATED
인지 확인합니다. 종료를 완료하는 데 최대 30초가 소요될 수 있습니다.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
인스턴스 시작
인스턴스를 시작하는 함수를 호출합니다.
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- 마찬가지로 이것은 단순히
{"zone":"us-west1-b", "label":"env=dev"}
를 위한 base64 인코딩 문자열입니다.
함수가 완료되면 다음과 같이 표시됩니다.
result: Successfully started instance dev-instance
- 마찬가지로 이것은 단순히
인스턴스의 상태가
RUNNING
인지 확인합니다. 시작을 완료하는 데 최대 30초가 소요될 수 있습니다.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Pub/Sub를 호출하는 Cloud Scheduler 작업 설정
작업 만들기
콘솔
시작 작업을 만듭니다.
- Google Cloud 콘솔에서 Cloud Scheduler 페이지로 이동합니다.
Cloud Scheduler 페이지로 이동 - 작업 만들기를 클릭합니다.
- 기본 리전을 그대로 둡니다.
- 이름을
startup-dev-instances
로 설정합니다. - 빈도에
0 9 * * 1-5
를 입력합니다.- 이는 월요일~금요일, 매일 오전 9시에 실행됩니다.
- 시간대에서, 원하는 국가와 시간대를 선택합니다. 이 예시에서는
United States
및Los Angeles
가 사용됩니다. - 계속을 클릭합니다.
- 대상 유형으로
Pub/Sub
를 선택합니다. - 주제 드롭다운에서
start-instance-event
를 선택합니다. - 메시지에 다음을 입력합니다.
{"zone":"us-west1-b","label":"env=dev"}
- 만들기를 클릭합니다.
중지 작업을 만듭니다.
- Google Cloud 콘솔에서 아직 Cloud Scheduler 페이지에 있어야 합니다.
- 작업 만들기를 클릭합니다.
- 기본 리전은 그대로 두고 페이지 하단에서 다음을 클릭합니다.
- 이름을
shutdown-dev-instances
로 설정합니다. - 빈도에
0 17 * * 1-5
를 입력합니다.- 이는 월요일~금요일, 매일 오후 5시에 실행됩니다.
- 시간대에서, 원하는 국가와 시간대를 선택합니다. 이 예시에서는
United States
및Los Angeles
가 사용됩니다. - 계속을 클릭합니다.
- 대상 유형으로
Pub/Sub
를 선택합니다. - 주제 드롭다운에서
stop-instance-event
를 선택합니다. - 메시지에 다음을 입력합니다.
{"zone":"us-west1-b","label":"env=dev"}
- 만들기를 클릭합니다.
gcloud
시작 작업을 만듭니다.
gcloud scheduler jobs create pubsub startup-dev-instances \ --schedule '0 9 * * 1-5' \ --topic start-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
중지 작업을 만듭니다.
gcloud scheduler jobs create pubsub shutdown-dev-instances \ --schedule '0 17 * * 1-5' \ --topic stop-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
(선택사항) 작업이 작동하는지 확인
콘솔
인스턴스 중지
- Google Cloud 콘솔에서 Cloud Scheduler 페이지로 이동합니다.
Cloud Scheduler 페이지로 이동 - 이름이
shutdown-dev-instances
인 작업에 대해 페이지 오른쪽 끝에 있는 지금 실행 버튼을 클릭합니다. - Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
VM 인스턴스 페이지로 이동합니다. dev-instance
라는 인스턴스의 이름 옆에 인스턴스가 중지되었음을 의미하는 회색 사각형이 있는지 확인합니다. 종료를 완료하는 데 최대 30초가 소요될 수 있습니다.
인스턴스 시작
- Google Cloud 콘솔에서 Cloud Scheduler 페이지로 이동합니다.
Cloud Scheduler 페이지로 이동 - 이름이
startup-dev-instances
인 작업에 대해 페이지 오른쪽 끝에 있는 지금 실행 버튼을 클릭합니다. - Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
VM 인스턴스 페이지로 이동합니다. - 이름이
dev-instance
인 인스턴스의 이름 옆에 실행 중임을 나타내는 녹색 체크표시가 있는지 확인합니다. 시작을 완료하는 데 최대 30초가 소요될 수 있습니다.
gcloud
인스턴스 중지
인스턴스를 중지하는 스케줄러 작업을 실행합니다.
gcloud beta scheduler jobs run shutdown-dev-instances
인스턴스의 상태가
TERMINATED
인지 확인합니다. 종료를 완료하는 데 최대 30초가 소요될 수 있습니다.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
인스턴스 시작
인스턴스를 시작하는 스케줄러 작업을 실행합니다.
gcloud beta scheduler jobs run startup-dev-instances
인스턴스의 상태가
RUNNING
인지 확인합니다. 시작을 완료하는 데 최대 30초가 소요될 수 있습니다.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
삭제
튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
Cloud Scheduler 작업 삭제
Google Cloud 콘솔에서 Cloud Scheduler 페이지로 이동합니다.
작업 옆에 있는 체크박스를 클릭합니다.
페이지 상단의 삭제 버튼을 클릭하고 삭제를 확인합니다.
Pub/Sub 주제 삭제
Google Cloud 콘솔에서 Pub/Sub 페이지로 이동합니다.
주제 옆에 있는 체크박스를 클릭합니다.
페이지 상단의 삭제를 클릭하고 삭제를 확인합니다.
Cloud Run 함수를 통해 배포된 함수 삭제
Google Cloud 콘솔에서 Cloud Run 함수 페이지로 이동합니다.
함수 옆에 있는 체크박스를 클릭합니다.
페이지 상단의 삭제 버튼을 클릭하고 삭제를 확인합니다.
Compute Engine 인스턴스 삭제
Compute Engine 인스턴스를 삭제하려면 다음 안내를 따르세요.
- In the Google Cloud console, go to the VM instances page.
- Select the checkbox for the instance that you want to delete.
- To delete the instance, click More actions, click Delete, and then follow the instructions.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하는 방법은 다음과 같습니다.
- 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.
다음 단계
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기. Cloud 아키텍처 센터를 살펴보세요.