Firebase 알림 이벤트를 GKE로 라우팅

Eventarc 트리거는 특정 이벤트 또는 이벤트 집합에 관심이 있음을 선언합니다. 이벤트 소스 및 GKE 클러스터에서 실행되는 대상 Google Kubernetes Engine(GKE) 서비스를 포함하여 트리거 필터를 지정하여 이벤트 라우팅을 구성할 수 있습니다. 대상에는 공개 엔드포인트가 있는 공개 또는 비공개 GKE 클러스터에서 실행되는 서비스만 포함될 수 있습니다. 비공개 엔드포인트가 있는 GKE 클러스터의 서비스를 타겟팅하려면 이벤트를 내부 HTTP 엔드포인트로 라우팅하세요.

Eventarc는 HTTP 요청을 통해 이벤트를 CloudEvents 형식으로 이벤트 수신자에게 전달합니다.

이 안내에서는 직접Firebase Alerts 이벤트에 의해 트리거되는 GKE 서비스에 대한 이벤트 라우팅을 구성하는 방법을 보여줍니다. 자세한 내용은 지원되는 직접 이벤트 목록을 참조하세요.

시작하기 전에

대상 서비스가 실행 중인 GKE 클러스터에서 워크로드 아이덴티티를 사용 설정해야 합니다. 워크로드 아이덴티티는 이벤트 전달자를 올바르게 설정하는 데 필요하며 향상된 보안 속성과 관리 편의성으로 인해 GKE 내에서 실행되는 애플리케이션에서 Google Cloud 서비스에 액세스하는 데 권장되는 방식입니다.

GKE 대상에 대한 Eventarc 이벤트 아키텍처

워크로드 아이덴티티

GKE에서 실행되는 애플리케이션은 Google Cloud API에 액세스해야 할 수 있습니다. 워크로드 아이덴티티를 사용하면 GKE 클러스터의 Kubernetes 서비스 계정이 IAM 서비스 계정 역할을 수행할 수 있습니다. 구성된 Kubernetes 서비스 계정을 사용하는 포드는 Google Cloud API에 액세스할 때 자동으로 IAM 서비스 계정으로 인증됩니다. 워크로드 아이덴티티를 사용하면 클러스터의 애플리케이션마다 고유하고 세분화된 ID와 승인을 할당할 수 있습니다. 특정 권한을 Eventarc 트리거의 서비스 계정에 부여해야 합니다. 이 문서의 서비스 계정 만들기 단계를 참조하세요.

GKE 클러스터에서 워크로드 아이덴티티 사용 설정 및 구성에 대한 자세한 내용은 워크로드 아이덴티티 사용을 참조하세요.

이벤트 전달자

Eventarc의 이벤트 전달자는 Eventarc에서 새 이벤트를 가져와 GKE 대상으로 전달합니다. 이 구성요소는 Pub/Sub 전송 계층과 GKE 서비스 사이에서 중재자 역할을 합니다. 기존 서비스에서 작동하고 신호 서비스(완전 관리형 클러스터의 외부에 노출되지 않은 서비스 포함)를 지원하면서 설치 및 유지보수를 단순화합니다. 네트워킹 수준에서 GKE 서비스의 이벤트를 수신하기 위해서는 모든 이벤트가 동일한 GKE 클러스터 내에 있는 원본에서 전달되므로 외부 트래픽에 대한 서비스를 지원할 필요가 없습니다.

이벤트 전달자 수명 주기는 Eventarc에서 관리되며 이벤트 전달자를 실수로 삭제하면 Eventarc에서 이 구성요소를 복원합니다.

GKE 대상을 가리키는 각 트리거에 대해 이벤트 전달자(특별히 구성된 gke-forwarder 포드)는 다음을 수행합니다.

  1. Pub/Sub API를 사용하여 트리거 전송자(Pub/Sub 주제 및 구독)에 대한 StreamingPull 연결을 열고 이벤트가 사용 가능해지면 수신합니다.

  2. 이벤트를 올바른 CloudEvents 형식으로 변환하고 대상 GKE 서비스에 HTTP POST 요청으로 인코딩하고 전달합니다.

gke-forwarder 인스턴스를 실행하고 정기적으로 업데이트하려면 Eventarc 서비스 에이전트에 권한이 필요합니다. 이 권한은 프로젝트당 한 번 부여되어야 합니다. 자세한 내용은 이 문서에서 GKE 대상 사용 설정을 참조하세요.

트리거 만들기 준비

