코딩스토리

Cloud Pub/Sub in Action - ep.3 본문

Google Cloud Platform

Cloud Pub/Sub in Action - ep.3

kimtaehyun98 2022. 7. 5. 02:50

# 해당 포스팅은 Google Cloud Tech Youtube의 Cloud Pub/Sub 관련 영상을 기반으로 작성하였습니다.

 

Cloud Pub/Sub in Action - ep.3

이제 Cloud Pub/Sub이 어떤 문제점을 해결하기 위해서 나왔는지, 또 어떠한 모델을 통해 작동하는지를 이해했다.

(이전 포스팅 링크 : https://kimtaehyun98.tistory.com/146)

 

그럼 이제 실제로 만들어보자.

 

 

우리는 최종적으로 아래와 같은 작업을 하는 Pub/Sub 모델을 구축할 것이다.

즉 간단하게 설명하면 

Order가 들어오면 Pub/Sub은 해당 Topic을 구독하고 있는 packaging과 notification Subscriber에게 Order가 들어왔음을 알리는 모델이다.

 

구현은 다음과 같은 순서로 진행된다.

그전에 먼저 Google Cloud 계정이 있어야겠죠?

Google Cloud 가입 링크

먼저 Google Cloud 가입을 진행해줍니다.

 

여기는 AWS와 다르게 가입만 해도 300 달러의 무료 크레딧을 제공해주네요!

(절대 Google Cloud 홍보하는거 아닙니다..! 저도 AWS 자주 씁니당 ㅎㅎ🥴)

 

가입이 완료되었다면, 메인 페이지에서 왼쪽 상단의 메뉴 버튼을 누르고 내리다 보면 Pub/Sub 탭을 확인할 수 있습니다.

 

이제 Pub/Sub으로 들어가 보면 여러가지 탭을 확인할 수 있습니다.

 

그중 상단의 주제 만들기를 클릭해줍니다.

이때 주제란 Topic을 의미합니다.

 

 

 

주제를 성공적으로 만들었다.

이 뜻은 Topic이 만들어졌다는 것이다.

그럼 이제 Subscription을 만들어야 한다.

 

하단의 구독 만들기 버튼을 누른다.

우리는 앞선 아키텍처를 구현해야 하기 때문에 package_sub으로 이름을 붙였다.

 

나머지 설정은 default로 설정한다. 즉 가져오기(Pull) Subscription을 생성하는 것이다.

(설명은 너무 잘 되어 있으니 궁금하면 읽어보면 좋을 듯 👍)

똑같은 방식으로 Notification Subscription도 생성한다.

 

이 작업이 끝나면 Step1을 성공적으로 완료한 것이다.

 

Step2는 애플리케이션이 인증에 사용하는 서비스 계정을 만들고 Cloud IAM 권한을 설정하는 단계이다.

 

먼저 IAM 및 관리자 탭의 서비스 계정으로 들어간다.

 

 

다음으로 상단의 서비스 계정 만들기를 선택하고 아래 사진처럼 진행한다. (액세스 권한 부여 확인하기)

(아래 사진에서 역할을 처음에 잘못설정했었다.. pub/sub 라이트 게시자 하면 나중에 실행 안됨!!)

 

 

계정 생성이 완료되었다면 키 탭으로 들어가 키를 추가해준다. (Key는 JSON)으로!

 

키 생성을 완료하면 Download 폴더에 확인 후 파일 이름을 "key.json"으로 변경한다.

 

이 작업까지 마치면 Step2가 끝난다.

 

다음으로 Step3는 publisher와 Subscriber 앱을 시작하는 것이다.

 

앞선 포스팅에서 설명했듯 많은 종류의 앱이 pub, sub이 될 수 있다. 

 

내가 진행하고 있는 현재 프로젝트에서는 Google Cloud Run이 될 것이다.

 

어쨌든 이 과정을 수행하려면 Google Cloud SDK가 있어야 한다.

SDK를 설치해야만 gcloud 같은 커맨드 라인 명령어를 사용할 수 있다.

 

다운 방법은 해당 링크에 가 보면 Google Cloud 측에서 아주 잘 설명해주고 있다.🤭

 

[Mac OS M1 기준]

SDK를 다운 받아서 압축 해제 후 터미널 창을 연다.

터미널 창에 ./install.sh 입력 후 y를 누르면 설치가 된다.

이후 꼭 터미널 한번 껐다 키기!

 

설치가 완료되었으면  아래와 같이 순서대로 수행한다.

(Google Cloud를 처음 다루는 분이라면 수행하지 마세요!!! 오류 납니다!!! 아래 정상 작동 코드 있어요!!!)

// 명령어를 통해 구글 계정에 로그인해줘야 한다. 
// web에서 google 계정 인증하는 창 나오고 확인 누르면 인증된다.

gcloud auth login 


// config 설정 

gcloud config set project pubsub-demo-pv


// topics 보기

gcloud pubsub topics list

를 치면!

 

다음과 같은 오류를 만날 수 있다.

taehyun@Taehyun-MacBookPro ~ % gcloud pubsub topics list              
ERROR: (gcloud.pubsub.topics.list) Projects instance [pubsub-demo-pv] not found: 
Requested project not found or user does not have access to it (project=pubsub-demo-pv).
Make sure to specify the unique project identifier and not the Google Cloud Console display name.

 

대충 읽어보면 프로젝트를 찾을 수 없다는 것 같다.

 

그럼 어떤 프로젝트들이 있는지 확인해보자.

gcloud projects list

웬 밑도 끝도 없는 왜 들어가 있는지 도저히 모르겠는 프로젝트들만 나온다.

 

이유는 진짜 간단했다..

그냥 내가 Project 이름을 설정을 안 했었다..

 

Google Cloud의 PubSub 페이지에 들어가 보면 내 프로젝트가 My first Project로 되어있다.

 

유튜브 강의에서는 pubsub-demo-pv로 되어있었네요..

 

 

바꾸기 귀찮으니 저 프로젝트 명 그대로 명령어를 실행해봅시다..!

(이 코드를 실행하면 됩니다!!)

gcloud projects list

// 나온 리스트 중 My First Project의 Project Id 복사

gcloud config set project 복사한projectId

gcloud pubsub topics list

 

 

와.. 생각보다 별 거 아니었는데 해결하는데 오래 걸렸다.

 

다시 진행해보자.

 

아래 명령어 입력 시 잘 나오면 제대로 진행 중인 것이다.

gcloud pubsub subscriptions list

 

이제 폴더를 생성하고 아래 따라 하자.

// dir 생성
mkdir pubsub-demo

// 생성된 dir로 이동
cd pubsub-demo

// sample code clone (이거 진행하지 마세요!! 아래 이유 나옴!!)
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

 

 

 

다음 과정을 진행하기 위해 먼저 Python이 깔려 있어야 한다!!

(웬만한 개발자라면 다 깔려있겠지만, 저는 새로 산 노트북으로 작업 중이라 Python을 설치했습니다.. 😭)

 

왜냐하면 파이썬 가상 환경에서 작업을 진행해야 하기 때문이다. 

 

python이 설치되어 있다면 (또는 설치를 완료했다면)

 

[Mac M1 기준]

# homebrew 깔려있다는 가정하에

brew update
brew install pyenv
brew install pyenv-virtualenv

 

위의 방법을 통해 virtualenv 깔아야 된다.

 

그리고 Mac M1이라면  vim ~/.zshrc를 한 뒤 아래 내용을 추가해주어야 한다. (설정하는데만 한 시간이 넘게 걸리네..😰)

# penv & virtualenv
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1

 

설정이 완료되었다면, 터미널 창을 3개 연다. (지금부터 모든 코드는 3개의 터미널 창 모두에게 입력해야 한다.)

이유는 하나는 Publisher의 역할, 나머지 두 개는 Subscriber의 역할을 하게 된다.

 

이제 진짜로 파이썬 가상 환경을 열어보자.

# " " 빼고 그 안에 자신의 파이썬 버전 입력, venv는 가상환경 이름임!
pyenv virtualenv "자신의 python-version" venv

# 가상환경 "venv" 실행
pyenv activate venv

 

가상 환경이 열렸다면 아래의 코드를 통해 google-cloud-pubsub을 다운로드한다. (물론 가상 환경에)

pip install --upgrade google-cloud-pubsub

 

다음으로 아까 전에 저장해놓았던 (아까 전이 아닐 수도 있지만..). json 키 파일을 설정한다. (물론 3개의 터미널 모두)

export GOOGLE_APPLICATION_CREDENTIALS=~/Downloads/key.json

 

다음으로 현재 프로젝트 ID를 설정해준다.

export PROJECT=`gcloud config get-value project`

(제대로 설정되었는지 보려면 "echo $PROJECT"를 입력했을 때 위에서 설정했던 project ID가 나오면 된다.)

 

이제 여기서 Publisher 코드를 실행해야 되는데.. 영상에서 나온 경로에는 예제 파일이 없었다..

열심히 찾다 보니 결국 유튜브 댓글에서 답을 찾을 수 있었다.. 또 내 한 시간이 날아갔다... 

자료는 좋은데 너무 옛날 거라 이런가 슬슬 화가 나기 시작한다..

 

아까 위에서 pubsub-demo 폴더에 클론 한 것 지우고 다시 클론 합니다.

git clone git@github.com:googleapis/python-pubsub.git

 

다음으로 해당 명령어들을 수행하면, pub 역할은 마무리된다.

# sample code가 있는 quickstart 폴더로 이동합니다.
cd samples/snippets/quickstart

# 보내는 data 변경
vi pub.sub

# 코드 내부에서 "Hello world"를 order Received로 변경
def pub(project_id: str, topic_id: str) -> None:
    """Publishes a message to a Pub/Sub topic."""
    # Initialize a Publisher client.
    client = pubsub_v1.PublisherClient()
    # Create a fully qualified identifier of form `projects/{project_id}/topics/{topic_id}`
    topic_path = client.topic_path(project_id, topic_id)

    # Data sent to Cloud Pub/Sub must be a bytestring.
    data = b"Order Received!"

    # When you publish a message, the client returns a future.
    api_future = client.publish(topic_path, data)
    message_id = api_future.result()

    print(f"Published {data.decode()} to {topic_path}: {message_id}")

 

이제 메시지를 보낼 준비가 끝났으니 이제 Pub이 Sub에게 메시지를 보내보자.

 

Subscriber 역할을 하는 터미널 창 : python pub.py $PROJECT order_topic

(Sub 먼저 켜놔야 됨. 왜냐하면 Listening 해야 되기 때문!!)

 

Publisher 역할을 하는 터미널 창 : python sub.py $PROJECT package_sub

 

 

결과적으론 Sub 터미널 창에서 이런 화면을 볼 수 있다.

 

이 화면은 Publisher가 "Order Received"란 메시지를 보낸 것을 Subscriber가 가져온 것이다.

 

Notification_sub도 마찬가지로 똑같은 결과 화면을 받을 수 있다.

 

이렇게 해서 결론적으로 처음 제시했던 아래 그림과 같은 파이프라인이 구축되었다.

 

영상은 6분짜린데 이거 따라 하는데만 하루를 다 쏟았다..

 

역시 새로 배우는 건 쉽지 않다.

 

하지만 확실한 건 직접 따라서 실행해봄으로써 많은 것을 배울 수 있었다.

(일단 맥북 설정 진짜 어렵다는 건 확실히 알았음 🤬)

 

어쨌든 이제 Pub Sub의 개념을 확실히 이해했고, 어떻게 사용해야 될지 감이 잡혔다!

 

다음으로는 Sub 역할을 하는 애플리케이션을 Google Cloud Run으로 작업하는 과정을 공부할 예정이다. 

 

https://www.youtube.com/watch?v=f5DOsB7Nlw0 

 

Comments