arrow_back

Cloud Run 및 Pub/Sub을 사용하여 복원력이 우수한 비동기 시스템 구축

로그인 가입
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Cloud Run 및 Pub/Sub을 사용하여 복원력이 우수한 비동기 시스템 구축

Lab 1시간 universal_currency_alt 크레딧 5개 show_chart 중급
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP650

Google Cloud 사용자 주도형 실습

Pet Theory 로고

개요

서버리스 Cloud Run 개발 과정에 포함된 실습에서는 가상의 비즈니스 시나리오를 읽고 시나리오 속 인물들이 서버리스 마이그레이션 계획을 세울 수 있도록 도움을 줍니다.

릴리는 12년 전에 Pet Theory라는 프랜차이즈 동물병원을 열었습니다. 지난 몇 년 동안 병원 수가 증가함에 따라 자동화의 필요성도 커졌습니다. Pet Theory가 연구에서 나온 의료 검사 결과를 처리하는 방식은 너무 느리고 오류가 발생하기 쉬워 릴리는 이를 개선하고자 합니다.

현재 Pet Theory의 IT 관리자인 패트릭은 검사 결과를 수동으로 처리하고 있습니다. 검사 결과가 나올 때마다 그는 반려동물 검사를 받은 고객에게 보낼 이메일을 작성하여 전송한 다음, 휴대폰에서 문자 메시지를 탭하여 결과를 고객에게 문자로 보냅니다.

패트릭은 소프트웨어 컨설턴트인 루비와 협력하여 확장성이 더욱 뛰어난 시스템을 설계하고 있습니다. 이들은 지속적인 유지관리가 크게 필요하지 않은 솔루션을 빌드하고 싶어합니다. 패트릭과 루비는 서버리스 기술을 선택하기로 결정했습니다.

목표

이 실습에서 학습할 작업 수행 방법은 다음과 같습니다.

  • Pub/Sub 주제 및 구독 만들기
  • HTTP 요청을 수신하고 메시지를 Cloud Pub/Sub에 게시하는 Cloud Run 서비스 만들기
  • Cloud Pub/Sub에서 메시지를 수신하는 Cloud Run 서비스 만들기
  • Cloud Run 서비스를 트리거하는 Pub/Sub 구독 만들기
  • 시스템 복원력 테스트하기

기본 요건

이 실습에서는 Cloud 콘솔 및 셸 환경에 익숙하다고 가정합니다. 이 실습은 시리즈의 일부입니다. 아래의 이전 실습을 완료했다면 도움이 되지만 필수는 아닙니다.

설정 및 요건

참고: 이 실습에서는 Username 1로 Google Cloud 콘솔에 로그인합니다. 그렇지 않으면 실습 중에 오류가 발생합니다.

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머에는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지 표시됩니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 직접 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간---실습을 시작하고 나면 일시중지할 수 없습니다.
참고: 계정에 추가 요금이 발생하지 않도록 하려면 개인용 Google Cloud 계정이나 프로젝트가 이미 있어도 이 실습에서는 사용하지 마세요.

실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법

  1. 실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 팝업이 열립니다. 왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 패널이 있습니다.

    • Google 콘솔 열기 버튼
    • 남은 시간
    • 이 실습에 사용해야 하는 임시 사용자 인증 정보
    • 필요한 경우 실습 진행을 위한 기타 정보
  2. Google 콘솔 열기를 클릭합니다. 실습에서 리소스가 가동된 후 로그인 페이지가 표시된 다른 탭이 열립니다.

    팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.

    참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.
  3. 필요한 경우 실습 세부정보 패널에서 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다. 다음을 클릭합니다.

  4. 실습 세부정보 패널에서 비밀번호를 복사하여 시작 대화상자에 붙여넣습니다. 다음을 클릭합니다.

    중요: 왼쪽 패널에 표시된 사용자 인증 정보를 사용해야 합니다. Google Cloud Skills Boost 사용자 인증 정보를 사용하지 마세요. 참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
  5. 이후에 표시되는 페이지를 클릭하여 넘깁니다.

    • 이용약관에 동의합니다.
    • 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
    • 무료 평가판을 신청하지 않습니다.

