このチュートリアルでは、Google Kubernetes Engine(GKE)のクラスタ通知を受信するようにサードパーティのメッセージング サービスを構成する方法について説明します。
Slack などのサービスで提供される受信 Webhook を使用すると、アプリから Slack に簡単にメッセージを投稿できます。Cloud Functions は軽量の Compute Engine ソリューションです。クラスタ通知など、Google Cloud イベントに応答する単一目的のスタンドアロン関数を作成できます。サーバーやランタイム環境を管理する必要はありません。GKE が Pub/Sub を使用してクラスタ通知を送信すると、トリガーが Slack 通知の送信などのアクションを実行して応答します。
アプリケーション間メッセージング機能を備えたサードパーティ サービスは、IFTTT をはじめとして数多く存在します。こうしたサービスを利用するために、このチュートリアルをテンプレートとして使用できます。
このチュートリアルでは、Cloud Functions と Pub/Sub を使用して、GKE クラスタ イベントに関する通知を Slack に送信します。
目標
- GKE から外部通知を受信するように Slack アプリケーションをデプロイする。
- Slack に Pub/Sub 通知を送信する Cloud Functions の関数を作成する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
gcloud
コンポーネントを更新してインストールします。gcloud components update
gcloud components install alpha beta-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
gcloud
コンポーネントを更新してインストールします。gcloud components update
gcloud components install alpha beta- GKE クラスタ通知を有効にします。
必要なロール
クラスタ通知用に Slack 通知を設定するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
Cloud Functions デベロッパー(
roles/cloudfunctions.developer
) - Kubernetes Engine 管理者(
roles/container.admin
)
Compute Engine のデフォルトのサービス アカウントに Cloud Functions の関数を呼び出すために必要な権限を付与するには、プロジェクトに対する Cloud Functions 起動元(roles/cloudfunctions.invoker
)IAM ロールを Compute Engine のデフォルトのサービス アカウントに付与するよう管理者に依頼してください。
Slack 通知
Slack 通知を設定するには、Slack アプリケーションを作成し、アプリケーションの着信 Webhook を有効にして、Slack ワークスペースにアプリケーションをインストールする必要があります。
Slack アプリケーションの作成
メールアドレスで登録するか、またはワークスペース管理者から送信された招待状を利用して、Slack ワークスペースに参加します。
ワークスペース名と Slack アカウントの認証情報を使用して、Slack にログインします。
-
- [Create an app] ダイアログで [From scratch] をクリックします。
- アプリ名を指定し、Slack ワークスペースを選択します。
- [Create App] をクリックします。
- [Add Features and Features] で、[Incoming Webhooks] をクリックします。
- [Activate Incoming Webhooks] の切り替えボタンをクリックします。
- [Webhook URLs for Your Workspace] セクションで、[Add New Webhook to Workspace] をクリックします。
- 表示された認証ページで、通知を受け取るチャネルを選択します。
- [Allow] をクリックします。
- [Webhook URLs for Your Workspace] セクションに Slack アプリケーションの Webhook が表示されます。後で使用できるように、URL を保存します。
Cloud Functions の関数の作成
GKE がクラスタ通知を Pub/Sub トピックに公開すると、イベントにより Cloud Functions がトリガーされて Slack 通知が送信されます。
gke_slack
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir ~/gke_slack && cd $_
gke_slack ディレクトリに以下のファイルを作成します。
index.js
const functions = require('@google-cloud/functions-framework'); const { IncomingWebhook } = require('@slack/webhook'); const url = process.env.SLACK_WEBHOOK; const webhook = new IncomingWebhook(url); // Optionally filter what notification types to forward to Slack. // If empty, all types will be allowed. const allowedTypeURLs = []; // Register a CloudEvent callback with the Functions Framework that will // be executed when the Pub/Sub trigger topic receives a message. functions.cloudEvent('slackNotifier', pubSubEvent => { const data = decode(pubSubEvent.data.message.data); // Send message to Slack. if (isAllowedType(pubSubEvent.data.message.attributes)) { const message = createSlackMessage(data, pubSubEvent.data.message.attributes); webhook.send(message); } }); // decode decodes a pubsub event message from base64. const decode = (data) => { return Buffer.from(data, 'base64').toString(); } // isAllowedType can be used to filter out messages that don't match the // allowed type URLs. If allowedTypeURLs is empty, it allows all types. const isAllowedType = (attributes) => { if (allowedTypeURLs.length == 0) { return true; } for (var x in allowedTypeURLs) { if (attributes['type_url'] == allowedTypeURLs[x]) { return true; } } return false; } // createSlackMessage creates a message from a data object. const createSlackMessage = (data, attributes) => { // Write the message data and attributes. text = `${data}` for (var key in attributes) { if (attributes.hasOwnProperty(key)) { text = text + `\n\t\`${key}: ${attributes[key]}\`` } } const message = { text: text, mrkdwn: true, }; return message; }
SLACK_WEBHOOK
は、Slack アプリケーション用に作成された webhook URL を指定する Cloud Functions の環境変数です。関数のデプロイ時に、環境変数を定義します。Webhook は、Cloud Functions の関数からのメッセージをリッスンし、受信します。GKE がクラスタ通知を Pub/Sub(イベント)に送信すると、この関数は Webhook URL にメッセージ(トリガー)を送信します。その後、構成済みの Slack ワークスペースにメッセージが送信されます。
createSlackMessage
関数でメッセージを拡張すると、テキストのフォーマット情報や画像など、多くの情報を含めることができます。isAllowedType
関数は、URL タイプでの通知の基本的なフィルタリングを有効にするために提供されます。allowedTypeURLs
では、許可する URL タイプを指定できます。GKE または Pub/Sub サブスクリプションですでに通知をフィルタリング済みの場合、この関数は必要ありません。package.json
{ "name": "gke-slack", "version": "0.0.1", "description": "Slack integration for GKE, using Cloud Functions", "main": "index.js", "dependencies": { "@slack/webhook": "6.1.0", "@google-cloud/functions-framework": "^3.0.0" } }
package.json
は、プログラムの以下の属性を記述します。- 名前、バージョン、説明
- 主要ランタイム ファイル
- 依存関係
必要に応じて、依存関係、要件、その他の情報を追加できます。
これで、gke_slack
ディレクトリに index.js
ファイルと package.json
ファイルが追加されました。
Cloud Functions 関数のデプロイ
Cloud Functions の関数は、Google Cloud CLI または Google Cloud コンソールでデプロイできます。
gcloud
関数をデプロイするには、gke_slack ディレクトリで次のコマンドを実行します。
gcloud functions deploy slackNotifier \
--gen2 \
--trigger-topic=TOPIC_NAME \
--runtime=nodejs14 \
--entry-point=slackNotifier \
--region=REGION \
--source=. \
--set-env-vars="SLACK_WEBHOOK=WEBHOOK_URL"
次のように置き換えます。
TOPIC_NAME
: クラスタ通知を有効にするときに作成した Pub/Sub トピックの名前。REGION
: 関数の Compute Engine のリージョン。WEBHOOK_URL
: Slack アプリケーションの作成で Slack アプリケーション用に作成した webhook URL。
出力は次のようになります。
Deploying function…
availableMemoryMb: 256
entryPoint: slackNotifier
environmentVariables:
SLACK_WEBHOOK: https://hooks.slack.com/services/…
eventTrigger:
eventType: google.pubsub.topic.publish
failurePolicy: {}
resource: projects/PROJECT_ID/topics/TOPIC_NAME
service: pubsub.googleapis.com
labels:
deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/us-central1/functions/slackNotifier
runtime: nodejs10
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/…
status: ACTIVE
timeout: 60s
updateTime: 'YYYY-MM-DDThh:mm:ssZ'
versionId: '1'
コンソール
Google Cloud コンソールの [Cloud Functions] ページに移動します。
[
関数の作成] をクリックします。[構成] ページで、次の手順を行います。
- [環境] プルダウン リストから [第 2 世代] を選択します。
- [関数名] で slackNotifier を指定します。
- [リージョン] で Compute Engine リージョンを指定します。
- [トリガー] セクションで [ Eventarc トリガーを追加] をクリックします。
- 表示されたウィンドウで、[イベント プロバイダ] プルダウン リストから [Cloud Pub/Sub] を選択します。
- クラスタ通知を有効にするときに作成した Pub/Sub トピックを選択します。
- [リージョン] に、関数と同じ Compute Engine リージョンを指定します。
- [トリガーを保存] をクリックします。
- [ランタイム、ビルド、接続、セキュリティの設定] セクションを開きます。
- [ランタイム環境変数] で、[ 変数を追加] をクリックします。
- [名前] で SLACK_WEBHOOK を指定します。
- [値] で、Slack アプリケーションの作成で作成した内部 Webhook の URL を指定します。
- [次へ] をクリックします。
[コード] ページで、次の手順を行います。
- [ランタイム] プルダウン リストから [Node.js 14] を選択します。
- [エントリ ポイント] で slackNotifier を指定します。
- ナビゲーション パネルで [index.js] を選択し、コードを Cloud Functions の関数の作成にあるサンプルコードで置き換えます。
- ナビゲーション パネルで [package.json] を選択し、コードを Cloud Functions の関数の作成にあるサンプルコードで置き換えます。
- [デプロイ] をクリックします。
Cloud Functions の関数のデプロイ完了後、GKE がクラスタ通知を送信するたびに Slack 通知が届きます。
Slack 通知の確認
Autopilot クラスタを使用した場合は、次のように通知を確認します。
- コントロール プレーンのアップグレードを開始します。
- GKE がノードを新しいバージョンに自動的にアップグレードするまで待ちます。所要時間は、構成したメンテナンスの時間枠とメンテナンスの除外によって変動する場合があります。
- GKE がノードをアップグレードしたら、Slack でメッセージを確認します。
Standard クラスタを使用した場合は、次のように通知を確認します。
特定のノードプールを新しいバージョンにアップグレードします。ノード上の GKE バージョンを変更しない場合は、ノード上で現在インストールされている同じバージョンにアップグレードできます。
GKE がノードをアップグレードしたら、Slack でメッセージを確認します。
Slack の通知は次のようになります。
Master is upgrading to version 1.20.10-gke.301.
cluster_location: us-central1
cluster_name: pubsub-cluster
payload: {"resourceType":"MASTER", "operation":"operation-1632775054313-45128f4f", "operationStartTime":"2021-09-27T20:37:34.313742491Z", "currentVersion":"1.20.9-gke.1001", "targetVersion":"1.20.10-gke.301"}
project_id: 729788050015
type_url: type.googleapis.com/google.container.v1beta1.UpgradeEvent
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
リソースを個別に削除する
このチュートリアルでデプロイした Cloud Functions の関数を削除します。
gcloud functions delete slackNotifier
Google Cloud Console から Cloud Functions の関数を削除することもできます。
次のステップ
- クラスタ通知のタイプを確認する。
- Cloud Functions と Pub/Sub のドキュメントを確認する。
- Slack アプリをビルドする方法の詳細を確認する。