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}}"
}
]
}