Google Cloud 이벤트 알림 전송


이 튜토리얼은 중요한 Google Cloud 이벤트에 대해 알림을 Google Chat, Slack, Microsoft Teams와 같은 공동작업 플랫폼에 푸시하려는 DevOps 팀을 대상으로 합니다. 알림을 사용하면 팀이 이벤트 업데이트 확인을 위해 Google Cloud Console에 정기적으로 로그인할 필요가 없습니다.

이 튜토리얼에서는 디스크 스냅샷을 만들 때 알림이 생성되는 예시를 보여줍니다. 디스크 스냅샷을 만들면 영역별 영구 디스크 또는 리전별 영구 디스크에서 데이터가 백업됩니다. 가상 머신(VM) 인스턴스가 생성되거나 삭제될 때와 같이 다른 중요한 Google Cloud 이벤트가 발생할 때 공동작업 시스템에 알림을 자동으로 푸시하도록 이 튜토리얼을 수정할 수 있습니다.

이 튜토리얼의 코드는 GitHub 저장소에서 제공됩니다.

이 튜토리얼은 DevOps 및 클라우드 기술을 전문으로 하는 엔지니어를 대상으로 합니다. 여기에서는 사용자가 Cloud Logging, Pub/Sub, Cloud Functions에 익숙하다고 가정합니다.

State of DevOps 보고서에는 소프트웨어 배포 성능을 향상시키는 기능이 나와 있습니다. 이 튜토리얼에서는 다음 기능을 설명합니다.

아키텍처

다음 다이어그램은 이 튜토리얼에서 사용되는 여러 구성요소를 보여줍니다.

디스크 스냅샷이 생성된 다음 알림을 푸시하는 시스템 아키텍처

먼저 영구 디스크를 만들고 디스크 스냅샷을 생성합니다. 그런 다음 성공적인 디스크 스냅샷에 해당하는 로그 이벤트를 필터링하고 이를 Pub/Sub 주제에 게시하여 이벤트를 내보냅니다. Cloud 함수는 주제에서 메시지를 읽고 웹훅에 푸시 알림을 보냅니다. 이 튜토리얼에서는 이 웹훅이 Cloud 함수로 표시됩니다.

목표

  • Cloud Functions가 소비할 수 있도록 선택한 이벤트를 Pub/Sub로 내보내도록 Cloud Logging을 설정합니다.
  • Cloud Logging으로 내보낸 이벤트를 소비한 후 웹훅을 트리거하는 Cloud 함수를 배포합니다.

비용

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

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

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

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

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

    Cloud Shell 활성화

    Cloud Shell을 사용하여 이 튜토리얼의 모든 명령어를 실행합니다.

  4. Compute Engine, Cloud Logging, Cloud Functions, Pub/Sub API를 사용 설정합니다.

    gcloud services enable \
        compute.googleapis.com \
        logging.googleapis.com \
        cloudfunctions.googleapis.com \
        pubsub.googleapis.com
    

환경 준비

  1. Cloud Shell에서 이 튜토리얼에 사용하려는 Compute Engine 리전 및 영역에 대해 gcloud를 기본값으로 설정합니다.

    gcloud config set compute/region us-central1
    gcloud config set compute/zone us-central1-a
    

    이 튜토리얼에서는 us-central1 리전 및 us-central1-a 영역을 사용합니다. 사용자 니즈에 맞게 리전 및 영역을 변경할 수 있습니다. 자세한 내용은 위치 및 리전을 참조하세요.

  2. 이 튜토리얼에 사용하는 환경 변수를 정의합니다.

    PROJECT=$(gcloud config get-value project)
    PUBSUB_TOPIC="gce-snapshots-events"
    DISK="my-disk-1"
    WEBHOOK_NAME="webhookEmulator"
    WEBHOOK_URL="https://$(gcloud config get-value compute/region)-$PROJECT.cloudfunctions.net/$WEBHOOK_NAME"
    

리소스 만들기

이 섹션에서는 이 튜토리얼에 대해 다음과 같은 Google Cloud 리소스를 만듭니다.

  • Pub/Sub 주제
  • Cloud Logging 싱크
  • Cloud 함수

Pub/Sub 주제 만들기

  • Cloud Shell에서 이벤트 메시지를 게시할 Pub/Sub 주제를 만듭니다.

    gcloud pubsub topics create $PUBSUB_TOPIC
    

Pub/Sub에 대한 Cloud Logging 싱크 만들기

Cloud Logging을 사용하면 Google Cloud로부터 이벤트를 저장, 검색, 분석할 수 있습니다. 이러한 로그를 필터링하고 Cloud Storage, BigQuery, Pub/Sub로 내보낼 수 있습니다.

  1. Cloud Shell에서 디스크 스냅샷으로 생성된 로그를 Pub/Sub에 내보냅니다.

    gcloud logging sinks create gce-events-sink \
        pubsub.googleapis.com/projects/$PROJECT/topics/$PUBSUB_TOPIC \
        --log-filter='resource.type="gce_disk"
    jsonPayload.event_type="GCE_OPERATION_DONE"
    jsonPayload.event_subtype="compute.disks.createSnapshot"'
    

    출력에는 앞에서 만든 Pub/Sub 주제에 로그를 게시할 때 Cloud Logging에 사용되는 서비스 계정의 이메일 주소가 포함됩니다. 이 이메일 주소에는 SERVICE_ACCOUNT_NAME@gcp-sa-logging.iam.gserviceaccount.com 형식이 사용됩니다.

  2. 서비스 계정의 이메일 주소를 복사합니다. 이 주소는 다음 섹션에서 필요합니다.