Eventarc는 GKE 서비스를 타겟팅하는 트리거별로 이벤트 전달자 구성요소를 만듭니다. Eventarc에서 GKE 클러스터에 구성요소를 설치하고 리소스를 관리하려면 해당 권한이 필요합니다. GKE 대상에 대한 Eventarc 트리거를 만들기 전에 다음 작업을 완료해야 합니다.

콘솔

  1. Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 만들거나 선택합니다.

    프로젝트 선택자로 이동

  2. Eventarc, Eventarc Publishing, Google Kubernetes Engine, Resource Manager API를 사용 설정합니다.

    API 사용 설정

  3. 해당하는 경우 직접 이벤트와 관련된 API를 사용 설정합니다. 예를 들어 Firebase Alerts 이벤트의 경우 Firebase Alerts API를 사용 설정합니다.

  4. 아직 계정이 없는 경우 사용자 관리형 서비스 계정을 만들고 Eventarc에서 대상 서비스의 이벤트를 관리할 수 있도록 필요한 역할과 권한을 계정에 부여합니다.

    1. Google Cloud 콘솔에서 서비스 계정 만들기 페이지로 이동합니다.

      서비스 계정 만들기로 이동

    2. 프로젝트를 선택합니다.

    3. 서비스 계정 이름 필드에 이름을 입력합니다. Google Cloud 콘솔은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다.

      서비스 계정 설명 필드에 설명을 입력합니다. 예를 들면 Service account for event trigger입니다.

    4. 만들고 계속하기를 클릭합니다.

    5. 적절한 액세스 권한을 제공하기 위해 역할 선택 목록에서 서비스 계정에 부여할 필요한 Identity and Access Management(IAM) 역할을 선택합니다. 자세한 내용은 GKE 대상의 역할 및 권한을 참조하세요.

      역할을 추가하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.

    6. 계속을 클릭합니다.

    7. 계정 만들기를 마치려면 완료를 클릭합니다.

gcloud

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

  2. Eventarc, Eventarc Publishing, Google Kubernetes Engine, Resource Manager API를 사용 설정합니다.

    gcloud services enable eventarc.googleapis.com \
        eventarcpublishing.googleapis.com \
        container.googleapis.com \
        cloudresourcemanager.googleapis.com

  3. 해당하는 경우 직접 이벤트와 관련된 API를 사용 설정합니다. 예를 들어 Firebase Alerts 이벤트의 경우 firestore.googleapis.com를 사용 설정합니다.

  4. 아직 계정이 없는 경우 사용자 관리형 서비스 계정을 만들고 Eventarc가 GKE 대상의 이벤트를 관리할 수 있도록 필요한 역할과 권한을 계정에 부여합니다.

    1. 서비스 계정을 만듭니다.

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      SERVICE_ACCOUNT_NAME을 서비스 계정의 이름으로 바꿉니다. 6~30자(영문 기준) 사이여야 하며 소문자 영숫자 문자와 대시를 포함할 수 있습니다. 서비스 계정을 만든 후에는 이름을 변경할 수 없습니다.

    2. 필요한 Identity and Access Management(IAM) 역할 또는 권한을 부여합니다. 자세한 내용은 GKE 대상의 역할 및 권한을 참조하세요.

GKE 대상 사용 설정

Eventarc가 GKE 클러스터의 리소스를 관리할 수 있도록 하려면 GKE 대상을 사용 설정하고 Eventarc 서비스 에이전트를 필요한 역할과 결합합니다.

  1. Eventarc에 GKE 대상을 사용 설정합니다.

    gcloud eventarc gke-destinations init
    
  2. 필요한 역할을 결합하라는 메시지가 표시되면 y를 입력합니다.

    다음 역할이 결합됩니다.

    • roles/compute.viewer
    • roles/container.developer
    • roles/iam.serviceAccountAdmin

트리거 만들기

