이 튜토리얼에서는 Eventarc를 사용하여 한 Google Cloud 프로젝트의 소스에서 이벤트를 읽고 이를 다른 Google Cloud 프로젝트의 타겟 대상으로 라우팅하는 방법을 보여줍니다. 이를 위해서는 Pub/Sub를 교차 프로젝트 전송 레이어로 사용하면 됩니다.
목표
이 튜토리얼에서는 다음 단계를 진행합니다.
한 프로젝트에서 주제를 만든 다음 다른 프로젝트에서 해당 주제에 게시합니다. 이렇게 하면 Eventarc 트리거를 통해 이벤트가 인증되지 않은 Cloud Run 서비스로 라우팅됩니다.
Cloud Storage용 Pub/Sub 알림을 사용하여 Cloud Storage 이벤트를 한 프로젝트에서 다른 프로젝트로 게시합니다. Eventarc 트리거를 사용하여 이벤트를 인증되지 않은 Cloud Run 서비스로 라우팅합니다.
Cloud Logging 싱크를 사용하여 Cloud 감사 로그를 한 프로젝트에서 다른 프로젝트로 게시합니다. Eventarc 트리거를 사용하여 이벤트를 인증되지 않은 Cloud Run 서비스로 라우팅합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.
이 튜토리얼에는 2개의 프로젝트가 필요합니다. 다음 단계는 두 프로젝트 모두에 적용됩니다.
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
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
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
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
- gcloud 구성요소를 업데이트합니다.
gcloud components update
- 계정을 사용하여 로그인합니다.
gcloud auth login
여러 프로젝트에 걸쳐 Pub/Sub 이벤트 라우팅
Pub/Sub는 전역 분산 서비스이므로 하나의 프로젝트에서 주제를 만들고 다른 프로젝트에서 해당 주제에 게시한 후 메시지를 Cloud Run 서비스로 라우팅하는 Eventarc를 트리거할 수 있습니다.
Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_TWO_ID
PROJECT_TWO_ID
를 두 번째 Google Cloud 프로젝트의 ID로 바꿉니다.두 번째 프로젝트에서 다음을 수행합니다.
Cloud Run 및 Eventarc API를 사용 설정합니다.
gcloud services enable run.googleapis.com eventarc.googleapis.com
기본 위치를 설정합니다.
REGION=REGION
REGION
을 지원되는 Eventarc 위치 중 원하는 위치로 바꿉니다. 예를 들면us-central1
입니다.Pub/Sub 주제를 만듭니다.
TOPIC=my-topic gcloud pubsub topics create $TOPIC
사전 빌드된 이미지
us-docker.pkg.dev/cloudrun/container/hello
를 사용하여 인증되지 않은 Cloud Run 서비스를 배포합니다.gcloud run deploy hello \ --image=us-docker.pkg.dev/cloudrun/container/hello \ --allow-unauthenticated \ --region=$REGION
서비스 URL이 표시되면 배포가 완료된 것입니다.
Eventarc 트리거로 주제를 서비스에 연결합니다.
gcloud eventarc triggers create cross-project-trigger \ --destination-run-service=hello \ --destination-run-region=${REGION} \ --location=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/PROJECT_TWO_ID/topics/$TOPIC
그러면
cross-project-trigger
라는 트리거가 생성됩니다.
Google Cloud 프로젝트 ID를 첫 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_ONE_ID
PROJECT_ONE_ID
를 첫 번째 Google Cloud 프로젝트의 ID로 바꿉니다.첫 번째 프로젝트에서, 두 번째 프로젝트의 주제로 메시지를 게시합니다.
gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_TWO_ID
두 번째 프로젝트에서, 생성된 이벤트가 로깅되었는지 확인합니다.
gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:hello" --format=json
다음과 유사한 로깅 항목이 반환됩니다.
"message": "Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: hello"
여러 프로젝트에 걸쳐 Cloud Storage 이벤트 라우팅
Cloud Storage용 Pub/Sub 알림을 사용하여 한 프로젝트에서 다른 프로젝트로 이벤트를 게시한 후 해당 이벤트를 Eventarc 트리거를 통해 Cloud Run 서비스로 라우팅합니다.
Google Cloud 프로젝트 ID를 첫 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_ONE_ID
Cloud Storage 버킷을 만듭니다.
PROJECT1=$(gcloud config get-value project) BUCKET=$PROJECT1-cross-project gcloud storage buckets create gs://$BUCKET --location=${REGION}
두 번째 프로젝트의 주제에 대한 버킷용 Pub/Sub 알림을 만듭니다.
gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
버킷에 파일을 업로드합니다.
echo "Hello World" > random.txt gcloud storage cp random.txt gs://$BUCKET/random.txt
Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_TWO_ID
두 번째 프로젝트에서, 생성된 이벤트가 로깅되었는지 확인합니다.
gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:random.txt" --format=json
다음과 유사한 로깅 항목이 반환됩니다.
Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: { "kind": "storage#object", "id": "project1-cross-project/random.txt/1635327604259719", "selfLink": "https://www.googleapis.com/storage/v1/b/project1-cross-project/o/random.txt", "name": "random.txt", "bucket": "project1-cross-project", "generation": "1635327604259719", [...] }
여러 프로젝트에 걸쳐 Cloud 감사 로그 이벤트 라우팅
서비스에 대한 요청은 트리거의 필터 기준과 일치하는 감사 로그 항목이 생성될 때 트리거될 수 있습니다. (자세한 내용은 Cloud 감사 로그의 이벤트 필터 확인을 참조하세요.) 이 경우 첫 번째 프로젝트에 Compute Engine VM 인스턴스가 생성되면 트리거의 필터 기준과 일치하는 감사 로그 항목을 사용하여 이벤트를 캡처하고 두 번째 프로젝트의 Cloud Run 서비스로 라우팅할 수 있습니다.
Google Cloud 프로젝트 ID를 첫 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_ONE_ID
첫 번째 프로젝트에서 Compute Engine의 관리자 읽기, 데이터 읽기, 데이터 쓰기 로그 유형을 사용 설정합니다.
프로젝트 수준에서 Google Cloud 리소스의 데이터 액세스 감사 로그를 구성하려면
roles/owner
IAM(Identity and Access Management) 역할이 필요합니다.프로젝트의 IAM 정책을 읽고 파일에 저장합니다.
gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
/tmp/policy.yaml
을 수정하되, 데이터 액세스 감사 로그 구성만 추가하거나 변경합니다.auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_READ - logType: DATA_WRITE service: compute.googleapis.com
다음과 같이 새 IAM 정책을 씁니다.
gcloud projects set-iam-policy PROJECT_ONE_ID /tmp/policy.yaml
앞의 명령어가 다른 변경사항과의 충돌을 보고할 경우 이 단계를 반복하면서 프로젝트의 IAM 정책 읽기를 시작합니다.
첫 번째 프로젝트에서, Cloud 감사 로그를 두 번째 프로젝트의 주제로 라우팅하려면 Cloud Logging 싱크를 만듭니다.
gcloud logging sinks create cross-project-sink \ pubsub.googleapis.com/projects/PROJECT_TWO_ID/topics/my-topic \ --log-filter='protoPayload.methodName="beta.compute.instances.insert"'
다음과 유사한 알림이 반환됩니다.
Please remember to grant `serviceAccount:p1011272509317-375795@gcp-sa-logging.iam.gserviceaccount.com` the Pub/Sub Publisher role on the topic.
Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_TWO_ID
두 번째 프로젝트에서 서비스 계정에 역할을 부여합니다.
gcloud pubsub topics add-iam-policy-binding my-topic \ --member=SERVICE_ACCOUNT \ --role=roles/pubsub.publisher
SERVICE_ACCOUNT
를 이전 단계에서 반환된 서비스 계정 이메일 주소로 바꿉니다.Google Cloud 프로젝트 ID를 첫 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_ONE_ID
첫 번째 프로젝트에서 Compute Engine VM 인스턴스를 만듭니다.
이 튜토리얼에서는 Google Cloud Console을 사용하여 VM 인스턴스를 만드는 경우 기본값을 사용해도 됩니다.
Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.
gcloud config set project PROJECT_TWO_ID
두 번째 프로젝트에서, 생성된 이벤트가 로깅되었는지 확인합니다.
gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:beta.compute.instances.insert" --format=json
다음과 유사한 로깅 항목이 반환됩니다.
Received event of type google.cloud.pubsub.topic.v1.messagePublished. Eventdata: { "logName": "projects/workflows-atamel/logs/cloudaudit.googleapis.com%2Factivity", "operation": { "id": "operation-1635330842489-5cf5321f4f454-ecc363cd-3883c08d", "last": true, "producer": "compute.googleapis.com" }, "protoPayload": { "@type": "type.googleapis.com/google.cloud.audit.AuditLog", "methodName": "beta.compute.instances.insert", } [...] }
삭제
이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하려면 다음 안내를 따르세요.
- 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.
튜토리얼 리소스 삭제
이 튜토리얼에서 배포한 Cloud Run 서비스를 삭제합니다.
gcloud run services delete SERVICE_NAME
여기서
SERVICE_NAME
은 선택한 서비스 이름입니다.Google Cloud Console에서 Cloud Run 서비스를 삭제할 수도 있습니다.
튜토리얼 설정 중에 추가한 gcloud CLI 기본 구성을 삭제합니다.
예를 들면 다음과 같습니다.
gcloud config unset run/region
또는
gcloud config unset project
이 튜토리얼에서 만든 다른 Google Cloud 리소스를 삭제합니다.
Eventarc 트리거를 삭제합니다.
gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
을 트리거의 이름으로 바꿉니다.Pub/Sub 주제를 삭제합니다.
gcloud pubsub topics delete TOPIC TOPIC_ID
TOPIC_ID
를 주제의 ID로 바꿉니다.Cloud Logging 싱크를 삭제합니다.
gcloud logging sinks delete SINK_NAME
SINK_NAME
을 싱크의 이름으로 바꿉니다.