권한 설정

  • Cloud Shell에서 Pub/Sub 주제에 메시지를 게시할 수 있도록 서비스 계정에 Pub/Sub 게시자 IAM 역할(roles/pubsub.publisher)을 부여합니다.

    gcloud beta pubsub topics add-iam-policy-binding $PUBSUB_TOPIC \
        --member='serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS' \
        --role='roles/pubsub.publisher'
    

    SERVICE_ACCOUNT_EMAIL_ADDRESS를 이전 섹션에서 복사한 이메일 주소로 바꿉니다.

웹훅 만들기

일반적으로 프로덕션 환경에서는 공동작업 플랫폼으로 전송된 푸시 알림에 따라 중요한 Google Cloud 이벤트 알림이 제공됩니다. 이러한 플랫폼은 대부분 웹훅을 제공합니다. 이 튜토리얼에서는 이러한 플랫폼 중 하나에서 웹훅을 시뮬레이션하도록 Cloud 함수를 만듭니다. HTTP로 트리거되는 이 Cloud 함수는 수신된 메시지의 콘텐츠를 출력합니다.

기본적으로 모든 사용자 또는 서비스가 HTTP Cloud 함수를 호출할 수 있습니다. 요청에서 인증에 따른 사용자 인증 정보를 제공해서만 HTTP 함수를 호출할 수 있도록 HTTP 함수에서 이 동작을 제한하도록 ID 및 액세스 관리(IAM)를 구성할 수 있습니다.

  1. Cloud Shell에서 튜토리얼 코드가 포함된 Git 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/gcf-notification-forwarding
    
  2. 작업 디렉터리로 전환합니다.

    cd gcf-notification-forwarding/
    
  3. HTTP 트리거를 사용하여 Cloud 함수 webhookEmulator 웹훅을 배포합니다.

    gcloud functions deploy $WEBHOOK_NAME \
        --runtime=nodejs8 \
        --trigger-http \
        --allow-unauthenticated \
        --source=webhook/
    

    이 명령어는 완료하는 데 최대 2분 정도 걸릴 수 있습니다.

알림 푸시를 위한 Cloud 함수 만들기

이전에 푸시 모드로 만든 Pub/Sub 주제를 구독하는 Cloud 함수를 만듭니다. 그런 다음 Cloud Logging이 이벤트를 Pub/Sub 주제로 내보낼(푸시할) 때마다 이 Cloud 함수가 트리거됩니다. 이 함수는 이벤트를 수신 및 처리하고 이전에 만든 웹훅의 HTTP 엔드포인트로 푸시합니다.

  • Cloud Shell에서 Cloud 함수를 배포합니다.

    gcloud functions deploy pushEventsToWebhook \
        --runtime=nodejs8 \
        --trigger-topic=$PUBSUB_TOPIC \
        --set-env-vars=WEBHOOK_URL=$WEBHOOK_URL \
        --allow-unauthenticated \
        --source=push_notification/
    

설정 테스트

이 설정을 테스트하려면 디스크 스냅샷을 생성하고 디스크 스냅샷으로 생성되는 이벤트 로그가 웹훅에 수신되는지 여부를 확인합니다.

  1. Cloud Shell에서 영역별 영구 디스크를 만듭니다. 기본값은 표준 하드 디스크 드라이브 500GB입니다.

    gcloud compute disks create $DISK \
        --zone=$(gcloud config get-value compute/zone)
    
  2. 앞에서 만든 디스크의 스냅샷 만들기를 트리거합니다.

    gcloud compute disks snapshot $DISK \
        --zone=$(gcloud config get-value compute/zone) \
        --storage-location=$(gcloud config get-value compute/region)
    

    이 명령어는 완료하는 데 최대 2분 정도 걸릴 수 있습니다. 스냅샷이 생성된 다음 관리자 활동 로그 항목이 생성됩니다. 이벤트 로그가 필터링되고 Pub/Sub 주제로 푸시됩니다. 구독된 Cloud 함수가 이를 선택하여 형식을 지정하고 웹훅의 HTTP 엔드포인트로 푸시합니다.

  3. 몇 분 후 웹훅에 이벤트 로그가 수신되었는지 여부를 확인합니다.

    gcloud beta functions logs read $WEBHOOK_NAME \
        --region=$(gcloud config get-value compute/region) \
        --limit=10
    

    출력은 다음과 비슷합니다.

    {
      data:[
         {
            "type":'disk',
            "url":'https://console.cloud.google.com/compute/disksDetail/zones/us-central1-a/disks/my-disk-1?project=$PROJECT&supportedpurview=project',
            "name":'my-disk-1'
         },
         {
            "type":'project',
            "project_id":'$PROJECT',
            "project_url":'https://console.cloud.google.com/?project=$PROJECT'
         },
         {
            "zone":'us-central1-a'
         },
         {
            "date_time":'2020-04-15T09:07:21.205-06:00'
         }
      ]
    }
    

    출력에는 웹훅에 디스크 스냅샷이 생성되었다는 알림이 수신된 것으로 표시됩니다.

정리

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

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계