Google Cloud CLI를 사용하거나 Google Cloud 콘솔을 통해 Eventarc 트리거를 만들 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 Eventarc 트리거 페이지로 이동합니다.

    트리거로 이동

  2. 트리거 만들기를 클릭합니다.
  3. 트리거 이름을 입력합니다.

    트리거의 ID이며 문자로 시작해야 합니다. 최대 63자(영문 기준)의 소문자, 숫자, 하이픈을 포함할 수 있습니다.

  4. 트리거 유형으로 Google 소스를 선택합니다.
  5. 이벤트 제공자 목록에서 Firebase Alerts를 선택합니다.

    연결된 Google Cloud 문서에 사용된 이벤트 제공자 이름에 Cloud 또는 Google Cloud 프리픽스가 없을 수 있습니다. 예를 들어 콘솔에서는 Redis용 MemorystoreRedis용 Google Cloud Memorystore라고 합니다.

  6. 이벤트 유형 목록의 직접 이벤트에서 이벤트 유형을 선택합니다.
  7. 이벤트 페이로드의 인코딩을 지정하려면 이벤트 데이터 콘텐츠 유형 목록에서 application/json 또는 application/protobuf를 선택합니다.

    JSON으로 형식이 지정된 이벤트 페이로드는 Protobuf로 형식이 지정된 이벤트 페이로드보다 큽니다. 그로 인해 이벤트 대상 및 이벤트 크기 한도에 따라 안정성에 영향을 미칠 수 있습니다. 자세한 내용은 알려진 문제를 참조하세요.

  8. 리전 목록에서 전역(전역)을 선택합니다.

    자세한 내용은 Eventarc 위치를 참조하세요.

  9. 속성 1 필드에서 alerttype 리소스 ID는 이벤트 필터 역할을 합니다. 이 필터의 연산자를 선택합니다.
  10. 속성 값 1 필드에서 다음 중 하나를 선택합니다.
    • appDistribution.inAppFeedback: 테스터가 지정된 앱에 대해 인앱 의견을 제출하면 이벤트가 전송됩니다.
    • appDistribution.newTesterIosDevice: 지정된 앱에 새로운 iOS 테스터 기기가 등록되면 이벤트가 전송됩니다.
    • billing.planAutomatedUpdate: Firebase 프로젝트의 결제 요금제가 자동으로 업데이트되면 이벤트가 전송됩니다(예: 요금제가 결제 문제로 다운그레이드되는 경우).
    • billing.planUpdate: 사용자가 Firebase 프로젝트 요금제를 수정하면 이벤트가 전송됩니다(예: 결제 계정이 프로젝트에 연결되거나 분리되는 경우).
    • crashlytics.missingSymbolFile: Firebase Crashlytics에서 수신 비정상 종료 보고서를 기호화하는 데 적절한 디버그 기호가 없다고 판단하면 이벤트가 전송됩니다.
    • crashlytics.newAnrIssue: 앱에서 새로운 애플리케이션 응답 없음(ANR) 오류가 발생하면 이벤트가 전송됩니다(동일한 후속 이벤트에는 해당되지 않음).
    • crashlytics.newFatalIssue: 앱에서 새로운 치명적인 비정상 종료가 발생하면 이벤트가 전송됩니다(동일한 후속 이벤트에는 해당되지 않음).
    • crashlytics.newNonfatalIssue: 앱에 심각하지 않은 새로운 오류가 발생하면 이벤트가 전송됩니다(동일한 후속 이벤트에는 해당되지 않음).
    • crashlytics.regression: 이전 앱 버전에서 종료됨으로 표시된 문제로 인해 앱에 비정상 종료가 발생하면 이벤트가 전송됩니다.
    • crashlytics.stabilityDigest: Crashlytics에서 가장 많이 발생하는 문제에 대한 알림이 발생하면 이벤트가 전송됩니다.
    • crashlytics.velocity: 단일 문제가 상당한 수의 앱 세션에 비정상 종료를 유발하면 이벤트가 전송됩니다.
    • performance.threshold: 측정항목 성능이 설정 기준점을 초과하면 이벤트가 전송됩니다.
  11. 특정 Firebase 앱 ID의 이벤트를 선택적으로 필터링할 수 있습니다. 필터 추가를 클릭하고 appid를 지정합니다.
  12. 서비스 또는 워크플로를 호출할 서비스 계정을 선택합니다.

    또는 새 서비스 계정을 만들 수 있습니다.

    이는 트리거와 연결되어 있고 이전에 Eventarc에 필요한 특정 역할을 부여한 Identity and Access Management(IAM) 서비스 계정 이메일을 지정합니다.

  13. 이벤트 대상 목록에서 Kubernetes Engine을 선택합니다.
  14. 서비스를 선택합니다.

    트리거의 이벤트를 수신하는 서비스의 이름입니다. 서비스는 트리거와 동일한 프로젝트에 있어야 하며 이벤트가 생성될 때마다 해당 이벤트를 기준 URL 경로(/)로 전송되는 HTTP POST 요청으로 수신합니다.

  15. 필요한 경우, 들어오는 요청을 보낼 서비스 URL 경로를 지정할 수 있습니다.

    이는 트리거의 이벤트가 전송되어야 하는 대상 서비스의 상대 경로입니다. 예를 들면 /, /route, route, route/subroute입니다.

  16. 만들기를 클릭합니다.
  17. 트리거가 생성된 후에는 이벤트 소스 필터를 수정할 수 없습니다. 대신 새 트리거를 만들고 이전 트리거를 삭제합니다. 자세한 내용은 트리거 관리를 참조하세요.