잠시 후 Cloud 콘솔이 이 탭에서 열립니다.

참고: 왼쪽 상단에 있는 탐색 메뉴를 클릭하면 Google Cloud 제품 및 서비스 목록이 있는 메뉴를 볼 수 있습니다. 탐색 메뉴 아이콘

Cloud Shell 활성화

Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다. Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.

  1. Google Cloud 콘솔 상단에서 Cloud Shell 활성화 Cloud Shell 활성화 아이콘를 클릭합니다.

연결되면 사용자 인증이 이미 처리된 것이며 프로젝트가 PROJECT_ID로 설정됩니다. 출력에 이 세션의 PROJECT_ID를 선언하는 줄이 포함됩니다.

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.

  1. (선택사항) 다음 명령어를 사용하여 활성 계정 이름 목록을 표시할 수 있습니다.
gcloud auth list
  1. 승인을 클릭합니다.

  2. 다음과 비슷한 결과가 출력됩니다.

출력:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (선택사항) 다음 명령어를 사용하여 프로젝트 ID 목록을 표시할 수 있습니다.
gcloud config list project

출력:

[core] project = <project_ID>

출력 예시:

[core] project = qwiklabs-gcp-44776a13dea667a6 참고: gcloud 전체 문서는 Google Cloud에서 gcloud CLI 개요 가이드를 참조하세요.

리전 및 영역 설정하기

특정 Compute Engine 리소스는 여러 리전과 영역에 상주합니다. 리전은 리소스를 실행할 수 있는 특정한 지리적 위치로, 각 리전에는 영역이 하나 이상 있습니다.

Cloud 콘솔에서 다음 gcloud 명령어를 실행하여 실습의 기본 리전과 영역을 설정합니다.

gcloud config set compute/zone "{{{project_0.default_zone|ZONE}}}" export ZONE=$(gcloud config get compute/zone) gcloud config set compute/region "{{{project_0.default_region|REGION}}}" export REGION=$(gcloud config get compute/region)

시나리오

Pet Theory는 고객 검사 결과를 공유하는 프로세스를 자동화하고자 합니다. 늘어나는 진료 예약을 모두 처리하기가 쉽지 않았기 때문에 릴리는 루비에게 도움을 요청하기로 결정합니다.

릴리

릴리, Pet Theory 설립자

안녕하세요, 루비님.

보험 포털을 정리해주셔서 감사합니다.

의료 검사 결과에 대해서도 취할만한 조치가 있을까요? 결과를 고객에게 보다 효율적으로 보낼 수 있는 방법이 필요합니다.

릴리

루비

루비, 소프트웨어 컨설턴트

안녕하세요, 릴리님.

물론입니다. 상황을 개선할만한 몇 가지 아이디어가 있는데 어떤 방법이 가능한지 확인해보도록 하겠습니다.

루비

작업 1. 아키텍처

Pet Theory는 외부 연구소를 이용하여 의료 검사를 진행합니다. 연구소는 의료 검사를 완료하면 그 결과를 Pet Theory에 다시 보냅니다.

연구소에서는 의료 연구 결과에 대해 Pet Theory의 웹 엔드포인트에 HTTP(s) POST를 사용합니다. 아래 이미지는 일반 아키텍처를 간략하게 설명합니다.

Pet Theory의 시스템 아키텍처 다이어그램

루비는 일반적인 프로세스를 살펴본 후 Pet Theory에서 다음을 수행할 수 있도록 시스템을 설계할 수 있다고 판단합니다.

  1. HTTP POST 요청을 수신하고 의료 연구소에 수신 확인하기
  2. 검사 결과를 고객에게 이메일로 보내기
  3. 검사 결과가 포함된 문자 메시지(SMS)와 이메일을 고객에게 보내기

루비의 설계는 위의 각 활동을 분리하고 다음을 필요로 합니다.

  • 의료 검사 결과를 요청하고 이에 응답하는 서비스
  • 검사 결과를 고객에게 이메일로 보내는 서비스
  • 고객에게 문자 메시지(SMS)를 보내는 서비스
  • 서비스 간 통신에 사용할 Pub/Sub
  • 애플리케이션 아키텍처에 사용할 서버리스 인프라

