Pub/Sub 메시지를 사용하여 이벤트 수신(gcloud CLI)
이 빠른 시작에서는 Eventarc를 사용하여 Pub/Sub 주제 이벤트를 수신할 대상으로 Google Kubernetes Engine(GKE) 서비스를 설정하는 방법을 보여줍니다.
이 빠른 시작에서는 다음을 수행합니다.
- API 사용 설정 및 서비스 계정 설정과 같은 준비 태스크를 완료합니다.
- GKE 클러스터 만들기
- Eventarc에서 GKE 대상을 초기화합니다.
- 이벤트를 수신하는 GKE 서비스를 배포합니다.
- Pub/Sub 주제를 GKE 서비스에 연결하는 Eventarc 트리거를 만듭니다.
- Pub/Sub 이벤트를 생성하고 확인합니다.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- Google Cloud CLI 구성요소를 업데이트합니다.
gcloud components update
- Eventarc, Resource Manager, Google Kubernetes Engine API를 사용 설정합니다.
gcloud services enable eventarc.googleapis.com \ cloudresourcemanager.googleapis.com \ container.googleapis.com
- 이 빠른 시작에서 사용되는 구성 변수를 설정합니다.
PROJECT_ID=$(gcloud config get-value project) CLUSTER_NAME=events-cluster SERVICE_NAME=hello-gke LOCATION=us-central1
-
프로젝트 생성자에게는 기본 소유자 역할(
roles/owner
)이 부여됩니다. 기본적으로 Identity and Access Management(IAM) 역할에는 대부분의 Google Cloud 리소스에 대한 전체 액세스에 필요한 권한이 포함되며, 이 단계를 건너뛸 수 있습니다.프로젝트 생성자가 아니면 프로젝트에서 적합한 주 구성원에 대해 필수 권한을 부여해야 합니다. 예를 들어 주 구성원은 Google 계정(최종 사용자)이거나 서비스 계정(애플리케이션 및 컴퓨팅 워크로드)일 수 있습니다. 자세한 내용은 이벤트 대상의 역할 및 권한 페이지를 참조하세요.
필수 권한
빠른 시작을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
-
Eventarc 관리자(
roles/eventarc.admin
) -
Kubernetes Engine 관리자(
roles/container.admin
) -
로그 뷰 접근자 (
roles/logging.viewAccessor
) -
프로젝트 IAM 관리자(
roles/resourcemanager.projectIamAdmin
) -
Pub/Sub 게시자(
roles/pubsub.publisher
) -
서비스 계정 관리자(
roles/iam.serviceAccountAdmin
) -
서비스 계정 사용자(
roles/iam.serviceAccountUser
) -
서비스 사용량 관리자(
roles/serviceusage.serviceUsageAdmin
)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
-
Eventarc 관리자(
테스트 목적으로 Eventarc 트리거에 연결할 때 트리거의 ID를 나타내기 위해 Compute Engine 기본 서비스 계정을 기록해 둡니다. 이 서비스 계정은 Compute Engine을 사용하는 Google Cloud 서비스를 사용 설정하거나 사용한 후에 다음 이메일 형식으로 자동 생성됩니다.
PROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
를 Google Cloud 프로젝트 번호로 바꿉니다. Google Cloud 콘솔의 시작 페이지에서 또는 다음 명령어를 실행하여 프로젝트 번호를 찾을 수 있습니다.gcloud projects describe PROJECT_ID --format='value(projectNumber)'
프로덕션 환경의 경우 새 서비스 계정을 만들고 필요한 최소한의 권한을 포함하고 최소 권한 원칙을 따르는 하나 이상의 IAM 역할을 부여하는 것이 좋습니다.
- Eventarc 트리거가 Pub/Sub에서 이벤트를 가져올 수 있도록 프로젝트의 Pub/Sub 구독자 역할(
roles/pubsub.subscriber
)을 Compute Engine 기본 서비스 계정에 부여합니다.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/pubsub.subscriber
- 2021년 4월 8일 이전에 Cloud Pub/Sub 서비스 에이전트를 사용 설정하여 인증된 Pub/Sub 푸시 요청을 지원한 경우 서비스 계정 토큰 생성자 역할(
roles/iam.serviceAccountTokenCreator
)을 서비스 에이전트에 부여합니다. 그렇지 않으면 기본적으로 이 역할이 부여됩니다.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
GKE 클러스터 만들기
GKE 클러스터는 클러스터 제어 영역 머신 한 개 이상과 노드라는 작업자 머신 여러 개로 구성됩니다. 노드란 클러스터를 구성하기 위해 필요한 Kubernetes 프로세스를 실행하는 Compute Engine 가상 머신(VM) 인스턴스입니다. 클러스터에 애플리케이션을 배포하고 애플리케이션은 노드에서 실행됩니다.
events-cluster
라는 Autopilot 클러스터를 만듭니다.
gcloud container clusters create-auto $CLUSTER_NAME \ --region $LOCATION
클러스터 생성이 완료되는 데 몇 분이 걸릴 수 있습니다. 클러스터가 생성되면 다음과 유사한 출력이 표시됩니다.
Creating cluster events-cluster...done.
Created [https://container.googleapis.com/v1/projects/MY_PROJECT
/zones/us-central1/clusters/events-cluster].
[...]
STATUS: RUNNING
그러면 Google Cloud 프로젝트 ID가 MY_PROJECT
인 프로젝트에 events-cluster
라는 GKE 클러스터가 생성됩니다.
GKE 대상 사용 설정
Eventarc는 GKE 서비스를 타겟팅하는 트리거별로 Pub/Sub에서 이벤트를 가져와 대상으로 전달하는 이벤트 전달자 구성요소를 만듭니다. GKE 클러스터에서 구성요소를 만들고 리소스를 관리하려면 권한을 Eventarc 서비스 에이전트에 부여합니다.
Eventarc에 GKE 대상을 사용 설정합니다.
gcloud eventarc gke-destinations init
필요한 역할을 결합하라는 메시지가 표시되면
y
를 입력합니다.다음 역할이 서비스 계정에 결합됩니다.
compute.viewer
container.developer
iam.serviceAccountAdmin
GKE 서비스 대상 만들기
사전 빌드된 이미지 us-docker.pkg.dev/cloudrun/container/hello
를 사용하여 이벤트를 수신하고 로깅하는 GKE 서비스를 배포합니다.
Kubernetes는
kubeconfig
라는 YAML 파일을 사용하여kubectl
의 클러스터 인증 정보를 저장합니다. GKE 클러스터에서kubectl
을 가리키도록 사용자 인증 정보와 엔드포인트 정보로kubeconfig
파일을 업데이트합니다.gcloud container clusters get-credentials $CLUSTER_NAME \ --region $LOCATION
Kubernetes 배포를 만듭니다.
kubectl create deployment $SERVICE_NAME \ --image=us-docker.pkg.dev/cloudrun/container/hello
이를 Kubernetes 서비스로 노출합니다.
kubectl expose deployment $SERVICE_NAME \ --type ClusterIP \ --port 80 \ --target-port 8080
Eventarc 트리거 만들기
메시지가 Pub/Sub 주제에 게시되면 Eventarc 트리거에서 메시지를 hello-gke
GKE 서비스에 보냅니다.
Pub/Sub 메시지를 리슨하는 GKE 트리거를 만듭니다.
새 Pub/Sub 주제
gcloud eventarc triggers create gke-trigger-pubsub \ --location="$LOCATION" \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
이렇게 하면 새 Pub/Sub 주제와
gke-trigger-pubsub
라는 트리거가 생성됩니다.기존 Pub/Sub 주제
gcloud eventarc triggers create gke-trigger-pubsub \ --location="$LOCATION" \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID
다음을 바꿉니다.
PROJECT_ID
: Google Cloud 프로젝트 ID입니다.TOPIC_ID
: 기존 Pub/Sub 주제의 ID로 기존 Pub/Sub 주제에 대한gke-trigger-pubsub
라는 이름의 트리거를 만듭니다.
트리거가 성공적으로 생성되었는지 확인하세요. 트리거가 완전하게 작동하는 데 최대 2분이 걸릴 수 있습니다.
gcloud eventarc triggers list
출력은 다음과 비슷하게 표시됩니다.
NAME: gke-trigger-pubsub TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: GKE: hello-gke ACTIVE: Yes LOCATION: us-central1
이벤트 생성 및 확인
메시지를 Pub/Sub 주제에 게시하면 GKE 서비스를 트리거하는 이벤트를 생성할 수 있습니다. 그런 다음 포드 로그에서 메시지를 볼 수 있습니다.
Pub/Sub 주제를 환경 변수로 찾아서 설정합니다.
TOPIC=$(gcloud eventarc triggers describe gke-trigger-pubsub \ --location=us-central1 \ --format='value(transport.pubsub.topic)')
Pub/Sub 주제에 메시지를 보내 이벤트를 생성합니다.
gcloud pubsub topics publish $TOPIC --message="Hello World"
GKE 서비스에서 이벤트 메시지를 로깅합니다.
이벤트 메시지를 보려면 다음 안내를 따르세요.
포드 ID를 찾습니다.
kubectl get pods
출력은 다음과 비슷하게 표시됩니다.
NAME READY STATUS RESTARTS AGE hello-gke-645964f578-2mjjt 1/1 Running 0 35s
다음 단계에서 사용할 포드의
NAME
을 복사합니다.포드의 로그를 확인합니다.
kubectl logs NAME
NAME
을 복사한 포드의 이름으로 바꿉니다.다음과 같은 로그 항목을 찾습니다.
2022/02/24 22:23:49 Hello from Cloud Run! The container started successfully and is listening for HTTP requests on $PORT {"severity":"INFO","eventType":"google.cloud.pubsub.topic.v1.messagePublished","message":"Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: Hello World"[...]}
삭제
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다.
다음과 같은 작업을 할 수 있습니다.
-
이렇게 하면 연결된 Pub/Sub 주제도 삭제됩니다.
또는 Google Cloud 프로젝트를 삭제하여 비용 청구를 방지할 수 있습니다. Google Cloud 프로젝트를 삭제하면 프로젝트 내에서 사용되는 모든 리소스에 대한 비용 청구가 중지됩니다.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
여러 튜토리얼과 빠른 시작을 살펴보려는 경우 프로젝트를 재사용하면 프로젝트 할당량 한도 초과를 방지할 수 있습니다.