여러 Google Cloud 프로젝트에 걸쳐 이벤트 라우팅

이 튜토리얼에서는 Eventarc를 사용하여 한 Google Cloud 프로젝트의 소스에서 이벤트를 읽고 이를 다른 Google Cloud 프로젝트의 타겟 대상으로 라우팅하는 방법을 보여줍니다. 이를 위해서는 Pub/Sub를 교차 프로젝트 전송 계층으로 사용하면 됩니다.

여러 프로젝트에 걸쳐 Pub/Sub 이벤트 라우팅

Pub/Sub는 전역 분산 서비스이므로 하나의 프로젝트에서 주제를 만들고 다른 프로젝트에서 해당 주제에 게시한 후 메시지를 Cloud Run 서비스로 라우팅하는 Eventarc를 트리거할 수 있습니다.

교차 프로젝트 이벤트: Cloud Pub/Sub 및 Eventarc

  1. Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_TWO_ID

    PROJECT_TWO_ID를Google Cloud 프로젝트 ID로 바꿉니다.

  2. 두 번째 프로젝트에서 다음을 수행합니다.

    1. Cloud Run 및 Eventarc API를 사용 설정합니다.

      gcloud services enable run.googleapis.com eventarc.googleapis.com
    2. 기본 위치를 설정합니다.

      REGION=REGION

      REGION을 지원되는 Eventarc 위치 중 원하는 위치로 바꿉니다. 예를 들면 us-central1입니다.

    3. Pub/Sub 주제를 만듭니다.

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
    4. 사전 빌드된 이미지 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이 표시되면 배포가 완료된 것입니다.

    5. 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라는 트리거가 생성됩니다.

  3. Google Cloud 프로젝트 ID를 첫 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_ONE_ID

    PROJECT_ONE_ID를Google Cloud 프로젝트 ID로 바꿉니다.

  4. 첫 번째 프로젝트에서, 두 번째 프로젝트의 주제로 메시지를 게시합니다.

    gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
  5. Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_TWO_ID
  6. 두 번째 프로젝트에서, 생성된 이벤트가 로깅되었는지 확인합니다.

    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 서비스로 라우팅합니다.

교차 프로젝트 이벤트: Cloud Storage 및 Eventarc

  1. Google Cloud 프로젝트 ID를 첫 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_ONE_ID
  2. Cloud Storage 버킷을 만듭니다.

    PROJECT1=$(gcloud config get-value project)
    BUCKET=$PROJECT1-cross-project
    gcloud storage buckets create gs://$BUCKET --location=${REGION}
  3. 두 번째 프로젝트의 주제에 대한 버킷용 Pub/Sub 알림을 만듭니다.

    gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
  4. 버킷에 파일을 업로드합니다.

    echo "Hello World" > random.txt
    gcloud storage cp random.txt gs://$BUCKET/random.txt
  5. Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_TWO_ID
  6. 두 번째 프로젝트에서, 생성된 이벤트가 로깅되었는지 확인합니다.

    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 서비스로 라우팅할 수 있습니다.

교차 프로젝트 이벤트: Cloud 감사 로그 및 Eventarc

  1. Google Cloud 프로젝트 ID를 첫 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_ONE_ID
  2. 첫 번째 프로젝트에서 Compute Engine의 관리자 읽기, 데이터 읽기, 데이터 쓰기 로그 유형을 사용 설정합니다.

    프로젝트 수준에서 Google Cloud 리소스의 데이터 액세스 감사 로그를 구성하려면 roles/owner IAM(Identity and Access Management) 역할이 필요합니다.

    1. 프로젝트의 IAM 정책을 읽고 파일에 저장합니다.

      gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
      
    2. /tmp/policy.yaml을 수정하되, 데이터 액세스 감사 로그 구성 추가하거나 변경합니다.

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. 다음과 같이 새 IAM 정책을 씁니다.

      gcloud projects set-iam-policy PROJECT_ONE_ID /tmp/policy.yaml
      

      앞의 명령어가 다른 변경사항과의 충돌을 보고할 경우 이 단계를 반복하면서 프로젝트의 IAM 정책 읽기를 시작합니다.

  3. 첫 번째 프로젝트에서, 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.
  4. Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_TWO_ID
  5. 두 번째 프로젝트에서 서비스 계정에 역할을 부여합니다.

    gcloud pubsub topics add-iam-policy-binding my-topic \
        --member=SERVICE_ACCOUNT \
        --role=roles/pubsub.publisher

    SERVICE_ACCOUNT를 이전 단계에서 반환된 서비스 계정 이메일 주소로 바꿉니다.

  6. Google Cloud 프로젝트 ID를 첫 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_ONE_ID
  7. 첫 번째 프로젝트에서 Compute Engine VM 인스턴스를 만듭니다.

    이 튜토리얼에서는 Google Cloud 콘솔을 사용하여 VM 인스턴스를 만드는 경우 기본값을 사용해도 됩니다.

  8. Google Cloud 프로젝트 ID를 두 번째 프로젝트로 설정합니다.

    gcloud config set project PROJECT_TWO_ID
  9. 두 번째 프로젝트에서, 생성된 이벤트가 로깅되었는지 확인합니다.

    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",
      }
    [...]
    }