이 튜토리얼에서는 리소스 라벨을 사용해서 정기적으로 Compute Engine 인스턴스를 자동 시작 및 중지하기 위해 Cloud Scheduler 및 Cloud Run 함수를 사용하는 방법을 보여줍니다.
애플리케이션 아키텍처
이 솔루션에는 다음 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