gcloud

필수 및 선택적 플래그와 함께 gcloud eventarc triggers create 명령어를 실행하여 트리거를 만들 수 있습니다.

gcloud eventarc triggers create TRIGGER \
    --location=global \
    --destination-gke-cluster=DESTINATION_GKE_CLUSTER \
    --destination-gke-location=DESTINATION_GKE_LOCATION \
    --destination-gke-namespace=DESTINATION_GKE_NAMESPACE \
    --destination-gke-service=DESTINATION_GKE_SERVICE \
    --destination-gke-path=DESTINATION_GKE_PATH \
    --event-filters="type=google.firebase.firebasealerts.alerts.v1.published" \
    --event-filters="alerttype=ALERT_TYPE" \
    --event-data-content-type="EVENT_DATA_CONTENT_TYPE" \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"

다음을 바꿉니다.

  • TRIGGER: 트리거의 ID 또는 정규화된 식별자입니다.
  • DESTINATION_GKE_CLUSTER: 이벤트를 수신하는 대상 GKE 서비스가 실행 중인 GKE 클러스터의 이름입니다.
  • DESTINATION_GKE_LOCATION: (선택사항) 대상 GKE 서비스가 실행 중인 GKE 클러스터의 Compute Engine 리전입니다. 지정하지 않으면 클러스터가 리전 클러스터이며 트리거와 동일한 리전에 있다고 가정합니다.
  • DESTINATION_GKE_NAMESPACE: (선택사항) 대상 GKE 서비스가 실행 중인 네임스페이스입니다. 지정하지 않으면 default 네임스페이스가 사용됩니다.
  • DESTINATION_GKE_SERVICE: 트리거의 이벤트를 수신하는 GKE 서비스의 이름입니다. 서비스는 GKE에서 지원하는 모든 위치에 있을 수 있으며 트리거와 동일한 위치에 있지 않아도 됩니다. 그러나 서비스는 트리거와 동일한 프로젝트에 있어야 하며 이벤트가 생성될 때마다 해당 이벤트를 기준 URL 경로(/)로 전송되는 HTTP POST 요청으로 수신합니다.
  • DESTINATION_GKE_PATH: (선택사항) 트리거 이벤트가 전송될 대상 GKE 서비스에서 지정한 상대 경로입니다. 예를 들면 /, /route, route, route/subroute입니다.
  • ALERT_TYPE: Firebase 알림의 유형이며 다음 값 중 하나일 수 있습니다.
    • appDistribution.inAppFeedback: 테스터가 지정된 앱에 대해 인앱 의견을 제출하면 이벤트가 전송됩니다.
    • appDistribution.newTesterIosDevice: 지정된 앱에 새로운 iOS 테스터 기기가 등록되면 이벤트가 전송됩니다.
    • billing.planAutomatedUpdate: Firebase 프로젝트의 결제 요금제가 자동으로 업데이트되면 이벤트가 전송됩니다(예: 요금제가 결제 문제로 다운그레이드되는 경우).
    • billing.planUpdate: 사용자가 Firebase 프로젝트 요금제를 수정하면 이벤트가 전송됩니다(예: 결제 계정이 프로젝트에 연결되거나 분리되는 경우).
    • crashlytics.missingSymbolFile: Firebase Crashlytics에서 수신 비정상 종료 보고서를 기호화하는 데 적절한 디버그 기호가 없다고 판단하면 이벤트가 전송됩니다.
    • crashlytics.newAnrIssue: 앱에서 새로운 애플리케이션 응답 없음(ANR) 오류가 발생하면 이벤트가 전송됩니다(동일한 후속 이벤트에는 해당되지 않음).
    • crashlytics.newFatalIssue: 앱에서 새로운 치명적인 비정상 종료가 발생하면 이벤트가 전송됩니다(동일한 후속 이벤트에는 해당되지 않음).
    • crashlytics.newNonfatalIssue: 앱에 심각하지 않은 새로운 오류가 발생하면 이벤트가 전송됩니다(동일한 후속 이벤트에는 해당되지 않음).
    • crashlytics.regression: 이전 앱 버전에서 종료됨으로 표시된 문제로 인해 앱에 비정상 종료가 발생하면 이벤트가 전송됩니다.
    • crashlytics.stabilityDigest: Crashlytics에서 가장 많이 발생하는 문제에 대한 알림이 발생하면 이벤트가 전송됩니다.
    • crashlytics.velocity: 단일 문제가 상당한 수의 앱 세션에 비정상 종료를 유발하면 이벤트가 전송됩니다.
    • performance.threshold: 측정항목 성능이 설정 기준점을 초과하면 이벤트가 전송됩니다.
    ALERT_TYPE 연산자는 다음 중 하나여야 합니다.
    • 같음, 예: --event-filters="alerttype=appDistribution.inAppFeedback"
    • 경로 패턴입니다. 예를 들면 --event-filters-path-pattern="alerttype=appDistribution.*" 또는 --event-filters-path-pattern="alerttype=crashlytics.new*"입니다.

      자세한 내용은 경로 패턴 이해를 참조하세요.

  • EVENT_DATA_CONTENT_TYPE: (선택사항) 이벤트 페이로드의 인코딩입니다. 이 값은 application/json 또는 application/protobuf입니다. 기본 인코딩은 application/json입니다.

    JSON으로 형식이 지정된 이벤트 페이로드는 Protobuf로 형식이 지정된 이벤트 페이로드보다 큽니다. 그로 인해 이벤트 대상 및 이벤트 크기 한도에 따라 안정성에 영향을 미칠 수 있습니다. 자세한 내용은 알려진 문제를 참조하세요.

  • SERVICE_ACCOUNT_NAME: 사용자 관리형 서비스 계정의 이름입니다.
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.

