Teams Workflows

Teams Workflows

argocd-notifications 로 Microsoft Teams Workflows(Power Automate) 채널에 메시지 알림을 보내는 방법입니다. 2026년 3월 31일 폐지되는 Office 365 Connectors 서비스의 권장 대체재예요.

출처: 문서

본문

개요 (Overview)

Teams Workflows 알림 서비스는 Microsoft Teams Workflows(Power Automate) 를 사용해 메시지 알림을 보냅니다. 2026년 3월 31일에 폐지될 레거시 Office 365 Connectors 서비스의 권장 대체재입니다.

파라미터 (Parameters)

Teams Workflows 알림 서비스는 다음 설정을 지정해야 합니다:

  • recipientUrls - 웹훅 URL 맵, 예: channelName: https://api.powerautomate.com/webhook/...

지원되는 웹훅 URL 형식 (Supported Webhook URL Formats)

이 서비스는 다음 Microsoft Teams Workflows 웹훅 URL 패턴을 지원합니다:

  • https://api.powerautomate.com/...

  • https://api.powerplatform.com/...

  • https://flow.microsoft.com/...

  • 경로에 /powerautomate/ 를 포함한 URL

설정 (Configuration)

  • Teams 를 열고 알림을 설정할 채널로 이동합니다

  • 채널 이름 옆의 점 세 개를 클릭합니다

  • Workflows 를 선택합니다

  • Manage 를 클릭합니다

  • New flow 를 클릭합니다

  • 검색창에 Send webhook alerts to a channel 을 쓰거나 템플릿 목록에서 선택합니다

  • 팀과 채널을 고릅니다

  • 웹훅 이름과 설정을 구성합니다

  • 웹훅 URL 을 복사합니다 (api.powerautomate.com, api.powerplatform.com, 또는 flow.microsoft.com 에서 오는 URL입니다)

  • argocd-notifications-secret 에 저장하고 argocd-notifications-cm 에 정의합니다

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  service.teams-workflows: |
    recipientUrls:
      channelName: $channel-workflows-url

apiVersion: v1
kind: Secret
metadata:
  name: <secret-name>
stringData:
  channel-workflows-url: https://api.powerautomate.com/webhook/your-webhook-id

  • Teams Workflows 통합에 대한 구독을 만듭니다:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    notifications.argoproj.io/subscribe.on-sync-succeeded.teams-workflows: channelName

채널 지원 (Channel Support)

  • ✅ 표준 Teams 채널

  • ✅ 공유 채널(Shared channels, 2025년 12월부터)

  • ✅ 비공개 채널(Private channels, 2025년 12월부터)

Teams Workflows 는 Office 365 Connectors 보다 향상된 채널 지원을 제공하며, 표준 채널 외에도 공유·비공개 채널에 게시할 수 있어요.

Adaptive Card 형식 (Adaptive Card Format)

Teams Workflows 서비스는 Microsoft Teams 의 현대적이고 유연한 카드 형식인 Adaptive Cards 만 사용합니다. 모든 알림은 자동으로 Adaptive Card 형식으로 변환되어 필수 message envelope 에 감싸집니다.

옵션 1: 템플릿 필드 사용 (권장)

이 서비스는 템플릿 필드를 자동으로 Adaptive Card 형식으로 변환합니다. 가장 단순하고 유지보수하기 쉬운 방식이에요:

template.app-sync-succeeded: |
  teams-workflows:
    # ThemeColor supports Adaptive Card semantic colors: "Good", "Warning", "Attention", "Accent"
    # or hex colors like "#000080"
    themeColor: "Good"
    title: Application {{.app.metadata.name}} has been successfully synced
    text: Application {{.app.metadata.name}} has been successfully synced at {{.app.status.operationState.finishedAt}}.
    summary: "{{.app.metadata.name}} sync succeeded"
    facts: |
      [{
        "name": "Sync Status",
        "value": "{{.app.status.sync.status}}"
      }, {
        "name": "Repository",
        "value": "{{.app.spec.source.repoURL}}"
      }]
    sections: |
      [{
        "facts": [
          {
            "name": "Namespace",
            "value": "{{.app.metadata.namespace}}"
          },
          {
            "name": "Cluster",
            "value": "{{.app.spec.destination.server}}"
          }
        ]
      }]
    potentialAction: |-
      [{
        "@type": "OpenUri",
        "name": "View in Argo CD",
        "targets": [{
          "os": "default",
          "uri": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}"
        }]
      }]