루비는 일회용 함수를 사용하여 작성하기 쉽고 버그가 적은 코드를 개발할 방법을 모색하고 있습니다.

루비

루비, 소프트웨어 컨설턴트

안녕하세요, 패트릭님.

릴리님이 의료 기록 처리에 도움이 되는 프로토타입을 제작해 달라고 하셨습니다.

이를 시작할 수 있도록 new-lab-report라는 Pub/Sub 주제를 설정해주시겠어요?

루비

패트릭

패트릭, IT 관리자

안녕하세요, 루비님.

괜찮은 프로젝트인 것 같습니다. 오늘 아침에 완료해 드릴 수 있어요. 두 활동 모두 Google Cloud에서 매우 빠르게 설정할 수 있습니다.

패트릭

Pub/Sub 주제 만들기

패트릭이 new-lab-report라는 Pub/Sub 주제를 만들 수 있도록 지원하세요.

Cloud Pub/Sub가 강조 표시된 아키텍처 다이어그램

서비스가 Pub/Sub 메시지를 게시할 때 해당 메시지는 주제로 태그되어야 합니다. 연구 보고서는 해당 서비스를 통해 사용되어 각 보고서에 대한 메시지를 만들고 게시합니다.

먼저 이 작업에 사용할 수 있는 주제를 만들어야 합니다.

  1. 다음 명령어를 실행하여 Pub/Sub 주제를 만듭니다.
gcloud pubsub topics create new-lab-report

'new-lab-report' 주제를 구독하는 모든 서비스는 연구 보고서 서비스에서 게시한 메시지를 사용할 수 있습니다. 위 다이어그램에서는 이메일 서비스와 SMS 서비스라는 두 가지 소비자를 확인할 수 있습니다.

  1. 그런 다음 클라우드에서 코드를 실행하는 Cloud Run을 사용 설정합니다.
gcloud services enable run.googleapis.com

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

Pub/Sub 주제 만들기

Pub/Sub 주제가 준비되었다고 루비에게 알려주세요.

패트릭

패트릭, IT 관리자

안녕하세요, 루비님.

모두 완료되었습니다.

시간이 되시면 이 프로토타입이 어떻게 구성되는지 보고 싶습니다. 함께 작업할 수 있을까요?

패트릭

루비

루비, 소프트웨어 컨설턴트

안녕하세요, 패트릭님.

이렇게 빨리 처리해 주셔서 감사합니다. 함께 빌드 작업을 진행할 수 있도록 일정을 잡아보도록 하겠습니다.

루비

작업 2. 연구 보고서 서비스 빌드

루비가 새로운 연구 보고서 서비스를 설정하도록 지원하세요.

연구 보고서 서비스가 강조 표시된 아키텍처 다이어그램

이 서비스는 프로토타입 제작 목적으로 사용되므로 다음 두 가지 작업만 수행합니다.

  1. 보고서 데이터가 포함된 연구 보고서 HTTPS POST를 수신합니다.
  2. 메시지를 Pub/Sub에 게시합니다.

연구 보고서 서비스에 대한 코드 추가

  1. Cloud Shell로 돌아가서 이 실습에 필요한 저장소를 클론합니다.
git clone https://github.com/rosera/pet-theory.git
  1. lab-service 디렉터리로 이동합니다.
cd pet-theory/lab05/lab-service
  1. 들어오는 HTTPS 요청을 수신하고 Pub/Sub에 게시하는 데 필요한 다음 패키지를 설치합니다.
npm install express npm install body-parser npm install @google-cloud/pubsub

이러한 명령어는 package.json 파일을 업데이트하여 이 서비스에 필요한 종속 항목을 나타냅니다.

이제 Cloud Run이 코드 시작 방법을 알 수 있도록 package.json 파일을 수정합니다.

  1. package.json 파일을 엽니다.

  2. package.json 파일의 "scripts" 섹션에서 아래와 같이 7번 줄에 "start": "node index.js" 코드 줄을 추가한 다음 파일을 저장합니다.

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, 참고: 끝 쉼표를 포함하여 제공된 대로 정확하게 코드를 추가해야 합니다.

"start": "node index.js",

