コンテンツへスキップ

Slackシンク - Knative EventingとApache Camel K統合の学習

image

あなたは書店オーナーとして、顧客が新しいレビューコメントを送信するたびに、Slackチャンネルで即時通知を受け取ることを目指しています。Knative EventingとApache Camel Kを活用することで、これらの通知を自動化するイベントドリブンサービスをセットアップでき、常に最新の情報を入手できます。

Knativeのどのような機能について学習しますか?

  • Apache Camel Kを使用したイベントドリブン統合を通じて、SlackなどのサードパーティサービスとKnativeが連携する機能。

最終的な成果物はどのようになりますか?

タイプがmoderated-commentで、ce-bad-word-filterbadに設定されたCloudEventが送信されると、指定されたSlackチャンネルにメッセージが送信されます。

前提条件のインストール

前提条件1:Apache Camel CLIのインストール

image

ローカルマシンにApache Camel K CLI(kamel)をインストールします。インストール手順はこちらにあります。

トラブルシューティング

インストール後にkamel versionを実行してエラーメッセージが表示される場合は、kamelバイナリをシステムのPATHに追加する必要がある場合があります。これを行うには、kamelバイナリをPATHにすでにあるディレクトリに移動するか、kamelがあるディレクトリをPATHに追加します。

$ export PATH=$PATH:<path-to-kamel-binary>

前提条件2:Apache Camel-Kameletsのインストール

image

次に、Apache Camel K CLIを使用して、クラスタにApache Camel Kをインストールします。

$ kamel install --registry docker.io --organization <your-organization> --registry-auth-username <your-username> --registry-auth-password <your-password>

プレースホルダーを実際のDockerレジストリ情報に置き換えてください。

他のコンテナレジストリを使用している場合は、インストールについてこちらで詳細を読む必要がある場合があります。

検証

インストールが成功すると、このメッセージが表示されます。

📦 OLM is not available in the cluster. Fallback to regular installation.
🐪 Camel K installed in namespace default

前提条件3:Slackアプリの作成と着信Webhook URLの生成

image

Slackワークスペースを作成し、通知が送信される指定されたチャンネルの着信Webhook URLを生成する方法については、こちらの手順に従ってください。

検証

次のようなWebhook URLが必要です。

https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

後で必要になるので、このURLを保存してください。

前提条件4:Slack認証情報を格納するシークレットの作成

image

Webhook URLをシークレットとして保存します。Webhook URLをコピーしてslack-sink/application.propertiesファイルに貼り付けます。

/slack-sink/application.properties
slack.channel=#bookstore-owner
slack.webhook.url=https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

次に、次のコマンドを実行して、/slack-sinkディレクトリにシークレットを作成します。

kubectl create secret generic slack-credentials --from-file=application.properties
検証

シークレットが正常に作成された場合、このメッセージが表示されます。

secret/slack-credentials created

実装

ステップ0:パイプについて学ぶ

image

Apache Camel Kでは、イベントソースと宛先をリンクするために、「パイプ」(別名KameletBinding)と呼ばれる機能を使用します。具体的には、パイプは、ソースであるブローカーからのイベントを、宛先であるSlackシンクKameletを介してSlackチャンネルに接続します。

image

以下のサンプルYAMLから、パイプにタイプ「moderated-comment」を持つイベントをフィルタリングするように指示していることがわかります。パイプは内部でトリガーを作成し、イベントをslack-sinkにルーティングします。

apiVersion: camel.apache.org/v1
kind: Pipe
metadata:
  name: pipe
spec:
  source:
    ref:
      kind: Broker
      apiVersion: eventing.knative.dev/v1
      name: badword-broker
    properties:
      type: moderated-comment
  sink:
    ...

詳細については、Matthias WeßendorfによるApache Camel KとKnative Eventingを使用したイベントソーシングの記事をご覧ください!

ステップ1:「不適切な単語」コメントをSlackにルーティングできるブローカーの作成

