Google Cloud イベントの通知の送信


このチュートリアルは、Google ChatSlack、または Microsoft Teams などのコラボレーション プラットフォームにプッシュされた重要な Google Cloud イベントの通知を受け取りたい DevOps チームを対象としています。通知を使用すると、チームは Google Cloud コンソールに定期的にログインしてイベントの更新を確認する必要がなくなります。

このチュートリアルの例では、ディスク スナップショットを作成した後に通知が生成されます。ディスク スナップショットを作成すると、ゾーン永続ディスクまたはリージョン永続ディスクからデータがバックアップされます。このチュートリアルを修正すれば、仮想マシン(VM)インスタンスの作成や削除など、他の重要な Google Cloud イベントが発生したときにコラボレーション システムに自動的に通知が push されるように設定できます。

このチュートリアルのコードは GitHub リポジトリで入手できます。

このチュートリアルは、DevOps とクラウド テクノロジーを専門とするエンジニアを対象としています。ここでは Cloud Logging、Pub/Sub、Cloud Functions に精通していることを前提としています。

State of DevOps で、ソフトウェア デリバリーのパフォーマンスを向上させると認められた機能が報告されています。このチュートリアルでは、次の機能について説明します。

アーキテクチャ

次の図は、このチュートリアルで使用するさまざまなコンポーネントを示しています。

ディスク スナップショットの作成後に通知を push するシステムのアーキテクチャ。

まず、永続ディスクを作成し、ディスク スナップショットを作成します。次に、成功したディスク スナップショットに対応するログイベントをフィルタリングし、Pub/Sub トピックに公開してイベントをエクスポートします。Cloud Functions の関数がトピックからメッセージを読み取り、Webhook にプッシュ通知を送信します。このチュートリアルでは、この Webhook は Cloud Functions の関数で表されます。

目標

  • 選択したイベントを Pub/Sub にエクスポートするように Cloud Logging を設定し、Cloud Functions がそれらを利用できるようにします。
  • Cloud Logging によってエクスポートされたイベントを利用した Cloud Functions の関数をデプロイし、Webhook をトリガーします。

費用

このドキュメントでは、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 Functions の関数

Pub/Sub トピックの作成

  • Cloud Shell で、イベント メッセージを公開するための Pub/Sub トピックを作成します。

    gcloud pubsub topics create $PUBSUB_TOPIC
    

Pub/Sub への Cloud Logging シンクの作成

Cloud Logging では、Google Cloud から取得したイベントを保存、検索、分析できます。これらのログをフィルタリングして Cloud StorageBigQueryPub/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 は、前のセクションでコピーしたメールアドレスに置き換えます。

Webhook を作成する

通常、本番環境では、コラボレーション プラットフォームに送信されるプッシュ通知によって重要な Google Cloud イベントが通知されます。これらのプラットフォームのほとんどは Webhook を提供しています。このチュートリアルでは、いずれかのプラットフォームから Webhook をシミュレートする Cloud Functions の関数を作成します。HTTP 経由でトリガーされるこの Cloud Functions の関数は、受信したメッセージの内容を出力します。

デフォルトでは、任意のユーザーまたはサービスが Cloud Functions の HTTP 関数を呼び出すことができます。HTTP 関数に Identity and Access Management(IAM)を構成すると、リクエストに認証情報を与えない限り HTTP 関数を呼び出せないように、この動作を制限できます。

  1. Cloud Shell で、チュートリアル コードを含む Git リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/gcf-notification-forwarding
    
  2. 作業ディレクトリに切り替えます。

    cd gcf-notification-forwarding/
    
  3. HTTP トリガーを使用して Cloud Functions の関数 webhookEmulator Webhook をデプロイします。

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

    このコマンドは完了するまでに最大 2 分かかります。

Cloud Functions の関数を作成してプッシュ通知を設定する

push モードで作成した Pub/Sub トピックにサブスクライブする Cloud Functions の関数を作成します。Cloud Logging がイベントを Pub / Sub トピックにエクスポート(またはプッシュ)するたびに、この Cloud Functions の関数がトリガーされます。関数はイベントを受信して処理し、前に作成した Webhook の HTTP エンドポイントにプッシュします。

  • Cloud Shell で、Cloud Functions の関数をデプロイします。

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

セットアップのテスト

この設定をテストするには、ディスク スナップショットを作成し、ディスクス ナップショットが生成したイベントログを Webhook が受信するかどうかを確認します。

  1. Cloud Shell で、ゾーン永続ディスクを作成します。デフォルトは 500 GB の標準ハードディスク ドライブです。

    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 Functions の関数がそれを選択し、フォーマットして、Webhook の HTTP エンドポイントにプッシュします。

  3. 数分後、Webhook がイベントログを受信したかどうかを確認します。

    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'
         }
      ]
    }
    

    出力には、Webhook がディスク スナップショットが作成されたという通知を受信したことが示されています。

クリーンアップ

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