그렇지 않으면 배포 중에 오류가 발생합니다.
  1. index.js라는 새로운 파일을 만들고 다음 코드를 파일에 추가합니다.
const {PubSub} = require('@google-cloud/pubsub'); const pubsub = new PubSub(); const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { try { const labReport = req.body; await publishPubSubMessage(labReport); res.status(204).send(); } catch (ex) { console.log(ex); res.status(500).send(ex); } }) async function publishPubSubMessage(labReport) { const buffer = Buffer.from(JSON.stringify(labReport)); await pubsub.topic('new-lab-report').publish(buffer); } 다음 두 줄은 서비스의 주요 작업을 수행합니다.

const labReport = req.body;

await publishPubSubMessage(labReport);

구체적으로는 다음과 같습니다.

  • POST 요청에서 연구 보고서를 추출합니다.
  • 새로 게시된 연구 보고서가 포함된 PubSub 메시지를 게시합니다.
  1. 이제 Dockerfile이라는 파일을 만들고 아래 코드를 파일에 추가합니다.
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

이 파일은 Cloud Run 서비스를 컨테이너에 패키징하는 방법을 정의합니다.

lab-report-service 배포

  1. deploy.sh라는 파일을 만들고 다음 명령어를 파일에 붙여넣습니다.
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service gcloud run deploy lab-report-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --allow-unauthenticated \ --max-instances=1
  1. Cloud Shell에서 다음을 실행하여 이 파일을 실행 파일로 만듭니다.
chmod u+x deploy.sh
  1. 이제 연구 보고서 서비스를 배포할 차례입니다. 배포 스크립트를 실행합니다.
./deploy.sh

타이밍 문제로 인해 이 명령어를 처음 실행할 때 오류가 발생할 수 있습니다. 그러면 deploy.sh를 다시 실행하면 됩니다.

배포가 성공적으로 완료되면 다음과 유사한 메시지가 표시됩니다.

Service [lab-report-service] revision [lab-report-service-00001] has been deployed and is serving traffic at https://lab-report-service-[hash].a.run.app

훌륭합니다. 연구 보고서 서비스가 배포되었으며 HTTP를 통해 의료 연구 결과를 사용합니다. 이제 새로운 서비스가 실행되고 있는지 테스트할 수 있습니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

연구 보고서 서비스 배포: 빌드

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

연구 보고서 서비스 배포: 버전 만들기

연구 보고서 서비스 테스트

연구 보고서 서비스의 유효성을 검사하려면 각각 1개의 연구 보고서가 포함된, 연구소에서 만든 3개의 HTTPS POST를 시뮬레이션합니다. 테스트 목적으로 생성된 연구 보고서에는 ID만 포함됩니다.

  1. 먼저 더 쉽게 작업할 수 있도록 보고서의 URL을 환경 변수에 입력합니다.
export LAB_REPORT_SERVICE_URL=$(gcloud run services describe lab-report-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. LAB_REPORT_SERVICE_URL이 캡처되었는지 확인합니다.
echo $LAB_REPORT_SERVICE_URL
  1. post-reports.sh라는 새로운 파일을 만들고 아래 코드를 파일에 추가합니다.
curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 12}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 34}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 56}" \ $LAB_REPORT_SERVICE_URL &

위 스크립트는 curl 명령어를 사용하여 3개의 개별 ID를 연구 서비스 URL에 게시합니다. 각 명령어는 백그라운드에서 개별적으로 실행됩니다.

  1. post-reports.sh 스크립트를 실행 가능하게 만듭니다.
chmod u+x post-reports.sh
  1. 이제 위에서 설명한 스크립트를 사용해 3개의 연구 보고서를 게시하여 연구 보고서 서비스 엔드포인트를 테스트합니다.
./post-reports.sh

이 스크립트는 3개의 연구 보고서를 연구 보고서 서비스에 게시했습니다. 로그를 확인하여 결과를 볼 수 있습니다.

  1. Cloud 콘솔에서 탐색 메뉴(탐색 메뉴 아이콘) > Cloud Run을 클릭합니다.

  2. 이제 서비스 목록에 새로 배포된 lab-report-service가 표시됩니다. 클릭합니다.

  3. 다음 페이지에는 lab-report-service에 대한 세부정보가 표시됩니다. 로그 탭을 클릭합니다.