image

Apache Camel Kを使用した現在の実装では、moderated-commentなどのCloudEventのタイプに基づいてのみフィルタリングできますbadwordfilter: goodなどのイベント拡張機能に基づくフィルタリングはまだサポートされていません。この機能は、Apache Camel Kの今後のアップデートで利用可能になります。しかし、代替手段を使用してこれを実現できます!

image

ここでは、book-review-brokerbadword-brokerという新しいブローカーに接続します。そして、拡張機能badwordfilter: goodでフィルタリングを実行するのに役立つトリガーを作成します。

  • 1:次のコンテンツをnode-server/config/200-broker.yamlに追加します。
node-server/config/200-broker.yaml
---
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
  name: badword-broker
  • 2:YAMLファイルを適用します。

    kubectl apply -f 200-broker.yaml
    

ブローカーが正常に作成された場合、このメッセージが表示されます。

broker.eventing.knative.dev/badword-broker created

または、Knative CLI knを使用してブローカーを作成します。

kn broker create badword-broker

ブローカーが正常に作成された場合、このメッセージが表示されます。

Broker 'badword-broker' successfully created in namespace 'default'.
検証

次のコマンドを実行して、ブローカーを一覧表示します。

kubectl get brokers

badword-brokerが表示されます。

NAME               URL                                                                                 AGE     READY   REASON
badword-broker     http://broker-ingress.knative-eventing.svc.cluster.local/default/badword-broker     3s      True    
bookstore-broker   http://broker-ingress.knative-eventing.svc.cluster.local/default/bookstore-broker   5h38m   True   

トラブルシューティング

問題がある場合は、次のコマンドを使用して診断します。

kubectl describe broker badword-broker

ステップ2:不適切な単語コメントをbadword-brokerにフィルタリングするトリガーの作成

image

タイプがmoderated-commentで、拡張機能badwordfilter: badを持つイベントを処理し、それらをbadword-brokerにルーティングするトリガーを作成します。

トリガーを作成します。

image

  • 1:node-server/config/badword-noti-trigger.yamlという名前の新しいYAMLファイルを作成し、次のコンテンツを追加します。
node-server/config/badword-noti-trigger.yaml
---
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
  name: badword-noti-trigger
spec:
  broker: bookstore-broker
  filter:
    attributes: # Trigger will filter events based on BOTH the type and badwordfilter attribute
      type: moderated-comment # This is the filter that will be applied to the event, only events with the ce-type moderated-comment will be processed
      badwordfilter: bad # This is the filter that will be applied to the event, only events with the ce-extension badwordfilter: bad will be processed
  subscriber:
    ref:
      apiVersion: eventing.knative.dev/v1
      kind: Broker
      name: badword-broker
  • 2:YAMLファイルを適用します。

    kubectl apply -f node-server/config/badword-noti-trigger.yaml
    

    トリガーが正常に作成された場合、このメッセージが表示されます。

    trigger.eventing.knative.dev/badword-noti-trigger created
    
検証
kubectl get triggers

トリガーbadword-noti-triggerREADYステータスはTrueである必要があります。

NAME                BROKER             SUBSCRIBER_URI                                                       AGE     READY   REASON
db-insert-trigger   bookstore-broker   http://node-server-svc.default.svc.cluster.local/insert              5h41m   True    
seq-reply-trigger   bookstore-broker   http://event-display.default.svc.cluster.local                       5h39m   True    
sequence-trigger    bookstore-broker   http://sequence-kn-sequence-0-kn-channel.default.svc.cluster.local   5h39m   True    
log-trigger         bookstore-broker   http://event-display.default.svc.cluster.local                       5h41m   True   
badword-noti-triggerbookstore-broker   http://broker-ingress.knative-eventing.svc.cluster.local/default/badword-broker                       5h41m   True   

ステップ3:パイプの構築

