すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:DingTalk チャットボットを使用した GitOps アプリケーション変更の通知

最終更新日:Mar 27, 2026

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 で構成します。

前提条件

開始する前に、以下を確認してください。

ステップ 1: DingTalk チャットボットの作成

DingTalk チャットボットを作成すると、専用の Webhook URL が生成されます。この Webhook は、Argo Workflows などの他のサービスと関連付けて通知を受信できます。Argo CD Notifications は、この Webhook を使用してご利用のグループにメッセージを投稿します。

  1. DingTalk を開き、通知を受信したいグループに移動します。

  2. カスタムチャットボットを追加します。

    1. グループの右上隅にある image アイコンをクリックして、パネルで [ボット] をクリックします。

    2. ロボット管理」パネルで、「ロボットの追加」をクリックし、次に「カスタム」カードをクリックして、「追加」をクリックします。

    3. [チャットボット名] を入力し、[セキュリティ設定] を構成して、[完了] をクリックします。少なくとも 1 つのセキュリティ設定を選択する必要があります。次のセキュリティ設定のいずれかを少なくとも 1 つ選択することを推奨します: 追加署名 および [IP アドレス]。> 重要: チャットボットがワークフロークラスターからメッセージを受信できるようにするには、クラスターの VPC にインターネットアクセスが必要です。クラスター用にインターネット NAT ゲートウェイを構成し、ゲートウェイの EIP を [IP アドレス] セキュリティ設定に入力します。

  3. チャットボットの作成後に表示される Webhook URL をコピーして保存します。

ステップ 2: アプリケーション通知の構成

argocd-notifications-cm ConfigMap を編集して、DingTalk Webhook を登録し、メッセージテンプレートを定義し、トリガーを構成し、サブスクリプションを設定します。

kubectl edit cm argocd-notifications-cm -n argocd

構成には4つの部分があります。

  1. 通知サービスの登録 — Argo CD をご利用の DingTalk Webhook に向けます。

  2. テンプレートの定義 — 各通知タイプの Markdown メッセージ本文を指定します。

  3. トリガーの構成 — 各テンプレートを起動する条件を設定します。

  4. サブスクリプションの追加 — アプリケーションをトリガーにサブスクライブします。

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 (赤) を使用しています。