Argo CD アプリケーションイベント (同期の失敗、ヘルス状態の劣化、デプロイメントの成功など) の DingTalk Webhook 通知を設定することで、チームは Argo CD UI をポーリングすることなく自動的にアラートを受け取ることができます。
Argo CD Notifications の仕組み
Argo CD Notifications は、アラートをルーティングするために4つの概念を使用します。
| 概念 | 役割 |
|---|---|
| トリガー | 通知を送信する「タイミング」(条件) を定義します。 |
| テンプレート | 送信する「内容」(メッセージ本文) を定義します。 |
| 通知サービス | 送信先 (メール、Slack、GitHub、Webhook など) を定義します。 |
| サブスクリプション | どのアプリケーションまたはトリガーを「誰」が受信するかを定義します。 |
サブスクリプションは、アプリケーションを1つ以上のトリガーにリンクします。各トリガーはテンプレートを選択します。テンプレートは、構成された通知サービス用のペイロードをレンダリングします。
DingTalk は Webhook ベースの通知サービスとして統合されています。これら4つの概念すべてを、argocd 名前空間の argocd-notifications-cm ConfigMap で構成します。
前提条件
開始する前に、以下を確認してください。
-
フリート管理が有効です。詳細については、「フリート管理」をご参照ください。
-
ACK One コンソールから Fleet インスタンスの kubeconfig ファイルを取得し、kubectl で Fleet インスタンスに接続していること。 詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ステップ 1: DingTalk チャットボットの作成
DingTalk チャットボットを作成すると、専用の Webhook URL が生成されます。この Webhook は、Argo Workflows などの他のサービスと関連付けて通知を受信できます。Argo CD Notifications は、この Webhook を使用してご利用のグループにメッセージを投稿します。
-
DingTalk を開き、通知を受信したいグループに移動します。
-
カスタムチャットボットを追加します。
-
グループの右上隅にある
アイコンをクリックして、パネルで [ボット] をクリックします。 -
「ロボット管理」パネルで、「ロボットの追加」をクリックし、次に「カスタム」カードをクリックして、「追加」をクリックします。
-
[チャットボット名] を入力し、[セキュリティ設定] を構成して、[完了] をクリックします。少なくとも 1 つのセキュリティ設定を選択する必要があります。次のセキュリティ設定のいずれかを少なくとも 1 つ選択することを推奨します: 追加署名 および [IP アドレス]。> 重要: チャットボットがワークフロークラスターからメッセージを受信できるようにするには、クラスターの VPC にインターネットアクセスが必要です。クラスター用にインターネット NAT ゲートウェイを構成し、ゲートウェイの EIP を [IP アドレス] セキュリティ設定に入力します。
-
-
チャットボットの作成後に表示される Webhook URL をコピーして保存します。
ステップ 2: アプリケーション通知の構成
argocd-notifications-cm ConfigMap を編集して、DingTalk Webhook を登録し、メッセージテンプレートを定義し、トリガーを構成し、サブスクリプションを設定します。
kubectl edit cm argocd-notifications-cm -n argocd
構成には4つの部分があります。
-
通知サービスの登録 — Argo CD をご利用の DingTalk Webhook に向けます。
-
テンプレートの定義 — 各通知タイプの Markdown メッセージ本文を指定します。
-
トリガーの構成 — 各テンプレートを起動する条件を設定します。
-
サブスクリプションの追加 — アプリケーションをトリガーにサブスクライブします。
ConfigMap を適用する前に、次のプレースホルダーを置き換えます。
| プレースホルダー | 値 | 取得方法 |
|---|---|---|
service.webhook.dingtalk 内の url |
ご利用の DingTalk チャットボット Webhook URL | ステップ 1 でコピー済み |
context 内の argocdUrl |
Argo CD Server のロードバランサー IP | 実行: kubectl get svc -nargocd argocd-server -ojsonpath='{.status.loadBalancer.ingress[0].ip}' |
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
namespace: argocd
data:
# 1. DingTalk Webhook を通知サービスとして登録
service.webhook.dingtalk: |
url: https://oapi.dingtalk.com/robot/send?access_token=535a56d**********
headers:
- name: Content-Type
value: application/json
# Argo CD Server URL — 通知メッセージでディープリンクを構築するために使用されます
context: |
argocdUrl: <argocd server lb ip>
# 2. テンプレート — 各通知タイプの DingTalk Markdown メッセージを定義
template.app-sync-change: |
webhook:
dingtalk:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"title":"Argo CD アプリケーションステータス",
"text": "### Argo CD アプリケーションステータス\n> - アプリケーション名: {{.app.metadata.name}}\n> - ステータス: {{ .app.status.operationState.phase}}\n> - 時間:{{.app.status.operationState.finishedAt}}\n> - アプリケーション URL: [クリックしてアクセス]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true) \n"
}
}
template.app-sync-status-unknown: |
webhook:
dingtalk:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"title":"不明な Argo CD アプリケーション",
"text": "### 不明な Argo CD アプリケーション\n> - <font color=\"warning\">アプリケーション名</font>: {{.app.metadata.name}}\n> - <font color=\"warning\">アプリケーションステータス</font>: {{.app.status.sync.status}}\n> - <font color=\"warning\">アプリケーションヘルスステータス</font>: {{.app.status.health.status}}\n> - <font color=\"warning\">時間</font>: {{.app.status.operationState.startedAt}}\n> - <font color=\"warning\">アプリケーション URL</font>: [クリックして Argo CD UI にアクセス]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
}
}
template.app-sync-failed: |
webhook:
dingtalk:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"title":"Argo CD アプリケーションリリース失敗",
"text": "### Argo CD アプリケーションリリース失敗\n> - <font color=\"danger\">アプリケーション名</font>: {{.app.metadata.name}}\n> - <font color=\"danger\">アプリケーションステータス</font>: {{.app.status.operationState.phase}}\n> - <font color=\"danger\">アプリケーションヘルスステータス</font>: {{.app.status.health.status}}\n> - <font color=\"danger\">時間</font>: {{.app.status.operationState.startedAt}}\n> - <font color=\"danger\">アプリケーション URL</font>: [クリックして Argo CD UI にアクセス]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
}
}
# 3. トリガー — 各テンプレートを起動する条件を定義
trigger.on-deployed: |
- description: アプリケーションは同期され、正常です。コミットごとに1回トリガーされます。
oncePer: app.status.sync.revision
send: [app-sync-change]
# トリガー条件
when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
trigger.on-health-degraded: |
- description: アプリケーションが劣化しました
send: [app-sync-change]
when: app.status.health.status == 'Degraded'
trigger.on-sync-failed: |
- description: アプリケーションの同期に失敗しました
send: [app-sync-failed]
when: app.status.operationState != nil and app.status.operationState.phase in ['Error',
'Failed']
trigger.on-sync-status-unknown: |
- description: アプリケーションステータスが「不明」です
send: [app-sync-status-unknown]
when: app.status.sync.status == 'Unknown'
trigger.on-sync-running: |
- description: アプリケーションが同期中です
send: [app-sync-change]
when: app.status.operationState != nil and app.status.operationState.phase in ['Running']
trigger.on-sync-succeeded: |
- description: アプリケーションの同期に成功しました
send: [app-sync-change]
when: app.status.operationState != nil and app.status.operationState.phase in ['Succeeded']
# 4. サブスクリプション — アプリケーションをトリガーにサブスクライブ
subscriptions: |
- recipients: [dingtalk]
triggers: [on-sync-failed, on-sync-succeeded, on-sync-status-unknown,on-deployed]
トリガーの概要
| トリガー | 条件 | 使用されるテンプレート |
|---|---|---|
on-deployed |
同期に成功し、ヘルス状態は正常です (コミットごとに1回) | app-sync-change |
on-health-degraded |
ヘルス状態は劣化しています | app-sync-change |
on-sync-failed |
同期フェーズはエラーまたは失敗です | app-sync-failed |
on-sync-status-unknown |
同期ステータスは不明です | app-sync-status-unknown |
on-sync-running |
同期フェーズは実行中です | app-sync-change |
on-sync-succeeded |
同期フェーズは成功しました | app-sync-change |
通知のカスタマイズ (オプション)
-
トリガーごとのテンプレート: 特定のトリガーに異なるメッセージ形式を使用するには、新しいテンプレートオブジェクトを定義し、そのトリガーの
sendリストでそれを参照します。 -
メッセージの色: メッセージの一部を着色するには、
textフィールド内で<font color=>xxxx</font>を使用します。上記の例では、warning(黄色) とdanger(赤) を使用しています。