이 튜토리얼에서는 Eventarc를 사용하여 한 Google Cloud 프로젝트의 소스에서 이벤트를 읽고 이를 다른 Google Cloud 프로젝트의 타겟 대상으로 라우팅하는 방법을 보여줍니다. 이를 위해서는 Pub/Sub를 교차 프로젝트 전송 계층으로 사용하면 됩니다.
여러 프로젝트에 걸쳐 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 콘솔을 사용하여 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", } [...] }