로그 페이지에 스크립트를 사용하여 게시한 3개의 테스트 보고서의 결과가 표시됩니다. 아래에 표시된 것과 같이 콘텐츠가 아니라 확인을 의미하는 HTTP 코드인 204가 반환될 것입니다. 아무 항목도 표시되지 않는 경우 오른쪽에 있는 스크롤바를 사용하여 위아래로 스크롤해 보세요. 그러면 로그가 다시 로드됩니다.

다음 작업은 SMS 서비스와 이메일 서비스를 작성하는 것입니다. 이러한 서비스는 연구 보고서 서비스가 'new-lab-report' 주제에 대한 Pub/Sub 메시지를 게시할 때 트리거됩니다.

작업 3. 이메일 서비스

루비가 새로운 이메일 서비스를 설정하도록 지원하세요.

이메일 서비스가 강조 표시된 아키텍처 다이어그램

이메일 서비스에 대한 코드 추가

  1. 이메일 서비스 디렉터리로 이동합니다.
cd ~/pet-theory/lab05/email-service
  1. 코드가 들어오는 HTTPS 요청을 처리할 수 있도록 다음 패키지를 설치합니다.
npm install express npm install body-parser

위 명령어는 앱과 해당 종속 항목을 설명하는 package.json 파일을 업데이트합니다. Cloud Run은 코드 실행 방법을 알아야 하므로 수행할 작업을 알 수 있도록 start 명령을 추가합니다.

  1. package.json 파일을 엽니다.

  2. "scripts" 섹션에서 아래와 같이 "start": "node index.js" 줄을 추가하고 파일을 저장합니다.

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, 참고: 끝 쉼표를 포함하여 제공된 대로 정확하게 코드를 추가해야 합니다.

"start": "node index.js",

