본문 바로가기
DevOps

ArgoCD Slack Notifications : Webhook vs Token 방식 비교

by Rainbound-IT 2025. 9. 1.
반응형

1. 들어가며

ArgoCD는 GitOps 방식으로 Kubernetes 애플리케이션을 관리할 수 있는 강력한 도구입니다.
하지만 운영 환경에서는 단순히 배포만 잘 된다고 끝이 아니죠. 애플리케이션의 동기화(Sync) 성공/실패 상태를 빠르게 알림으로 받아볼 수 있어야 합니다.

ArgoCD는 이를 위해 Slack Notifications 기능을 제공합니다.
이번 글에서는 EKS 환경에서 Slack 알림을 설정하는 방법과, 실제로 적용해본 Webhook 방식과 Token 방식의 차이점을 정리해보겠습니다.


2. Webhook 방식 적용기

저희는 먼저 Webhook 방식을 적용했습니다.
Webhook은 Slack에서 제공하는 Incoming Webhook URL을 사용해 메시지를 보내는 방식으로, 설정이 간단하고 빠릅니다.

주요 문제와 해결

  1. Terraform Validation 오류
    • CronJob 리소스에서 metadata 블록 누락 → 빈 metadata {} 블록 추가로 해결
  2. Slack 알림 "not_authed" 에러
    • service.slack 대신 service.webhook.slack을 사용해야 정상 동작
  3. Secret 참조 문제
    • Slack Webhook URL이 잘못된 위치에 생성 → notifications.secret.items에 정의해야 올바르게 참조됨
  4. 과도한 로그 출력
    • Controller가 1분마다 로그 출력 → 로그 레벨을 error로 낮추어 해결
    • (단, 1분 주기 스캔은 소스코드에 고정되어 변경 불가)

최종 동작하는 Webhook 설정 예시

 
notifications:
  enabled: true
  controller:
    replicas: 1
    env:
    - name: ARGOCD_NOTIFICATIONS_CONTROLLER_SELF_SERVICE_NOTIFICATION_ENABLED
      value: "false"
    resources:
      requests:
        cpu: 50m
        memory: 64Mi
      limits:
        cpu: 200m
        memory: 256Mi
  cm:
    create: true
  secret:
    create: true
    items:
      slack-webhook: "${var.slack_webhook}"
  notifiers:
    service.webhook.slack: |
      url: $slack-webhook
      headers:
      - name: Content-Type
        value: application/json
  templates:
    template.app-sync-succeeded: |
      webhook:
        slack:
          method: POST
          body: |
            {
              "text": "✅ *{{.app.metadata.name}}* sync **SUCCEEDED**\n• Project: `{{.app.spec.project}}`\n• Revision: `{{.app.status.sync.revision}}`"
            }
  triggers:
    trigger.on-sync-succeeded: |
      - when: app.status.operationState != nil
          && app.status.operationState.phase == 'Succeeded'
          && app.status.sync.status == 'Synced'
        oncePer: app.status.operationState.syncResult.revision
        send: [app-sync-succeeded]
  subscriptions:
    - recipients:
      - slack
      triggers:
      - on-sync-succeeded
 
 

✅ 간단히 설정할 수 있고, 기본적인 성공/실패 알림에는 충분했습니다.


3. Token 방식 살펴보기

Webhook 방식으로 운영하던 중, 더 풍부한 메시지 포맷과 다채널 전송이 필요할 수 있다는 점을 고려해 Token 방식도 조사했습니다.

Token 방식은 Slack Web API를 사용하는 방식으로, Slack App 생성Bot Token 발급이 필요합니다.

Token 방식 설정 단계

  1. Slack App 생성 → 워크스페이스에 설치
  2. Bot Token 권한 부여 (chat:write, chat:write.public)
  3. OAuth Token (xoxb-...) 발급
  4. ArgoCD Secret에 Token 저장
  5. Notifier와 Template을 Slack API 형식으로 작성

Token 방식 예시

notifications:
  notifiers:
    service.slack: |
      token: $slack-token
      username: ArgoCD
      icon: ":argo:"
  templates:
    template.app-sync-succeeded: |
      slack:
        attachments: |
          [{
            "title": "✅ Application Synced Successfully",
            "color": "good",
            "fields": [
              {
                "title": "Application",
                "value": "{{.app.metadata.name}}",
                "short": true
              },
              {
                "title": "Environment", 
                "value": "{{.app.metadata.namespace}}",
                "short": true
              },
              {
                "title": "Revision",
                "value": "{{.app.status.sync.revision}}",
                "short": false
              }
            ],
            "actions": [
              {
                "type": "button",
                "text": "Open ArgoCD",
                "url": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}"
              }
            ]
          }]
  subscriptions:
    - recipients:
      - slack:#dev-deployments
      - slack:#ops-alerts
      triggers:
      - on-sync-succeeded
 
 
 

여기서는 버튼까지 포함된 리치 메시지를 보낼 수 있습니다.


4. 두 방식 비교


 

구분 Webhook 방식 Token 방식
인증 Webhook URL Slack Bot Token (OAuth)
채널 지정 Webhook 생성 시 채널 고정 recipients에서 채널 동적 지정 가능
메시지 표현 단순 텍스트/JSON 첨부/블록/버튼 등 풍부한 포맷 지원
설정 난이도 간단 (URL만 필요) 복잡 (앱 생성 및 권한 설정 필요)
보안 관리 URL 재발급 가능 토큰 회수/회전 가능
활용도 기본 알림에 적합 운영 고도화, 고급 기능 활용 적합

5. 우리가 Webhook 방식을 선택한 이유

  • 간단함: Slack App 권한 관리 불필요
  • 안정성: 인증 오류 가능성 적음
  • 충분한 기능: 단순 알림 목적에는 적합
  • 유지보수 용이: Token Rotation 관리 불필요

6. Token 방식을 고려해야 할 때

  • 알림 메시지를 풍부하게 커스터마이징해야 할 때
  • 여러 채널에 동시에 전송해야 할 때
  • 버튼, 스레드, 리액션 등 고급 Slack 기능을 활용해야 할 때
  • 메시지 포맷 제어가 중요한 환경에서

7. 마이그레이션 방법 (Webhook → Token)

  1. Slack App 생성 후 Token 발급
  2. Secret 수정 → slack-token 저장
  3. Notifier를 service.slack으로 변경
  4. Template을 Slack Attachment 포맷으로 업데이트
  5. Subscriptions에서 slack:#channel-name 형식으로 채널 지정

8. 마무리

  • Webhook 방식: 단순 알림 목적에 빠르고 쉽게 적용 가능
  • Token 방식: 더 풍부한 메시지와 다채널 전송이 필요할 때 유용
반응형

댓글