참고:

  • --location 플래그는 global여야 합니다. 자세한 내용은 Eventarc 위치를 참조하세요.
  • 이 플래그들은 필수사항입니다.
    • --event-filters="type=google.firebase.firebasealerts.alerts.v1.published"
    • --event-filters="alerttype=ALERT_TYPE" 또는 --event-filters-path-pattern="alerttype=ALERT_TYPE"
  • 원하는 경우 --event-filters="appid=APP_ID" 플래그를 사용하고 정확히 일치하는 값을 지정하여 특정 Firebase 앱 ID의 이벤트를 필터링할 수 있습니다.
  • 트리거가 생성된 후에는 이벤트 필터 유형을 변경할 수 없습니다. 다른 이벤트 유형의 경우 새 트리거를 만들고 이전 트리거를 삭제해야 합니다.
  • --service-account 플래그는 트리거와 연결된 Identity and Access Management(IAM) 서비스 계정 이메일을 지정하는 데 사용됩니다.

예:

gcloud eventarc triggers create helloworld-trigger \
    --location=us-central1 \
    --destination-gke-cluster=gke-events-cluster \
    --destination-gke-location=us-central1-a \
    --destination-gke-namespace=default \
    --destination-gke-service=helloworld-events \
    --destination-gke-path=/ \
    --event-filters="type=google.firebase.firebasealerts.alerts.v1.published" \
    --event-filters="alerttype=crashlytics.velocity" \
    --service-account="${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"

이 명령어는 google.firebase.firebasealerts.alerts.v1.published로 식별된 이벤트와 crashlytics.velocity 알림 유형에 대해 helloworld-trigger라는 트리거를 만듭니다.

Terraform

Terraform을 사용하여 GKE 대상에 대한 트리거를 만들 수 있습니다. 자세한 내용은 Terraform을 사용하여 트리거 만들기를 참조하세요.

트리거 나열

Google Cloud CLI를 사용하거나 Google Cloud 콘솔을 통해 Eventarc 트리거를 나열하여 트리거 생성을 확인할 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 Eventarc 트리거 페이지로 이동합니다.

    트리거로 이동

    이 페이지에서는 모든 위치의 트리거를 나열하고 이름, 리전, 이벤트 제공자, 대상 등과 같은 세부정보를 포함합니다.

  2. 트리거를 필터링하려면 다음 안내를 따르세요.

    1. 필터 또는 트리거 필터링 필드를 클릭합니다.
    2. 속성 목록에서 트리거를 필터링하는 옵션을 선택합니다.

    단일 속성을 선택하거나 OR 논리 연산자를 사용하여 속성을 추가할 수 있습니다.

  3. 트리거를 정렬하려면 지원되는 열 제목 옆에 있는 정렬을 클릭합니다.

gcloud

다음 명령어를 실행하여 트리거를 나열합니다.

gcloud eventarc triggers list --location=-

이 명령어는 모든 위치의 트리거를 나열하고 이름, 유형, 대상, 상태와 같은 세부정보를 포함합니다.

다음 단계