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


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

목표

이 튜토리얼에서는 다음 단계를 진행합니다.

  1. 한 프로젝트에서 주제를 만든 다음 다른 프로젝트에서 해당 주제에 게시합니다. 이렇게 하면 Eventarc 트리거를 통해 이벤트가 인증되지 않은 Cloud Run 서비스로 라우팅됩니다.

  2. Cloud Storage용 Pub/Sub 알림을 사용하여 Cloud Storage 이벤트를 한 프로젝트에서 다른 프로젝트로 게시합니다. Eventarc 트리거를 사용하여 이벤트를 인증되지 않은 Cloud Run 서비스로 라우팅합니다.

  3. Cloud Logging 싱크를 사용하여 Cloud 감사 로그를 한 프로젝트에서 다른 프로젝트로 게시합니다. Eventarc 트리거를 사용하여 이벤트를 인증되지 않은 Cloud Run 서비스로 라우팅합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.

이 튜토리얼에는 2개의 프로젝트가 필요합니다. 다음 단계는 두 프로젝트 모두에 적용됩니다.

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. gcloud 구성요소를 업데이트합니다.
    gcloud components update
  11. 계정을 사용하여 로그인합니다.
    gcloud auth login

여러 프로젝트에 걸쳐 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 Console을 사용하여 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",
      }
    [...]
    }

삭제

이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하려면 다음 안내를 따르세요.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

튜토리얼 리소스 삭제

  1. 이 튜토리얼에서 배포한 Cloud Run 서비스를 삭제합니다.

    gcloud run services delete SERVICE_NAME

    여기서 SERVICE_NAME은 선택한 서비스 이름입니다.

    Google Cloud Console에서 Cloud Run 서비스를 삭제할 수도 있습니다.

  2. 튜토리얼 설정 중에 추가한 gcloud CLI 기본 구성을 삭제합니다.

    예를 들면 다음과 같습니다.

    gcloud config unset run/region

    또는

    gcloud config unset project

  3. 이 튜토리얼에서 만든 다른 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을 싱크의 이름으로 바꿉니다.

다음 단계