동작 방식:

  • title → 크고 굵은 TextBlock 으로 변환
  • text → 일반 TextBlock 으로 변환
  • facts → FactSet 요소로 변환
  • sections → 섹션 안의 facts 가 추출되어 FactSet 요소로 변환
  • potentialAction → OpenUri 액션이 Action.OpenUrl 로 변환
  • themeColor → title TextBlock 에 적용 ( "Good", "Warning", "Attention", "Accent" 같은 시맨틱 색 또는 hex 색 지원)

옵션 2: 커스텀 Adaptive Card JSON

완전한 제어와 고급 기능을 위해 전체 Adaptive Card JSON 템플릿을 제공할 수 있어요:

template.app-sync-succeeded: |
  teams-workflows:
    adaptiveCard: |
      {
        "type": "AdaptiveCard",
        "version": "1.4",
        "body": [
          {
            "type": "TextBlock",
            "text": "Application {{.app.metadata.name}} synced successfully",
            "size": "Large",
            "weight": "Bolder",
            "color": "Good"
          },
          {
            "type": "TextBlock",
            "text": "Application {{.app.metadata.name}} has been successfully synced at {{.app.status.operationState.finishedAt}}.",
            "wrap": true
          },
          {
            "type": "FactSet",
            "facts": [
              {
                "title": "Sync Status",
                "value": "{{.app.status.sync.status}}"
              },
              {
                "title": "Repository",
                "value": "{{.app.spec.source.repoURL}}"
              }
            ]
          }
        ],
        "actions": [
          {
            "type": "Action.OpenUrl",
            "title": "View in Argo CD",
            "url": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}"
          }
        ]
      }

참고: adaptiveCard 를 사용할 때는 AdaptiveCard JSON 구조만 제공하면 됩니다(전체 message envelope 는 제외). 서비스가 Teams Workflows 에 필요한 message + attachments 형식으로 자동으로 감싸줘요.

중요: adaptiveCard 를 제공하면 다른 모든 템플릿 필드(title, text, facts 등)보다 우선합니다.

템플릿 필드 (Template Fields)

Teams Workflows 서비스는 다음 템플릿 필드를 지원하며, 자동으로 Adaptive Card 형식으로 변환됩니다:

표준 필드 (Standard Fields)

  • title - 메시지 제목 (크고 굵은 TextBlock 으로 변환)

  • text - 메시지 텍스트 내용 (TextBlock 으로 변환)

  • summary - 요약 텍스트 (현재 Adaptive Cards 에서는 사용되지 않지만 호환성을 위해 보존됨)

  • themeColor - 제목의 색. 지원:

  • 시맨틱 색: "Good" (녹색), "Warning" (노란색), "Attention" (빨간색), "Accent" (파란색)

  • Hex 색: "#000080", "#FF0000"

  • facts - 사실(fact) 키-값 쌍의 JSON 배열 (FactSet 으로 변환)

facts: |
  [{
    "name": "Status",
    "value": "{{.app.status.sync.status}}"
  }]

  • sections - facts 를 포함하는 섹션의 JSON 배열 (facts 가 추출되어 FactSet 으로 변환)
sections: |
  [{
    "facts": [{
      "name": "Namespace",
      "value": "{{.app.metadata.namespace}}"
    }]
  }]

  • potentialAction - 액션 버튼의 JSON 배열 (OpenUri 액션이 Action.OpenUrl 로 변환)
potentialAction: |-
  [{
    "@type": "OpenUri",
    "name": "View Details",
    "targets": [{
      "os": "default",
      "uri": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}"
    }]
  }]

고급 필드 (Advanced Fields)

  • adaptiveCard - 완전한 Adaptive Card JSON 템플릿 (다른 모든 필드보다 우선)

  • AdaptiveCard 구조만 제공하면 되고 message envelope 은 제공하지 않습니다

  • 전체 Adaptive Card 1.4 스펙을 지원합니다

  • 모든 Adaptive Card 기능(containers, columns, images 등)에 접근할 수 있어요

  • template - 원시 JSON 템플릿 (레거시, 대신 adaptiveCard 사용)

필드 변환 상세 (Field Conversion Details)

| 템플릿 필드 | Adaptive Card 요소 | 참고 | | title | TextBlock with size: "Large", weight: "Bolder" | ThemeColor 가 이 요소에 적용됨 | | text | TextBlock with wrap: true | text 가 비어 있으면 n.Message 사용 | | facts | FactSet | 각 fact 가 title/value 쌍이 됨 | | sections[].facts | FactSet | 섹션에서 facts 추출 | | potentialAction[OpenUri] | Action.OpenUrl | OpenUri 액션만 변환됨 | | themeColor | title TextBlock.color 에 적용 | 시맨틱 및 hex 색 지원 |