그렇지 않으면 배포 중에 오류가 발생합니다.
  1. index.js라는 새로운 파일을 만들고 다음을 파일에 추가합니다.
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`Email Service: Report ${labReport.id} trying...`); sendEmail(); console.log(`Email Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`Email Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendEmail() { console.log('Sending email'); }

이 코드는 Pub/Sub가 메시지를 서비스에 게시할 때 실행됩니다. 이를 통해 다음과 같은 기능을 수행합니다.

  • Pub/Sub 메시지를 디코딩한 다음 sendEmail() 함수 호출을 시도합니다.
  • 성공하고 예외가 발생하지 않으면 상태 코드 204가 반환되므로 Pub/Sub는 메시지가 처리되었음을 알게 됩니다.
  • 예외가 발생하는 경우 서비스는 상태 코드 500을 반환하므로 Pub/Sub는 메시지가 처리되지 않았음을 알게 되고 나중에 서비스에 다시 게시해야 합니다.

서비스 간 통신이 작동하면 루비는 실제로 이메일을 보내기 위해 sendEmail() 함수에 코드를 추가합니다.

  1. 이제 Dockerfile이라는 파일을 만들고 아래 코드를 파일에 추가합니다.
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

이 파일은 Cloud Run 서비스를 컨테이너에 패키징하는 방법을 정의합니다.

이메일 서비스 배포

  1. deploy.sh라는 새로운 파일을 만들고 다음을 파일에 추가합니다.
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/email-service gcloud run deploy email-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/email-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. deploy.sh를 실행 파일로 만듭니다.
chmod u+x deploy.sh
  1. 이메일 서비스를 배포합니다.
./deploy.sh

배포가 완료되면 다음과 유사한 메시지가 표시됩니다.

Service [email-service] revision [email-service-00001] has been deployed and is serving traffic at https://email-service-[hash].a.run.app

서비스가 성공적으로 배포되었습니다. 이제 Pub/Sub 메시지를 사용할 수 있을 때 이메일 서비스가 트리거되는지 확인해야 합니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

이메일 서비스 배포: 빌드

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

이메일 서비스 배포: 버전 만들기

이메일 서비스를 트리거하도록 Pub/Sub 구성

“new-lab-report” 주제를 사용하여 새로운 Pub/Sub 메시지가 게시될 때마다 이메일 서비스가 트리거되어야 합니다. 이 작업을 수행하려면 이 서비스에 대한 관련 요청을 자동으로 처리하도록 서비스 계정을 구성합니다.

Cloud Pub/Sub에서 이메일 서비스로의 흐름이 강조 표시된 아키텍처 다이어그램

  1. Pub/Sub 메시지에 응답하는 서비스를 트리거하는 데 사용할 새로운 서비스 계정을 만듭니다.
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

서비스 계정 만들기
  1. 새로운 서비스 계정에 이메일 서비스를 호출할 수 있는 권한을 부여합니다.
gcloud run services add-iam-policy-binding email-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

그런 다음 “new-lab-report” 메시지가 게시될 때 Pub/Sub에서 SMS 서비스를 호출하도록 지시합니다.

  1. 쉽게 액세스할 수 있도록 프로젝트 번호를 환경 변수에 입력합니다.
PROJECT_NUMBER=$(gcloud projects list --filter="qwiklabs-gcp" --format='value(PROJECT_NUMBER)')

그런 다음 프로젝트에서 Pub/Sub 인증 토큰을 만들도록 설정합니다.

  1. 아래 코드를 실행합니다.
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator
  1. 이메일 서비스의 URL을 다른 환경 변수에 입력합니다.
EMAIL_SERVICE_URL=$(gcloud run services describe email-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. EMAIL_SERVICE_URL이 캡처되었는지 확인합니다.
echo $EMAIL_SERVICE_URL
  1. 이메일 서비스에 대한 Pub/Sub 구독을 만듭니다.
gcloud pubsub subscriptions create email-service-sub --topic new-lab-report --push-endpoint=$EMAIL_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

완료되었습니다. 이제 서비스가 Cloud Pub/Sub 메시지에 응답하도록 설정되었습니다. 다음 단계로 코드의 유효성을 검사하여 요구사항을 충족하는지 확인합니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

Pub/Sub 구독 만들기

연구 보고서 서비스와 이메일 서비스를 함께 테스트

  1. 앞서 만든 스크립트를 사용하여 연구 보고서에 다시 게시합니다.
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 그런 다음 로그를 엽니다(탐색 메뉴 > Cloud Run). email-servicelab-report-service라는 2개의 Cloud Run 서비스가 계정에 표시됩니다.

  2. email-service를 클릭한 다음 로그를 클릭합니다.
    Pub/Sub에 의해 트리거되는 이 서비스의 결과가 표시됩니다. 예상되는 메시지가 표시되지 않는 경우 스크롤바를 위아래로 이동하여 로그를 새로고침합니다.

완료되었습니다. 이제 이메일 서비스는 Cloud Pub/Sub 주제 큐에서 메시지가 처리될 때마다 로그에 정보를 작성할 수 있습니다. 마지막 작업은 SMS 서비스를 작성하는 것입니다.

작업 4. SMS 서비스

루비가 새로운 SMS 서비스를 설정하도록 지원하세요.

SMS 서비스가 강조 표시된 아키텍처 다이어그램

SMS 서비스에 대한 코드 추가

  1. SMS 서비스용 디렉터리를 만듭니다.
cd ~/pet-theory/lab05/sms-service
  1. 들어오는 HTTPS 요청을 수신하는 데 필요한 패키지를 설치합니다.
npm install express npm install body-parser
  1. package.json 파일을 엽니다.

  2. "scripts" 섹션에서 아래와 같이 "start": "node index.js" 줄을 추가하고 파일을 저장합니다.

... "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, ... 참고: 끝 쉼표를 포함하여 제공된 대로 정확하게 코드를 추가해야 합니다.

"start": "node index.js",

그렇지 않으면 배포 중에 오류가 발생합니다.
  1. index.js라는 새로운 파일을 만들고 다음을 파일에 추가합니다.
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`SMS Service: Report ${labReport.id} trying...`); sendSms(); console.log(`SMS Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`SMS Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendSms() { console.log('Sending SMS'); }
  1. 이제 Dockerfile이라는 파일을 만들고 아래 코드를 파일에 추가합니다.
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

이 파일은 Cloud Run 서비스를 컨테이너에 패키징하는 방법을 정의합니다. 이제 코드가 생성되었으므로 다음 단계는 서비스를 배포하는 것입니다.

SMS 서비스 배포

  1. deploy.sh라는 파일을 만들고 다음 코드를 파일에 추가합니다.
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service gcloud run deploy sms-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. deploy.sh를 실행 파일로 만듭니다.
chmod u+x deploy.sh
  1. SMS 서비스를 배포합니다.
./deploy.sh

배포가 완료되면 다음과 유사한 메시지가 표시됩니다.

Service [sms-service] revision [sms-service-00001] has been deployed and is serving traffic at https://sms-service-[hash].a.run.app

SMS 서비스가 성공적으로 배포되었지만 Cloud Pub/Sub 서비스에 연결되지 않았습니다. 다음 섹션에서 이를 수정합니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

SMS 서비스 배포

SMS 서비스를 트리거하도록 Cloud Pub/Sub 구성

이메일 서비스와 마찬가지로, 메시지를 사용할 수 있도록 Cloud Pub/Sub와 SMS 서비스 간의 링크를 구성해야 합니다.

Cloud Pub/Sub에서 SMS 서비스로의 흐름이 강조 표시된 아키텍처 다이어그램

  1. Pub/Sub가 SMS 서비스를 트리거할 수 있도록 권한을 설정합니다.
gcloud run services add-iam-policy-binding sms-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

그런 다음 “new-lab-report” 메시지가 게시될 때 Pub/Sub에서 SMS 서비스를 호출하도록 지시합니다.

  1. 첫 번째 단계는 SMS 서비스의 URL 주소를 환경 변수에 입력하는 것입니다.
SMS_SERVICE_URL=$(gcloud run services describe sms-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. SMS_SERVICE_URL이 캡처되었는지 확인합니다.

    echo $SMS_SERVICE_URL
  2. 그런 다음 Pub/Sub 구독을 만듭니다.

gcloud pubsub subscriptions create sms-service-sub --topic new-lab-report --push-endpoint=$SMS_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
  1. 테스트 스크립트를 다시 실행하여 3개의 연구 보고서를 연구 보고서 서비스에 게시합니다.
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 그런 다음 로그를 엽니다(탐색 메뉴 > Cloud Run). email-service, lab-report-service, sms-service라는 3개의 Cloud Run 서비스가 계정에 표시됩니다.

  2. sms-service를 클릭한 다음 로그를 클릭합니다. Pub/Sub에 의해 트리거되는 이 서비스의 결과가 표시됩니다.

프로토타입 시스템이 생성되어 성공적으로 테스트되었습니다. 그러나 패트릭은 초기 검증 프로세스의 일부인 복원력이 아직 테스트되지 않았다는 점을 우려하고 있습니다.

작업 5. 시스템의 복원력 테스트

서비스 중 하나가 중지되면 어떻게 될까요? 이는 일반적인 상황이므로 패트릭은 이전에도 이런 문제를 겪은 적이 있습니다.

루비가 시스템에서 이 시나리오를 처리할 수 있는 방법을 조사할 수 있도록 지원하세요. 루비는 잘못된 버전의 이메일 서비스를 배포하여 서비스가 실패하면 어떻게 되는지 테스트하고자 합니다.

  1. email-service 디렉터리로 돌아갑니다.
cd ~/pet-theory/lab05/email-service

오류가 발생하도록 이메일 서비스 애플리케이션에 잘못된 텍스트를 추가합니다.

  1. 아래와 같이 index.js를 수정하고 throw 줄을 sendEmail() 함수에 추가합니다. 그러면 이메일 서버가 중지된 것처럼 예외가 발생합니다.
... function sendEmail() { throw 'Email server is down'; console.log('Sending email'); } ...

이 코드를 추가하면 서비스가 호출될 때 서비스가 비정상 종료합니다.

  1. 이 잘못된 버전의 이메일 서비스를 배포합니다.
./deploy.sh
  1. 이메일 서비스 배포가 성공적으로 완료되면 데이터를 연구 보고서에 다시 게시한 다음 email-service 로그 상태를 자세히 살펴봅니다.
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 이메일 서비스 로그를 열어 잘못된 이메일 서비스에 대한 로그를 확인합니다(탐색 메뉴 > Cloud Run).

  2. 계정에 3개의 Cloud Run 서비스가 표시되면 email-service를 클릭합니다.

이메일 서비스가 호출되고 있지만 계속 비정상 종료됩니다. 로그에서 조금 뒤로 스크롤하면 '이메일 서버가 중지되었습니다'라는 근본 원인을 찾을 수 있습니다. 또한 서비스가 상태 코드 500을 반환하고 Pub/Sub가 계속해서 서비스 호출을 재시도하는 것을 확인할 수 있습니다.

SMS 서비스의 로그를 보면 성공적으로 작동하는 것을 알 수 있습니다.

이제 이메일 서비스에서 오류를 수정하여 애플리케이션을 복원합니다.

  1. index.js 파일을 열고 이전에 입력한 throw 줄을 삭제한 다음 파일을 저장합니다.

이제 index.js sendEmail 함수가 다음과 유사하게 표시됩니다.

function sendEmail() { console.log('Sending email'); }
  1. 이메일 서비스의 수정된 버전을 배포합니다.
./deploy.sh
  1. 배포가 완료되면 오른쪽 상단의 새로고침 아이콘을 클릭합니다.

어떤 방법으로 보고서 12, 34, 56에 대한 이메일이 최종적으로 전송되었고, 이메일 서비스가 상태 코드 204를 반환했고, Pub/Sub가 서비스 호출을 중지했는지 알 수 있습니다. 데이터는 손실되지 않았으며 Pub/Sub는 최종적으로 성공할 때까지 계속해서 재시도했습니다. 이것이 바로 강력한 시스템의 기초가 됩니다.

핵심사항

  1. 서비스가 서로를 직접 호출하는 대신 Pub/Sub를 통해 비동기식으로 서로 통신하는 경우 시스템의 복원력을 높일 수 있습니다.
  2. 연구 보고서 서비스 트리거는 Pub/Sub 사용 덕분에 다른 서비스와 독립적입니다. 예를 들어 고객이 다른 메시징 서비스를 통해서도 연구 결과를 받기를 원하는 경우 연구 보고서 서비스를 업데이트하지 않고도 이를 추가할 수 있습니다.
  3. Cloud Pub/Sub이 재시도를 처리하므로 서비스는 재시도할 필요가 없습니다. 서비스는 성공 또는 실패라는 상태 코드를 반환하는 데만 필요합니다.
  4. 서비스가 중지되는 경우 Pub/Sub 재시도 덕분에 서비스가 다시 온라인 상태가 되면 시스템이 자동으로 자체 '복구'됩니다.

수고하셨습니다.

루비는 여러분의 도움으로 복원력이 우수한 프로토타입 시스템을 성공적으로 구축했습니다. 이 서비스는 모든 고객에게 이메일과 SMS 메시지를 자동으로 보낼 수 있습니다. 개별 서비스가 일시적으로 중지되는 경우에도 시스템에서 재시도 메커니즘을 구현하여 데이터가 손실되지 않도록 합니다. 루비는 그 공로를 인정받았습니다.

릴리

릴리, Pet Theory 설립자

안녕하세요, 루비님.

여러분의 노고와 리더십에 감사를 표하지 않을 수 없습니다.

아주 짧은 기간 동안 당사의 필수 시스템이 완전히 개편되었습니다.

이를 축하하기 위해 금요일에 작은 모임을 가질 예정인데, 여러분이 주빈으로 참석해 주시면 정말 감사하겠습니다.

릴리

멜로디멜로디, 상무이사

루비님,

Pet Theory로부터 루비님의 업무에 대해 높은 평가를 받았습니다. 팀에 큰 도움이 되었어요.

이제 이 업무를 마치셨으니 새로운 프로젝트에서 더 높은 직책을 맡아주실 것을 당부드리고 싶습니다.

멜로디

상무이사

Computer Consulting Inc.

다음 단계/더 학습하기

Google Cloud 교육 및 자격증

Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.

설명서 최종 업데이트: 2024년 2월 1일

실습 최종 테스트: 2023년 9월 20일

Copyright 2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.