この設定では、「不適切な単語」を含む新しいコメントが発生するたびに、Slackに自動的に通知が送信され、情報の流れが効率化されます。

  • 1:Slack webhook Urlを含むk8sシークレットの準備が整っていることを確認します。そうでない場合は、前提条件3セクションを参照してください。

  • 2:Slackチャンネルにイベントを転送するSlackシンクのYAML構成を準備します。

image

slack-sink/config/slack-sink.yamlという名前の新しいファイルを作成し、次のコンテンツを追加します。

slack-sink/config/slack-sink.yaml
apiVersion: camel.apache.org/v1
kind: Pipe
metadata:
  name: pipe
  annotations:
    trait.camel.apache.org/mount.configs: "secret:slack-credentials"
spec:
  source:
    ref:
      kind: Broker
      apiVersion: eventing.knative.dev/v1
      name: bad-word-broker
    properties:
      type: moderated-comment
  sink:
    ref:
      kind: Kamelet
      apiVersion: camel.apache.org/v1
      name: slack-sink
    properties:
      channel: ${slack.channel}
      webhookUrl: ${slack.webhook.url}
  1. 構成をKubernetesクラスタに適用します。
$ kubectl apply -f slack-sink/slack-sink.yaml
検証

構成が正常に作成された場合、このメッセージが表示されます。

pipe.camel.apache.org/slack-sink-pipe created

ただし、このプロセスには完了まで数秒かかります。パイプのステータスは、以下のコマンドを実行して確認できます。

$ kubectl get pipe slack-sink-pipe
NAME              PHASE     REPLICAS
slack-sink-pipe   Ready     1

ステップ4:Knativeサービスのスケールゼロを無効化する

image

このステップでは、通知配信サービスがスケールダウンしてゼロになるのを防ぎ、タイムリーな通知を確保するように設定します。

注意

ksvcKnative Serviceの略です。

  1. 既存のKnativeサービスの確認
$ kubectl get ksvc

pipeという名前のサービスが表示されるはずです。

NAME     URL                                         LATESTCREATED   LATESTREADY    READY   REASON
pipe     http://pipe.default.svc.cluster.local       pipe-00002      pipe-00002     True
  1. Knativeサービスの編集

通知サービスがスケールダウンしてゼロになるのを防ぐには、実行し続けるポッドの最小数を設定します。

$ kubectl edit ksvc pipe

次のアノテーションを追加します。

spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/min-scale: "1"

この設定により、Knativeは常にサービスのインスタンスを少なくとも1つ実行し続けることが保証されます。

検証
$ kubectl get pods

パイプデプロイメントのポッドのステータスを定期的に確認し、ポッドが消えるかどうかを確認してください。ポッドが残っていれば、問題ありません。

検証

image

これで、サンプルアプリの構築が完了しました。コメントを送信すると、デモ動画で示した結果と同じように、テスト用のSlackワークスペースで常に通知を受け取ることができます。

結論

このチュートリアルでは、Knative EventingとApache Camel Kを使用して、Slackチャネルへの通知を自動化するイベント駆動型サービスを設定する方法を学びました。これらのテクノロジーを活用することで、アプリケーションをサードパーティサービスにシームレスに接続し、それらの間でリアルタイムの情報交換を促進できます。

次のステップ

image

書店サンプルアプリのチュートリアルの完了おめでとうございます!Knativeへの理解を深めたい場合は、書店のフロントエンドを開いてみてください。私たちが使用したデモ本は、素晴らしい出発点です!Evan Anderson著「Building Serverless Applications on Knative」という本をチェックしてみてください。

image

既存の書店アプリをベースにした追加のチャレンジをいくつか用意しました。一部のソリューションは提供されており、残りは皆さんの独自のソリューションを模索することを奨励するためにオープンになっています。

追加のチャレンジへ

当社は、サイトトラフィックを把握するために分析とCookieを使用しています。当サイトの使用に関する情報は、その目的のためにGoogleと共有されます。詳細はこちら