Office 365 Connectors 에서 마이그레이션 (Migration from Office 365 Connectors)

현재 teams 서비스를 Office 365 Connectors 와 함께 쓰고 있다면 다음 단계로 마이그레이션하세요:

  • 위 설정 단계를 사용해 새 Workflows 웹훅을 만듭니다

  • 서비스 구성을 갱신합니다:

  • service.teams 에서 service.teams-workflows 로 변경

  • 웹훅 URL 을 새 Workflows 웹훅 URL 로 갱신합니다

  • 템플릿을 갱신합니다:

  • 템플릿에서 teams:teams-workflows: 로 변경

  • 기존 템플릿 필드(title, text, facts, sections, potentialAction)는 자동으로 Adaptive Card 형식으로 변환됩니다

  • 템플릿 구조를 바꿀 필요는 없습니다 - 변환이 자동입니다

  • 구독을 갱신합니다:

# Old
notifications.argoproj.io/subscribe.on-sync-succeeded.teams: channelName

# New
notifications.argoproj.io/subscribe.on-sync-succeeded.teams-workflows: channelName

  • 테스트하고 검증합니다:

  • 테스트 알림을 보내 제대로 동작하는지 확인합니다

  • 확인되면 이전 Office 365 Connector 설정을 제거하면 됩니다

참고: 기존 템플릿은 수정 없이 동작합니다. 서비스가 템플릿 필드를 자동으로 Adaptive Card 형식으로 변환하므로, 템플릿을 바꾸지 않고도 현대적인 카드의 이점을 누릴 수 있어요.

Office 365 Connectors 와의 차이점 (Differences from Office 365 Connectors)

| 기능 | Office 365 Connectors | Teams Workflows | | 서비스 이름 | teams | teams-workflows | | 표준 채널 | ✅ | ✅ | | 공유 채널 | ❌ | ✅ (2025년 12월부터) | | 비공개 채널 | ❌ | ✅ (2025년 12월부터) | | 카드 형식 | messageCard (레거시) | Adaptive Cards (모던) | | 템플릿 변환 | N/A | 템플릿 필드에서 자동 변환 | | 폐지 날짜 | 2026년 3월 31일 | 활성 |

Adaptive Card 기능 (Adaptive Card Features)

Teams Workflows 서비스는 다음을 제공하는 Adaptive Cards 를 활용합니다:

  • 풍부한 콘텐츠: 텍스트, 이미지, fact set 등을 지원

  • 유연한 레이아웃: containers, columns, adaptive 레이아웃

  • 인터랙티브 요소: 액션 버튼, 입력 필드 등

  • 시맨틱 색: 내장 색 구성 (Good, Warning, Attention, Accent)

  • 크로스 플랫폼: Teams, Outlook 및 기타 Microsoft 365 앱에서 동작

예시: 고급 Adaptive Card 템플릿

복잡한 알림에는 전체 Adaptive Card 스펙을 사용할 수 있습니다:

template.app-sync-succeeded-advanced: |
  teams-workflows:
    adaptiveCard: |
      {
        "type": "AdaptiveCard",
        "version": "1.4",
        "body": [
          {
            "type": "Container",
            "items": [
              {
                "type": "ColumnSet",
                "columns": [
                  {
                    "type": "Column",
                    "width": "auto",
                    "items": [
                      {
                        "type": "Image",
                        "url": "https://example.com/success-icon.png",
                        "size": "Small"
                      }
                    ]
                  },
                  {
                    "type": "Column",
                    "width": "stretch",
                    "items": [
                      {
                        "type": "TextBlock",
                        "text": "Application {{.app.metadata.name}}",
                        "weight": "Bolder",
                        "size": "Large"
                      },
                      {
                        "type": "TextBlock",
                        "text": "Successfully synced",
                        "spacing": "None",
                        "isSubtle": true
                      }
                    ]
                  }
                ]
              },
              {
                "type": "FactSet",
                "facts": [
                  {
                    "title": "Status",
                    "value": "{{.app.status.sync.status}}"
                  },
                  {
                    "title": "Repository",
                    "value": "{{.app.spec.source.repoURL}}"
                  }
                ]
              }
            ]
          }
        ],
        "actions": [
          {
            "type": "Action.OpenUrl",
            "title": "View in Argo CD",
            "url": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}"
          }
        ]
      }

더 알아보기 (Learn more)