Slackシンク - Knative EventingとApache Camel K統合の学習¶
あなたは書店オーナーとして、顧客が新しいレビューコメントを送信するたびに、Slackチャンネルで即時通知を受け取ることを目指しています。Knative EventingとApache Camel Kを活用することで、これらの通知を自動化するイベントドリブンサービスをセットアップでき、常に最新の情報を入手できます。
Knativeのどのような機能について学習しますか?¶
- Apache Camel Kを使用したイベントドリブン統合を通じて、SlackなどのサードパーティサービスとKnativeが連携する機能。
最終的な成果物はどのようになりますか?¶
タイプがmoderated-comment
で、ce-bad-word-filter
がbad
に設定されたCloudEventが送信されると、指定されたSlackチャンネルにメッセージが送信されます。
前提条件のインストール¶
前提条件1:Apache Camel CLIのインストール¶
ローカルマシンにApache Camel K CLI(kamel
)をインストールします。インストール手順はこちらにあります。
トラブルシューティング
インストール後にkamel version
を実行してエラーメッセージが表示される場合は、kamel
バイナリをシステムのPATHに追加する必要がある場合があります。これを行うには、kamel
バイナリをPATHにすでにあるディレクトリに移動するか、kamel
があるディレクトリをPATHに追加します。
$ export PATH=$PATH:<path-to-kamel-binary>
前提条件2:Apache Camel-Kameletsのインストール¶
次に、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の生成¶
Slackワークスペースを作成し、通知が送信される指定されたチャンネルの着信Webhook URLを生成する方法については、こちらの手順に従ってください。
検証
次のようなWebhook URLが必要です。
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
後で必要になるので、このURLを保存してください。
前提条件4:Slack認証情報を格納するシークレットの作成¶
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:パイプについて学ぶ¶
Apache Camel Kでは、イベントソースと宛先をリンクするために、「パイプ」(別名KameletBinding)と呼ばれる機能を使用します。具体的には、パイプは、ソースであるブローカーからのイベントを、宛先であるSlackシンクKameletを介してSlackチャンネルに接続します。
以下のサンプル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にルーティングできるブローカーの作成¶
Apache Camel Kを使用した現在の実装では、moderated-commentなどのCloudEventのタイプに基づいてのみフィルタリングできます。badwordfilter: good
などのイベント拡張機能に基づくフィルタリングはまだサポートされていません。この機能は、Apache Camel Kの今後のアップデートで利用可能になります。しかし、代替手段を使用してこれを実現できます!
ここでは、book-review-broker
をbadword-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にフィルタリングするトリガーの作成¶
タイプがmoderated-commentで、拡張機能badwordfilter: bad
を持つイベントを処理し、それらをbadword-brokerにルーティングするトリガーを作成します。
トリガーを作成します。
- 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-trigger
のREADY
ステータスは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構成を準備します。
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}
- 構成を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サービスのスケールゼロを無効化する¶
このステップでは、通知配信サービスがスケールダウンしてゼロになるのを防ぎ、タイムリーな通知を確保するように設定します。
注意
ksvc
はKnative Serviceの略です。
- 既存のKnativeサービスの確認
$ kubectl get ksvc
pipe
という名前のサービスが表示されるはずです。
NAME URL LATESTCREATED LATESTREADY READY REASON
pipe http://pipe.default.svc.cluster.local pipe-00002 pipe-00002 True
- Knativeサービスの編集
通知サービスがスケールダウンしてゼロになるのを防ぐには、実行し続けるポッドの最小数を設定します。
$ kubectl edit ksvc pipe
次のアノテーションを追加します。
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/min-scale: "1"
この設定により、Knativeは常にサービスのインスタンスを少なくとも1つ実行し続けることが保証されます。
検証
$ kubectl get pods
パイプデプロイメントのポッドのステータスを定期的に確認し、ポッドが消えるかどうかを確認してください。ポッドが残っていれば、問題ありません。
検証¶
これで、サンプルアプリの構築が完了しました。コメントを送信すると、デモ動画で示した結果と同じように、テスト用のSlackワークスペースで常に通知を受け取ることができます。
結論¶
このチュートリアルでは、Knative EventingとApache Camel Kを使用して、Slackチャネルへの通知を自動化するイベント駆動型サービスを設定する方法を学びました。これらのテクノロジーを活用することで、アプリケーションをサードパーティサービスにシームレスに接続し、それらの間でリアルタイムの情報交換を促進できます。
次のステップ¶
書店サンプルアプリのチュートリアルの完了おめでとうございます!Knativeへの理解を深めたい場合は、書店のフロントエンドを開いてみてください。私たちが使用したデモ本は、素晴らしい出発点です!Evan Anderson著「Building Serverless Applications on Knative」という本をチェックしてみてください。
既存の書店アプリをベースにした追加のチャレンジをいくつか用意しました。一部のソリューションは提供されており、残りは皆さんの独自のソリューションを模索することを奨励するためにオープンになっています。