AWS Chatbot 을 사용하여 AWS Personal Health Dashboard 알림을 Slack 으로 받아보자!

이 블로그에서는 AWS Chatbot 을 사용하여 AWS Personal Health Dashboard 알림을 Slack으로 통지 받는 방법에 대해서 기술합니다.
2022.08.29

안녕하세요, 클래스메서드 Delivery부 MAD그룹의 정현재입니다.

이번 블로그에서는 AWS Personal Health Dashboard의 알림을 Slack 채널으로 통지하는 방법에 대해서 정리하려고 합니다. 그럼 바로 시작해보도록 하겠습니다.

AWS Personal Health Dashboard란?

AWS Health를 이용하여 AWS에서 발생하는 이벤트, 즉 AWS 서비스 전체의 장애나 업데이트 등의 정보를 확인할 수 있다면, AWS Personal Health Dashboard에서는 현재 사용 중인 AWS 리소스 중에서 AWS에서 발생하는 장애나 업데이트로 인해 영향을 받고 있는 리소스가 있는지 확인할 수 있습니다. 예를 들어, 현재 서울 리전에 EC2를 배포하여 사용하고 있고 서울 리전 전체적으로 EC2의 특정 기능에 장애가 발생하고 있는 경우, Personal Health Dashboard 에서 그 내용을 볼 수 있을 것입니다.(아래와 같은 형식으로 매니지먼트 콘솔에서 내용을 확인할 수 있습니다)

test

여기서 한 가지 상황을 생각해보도록 하겠습니다. 여러분들이 EC2에서 웹 서비스를 구축하고 있고, 이것을 사용하는 고객들이 있는 상황입니다. 만약 AWS 장애가 발생하여 웹 서비스를 구축하고 있는 EC2에 영향이 있을 경우, 어떻게 그것을 알아차릴 수 있을까요? 아마 다음과 같은 순서일 것입니다.

  1. 고객으로부터 웹 서비스가 정상적으로 작동하지 않는다는 클레임을 접수
  2. 개발자 측에서 원인 파악 착수
  3. 매니지먼트 콘솔에 들어가 AWS Personal Health Dashboard를 확인하여 사용 중인 리소스에 영향을 끼치고 있는 장애가 있는지 확인

AWS Chatbot을 이용해 Personal Health Dashboard의 정보를 Slack으로 통지하도록 한다면 위의 과정을 더 개선시킬 수 있습니다. 리소스에 영향을 주고 있는 AWS 장애가 발생하고 있는지 고객으로부터 클레임이 오기 전에 파악할 수 있고, 매니지먼트 콘솔에 들어가지 않아도 Slack을 통해 그 내용을 확인 가능하도록 할 수 있습니다. 위의 3단계 과정을「Slack으로부터 통지를 확인한다」이 1단계로 줄이게 되는 것이죠.

실제로 구축해보자

지금부터 AWS Chatbot을 이용해 Personal Health Dashboard의 정보를 Slack으로 통지하는 방법에 대해서 설명드리도록 하겠습니다. 구축 내용은 다음과 같습니다.

EventBridge로부터 Personal Health Dashboard에서 발생하는 이슈를 SNS 토픽에 넘겨주고 SNS에서 Slack의 채널과 연결되있는 Chatbot에 메세지를 넘겨주는 형식입니다.

SNS 토픽 작성

우선, SNS 토픽을 작성합니다. 실습을 위해서는 이름 값만 넣어주면 되기 때문에 나머지는 디폴트값으로도 괜찮습니다. 필요에 따라 optional 항목들을 설정해주세요.

EventBridge 규칙 생성

다음과 같이 규칙의 이름, 설명, 이벤트버스 종류, 규칙 타입을 설정합니다. 저희는 스케줄을 설정하여 일정 시간마다 작동하게 하는 규칙을 만들려는 것이 아니라 Personal Health Dashboard에서 이슈 발생 시 작동되는 규칙을 설정할 것이기 때문에 규칙 타입으로 Rule with an event pattern 을 설정해주고 있습니다. 설정이 완료되었다면 Next 버튼을 누릅니다.

그 후, 이벤트 소스, 이벤트 패턴 등을 설정할 것입니다. 이벤트 소스로는 Personal Health Dashboard를 사용할 것이기 때문에 AWS events or EventBridge partner events를 설정해줍니다. Sample event는 사실 설정에 필요하지는 않지만 구축 완료 후, 테스트를 하기 위해 필요하니 복사를 해두시기를 바랍니다. 그 후, 이벤트 패턴을 설정합니다. 지금은 Personal Health Dashboard의 모든 이벤트를 대상으로 설정하였지만, 이벤트 타입을 변경하여 특정 서비스, 특정 리소스, 특정 이벤트 종류를 설정할 수도 있습니다. 설정 후 Next 버튼을 누릅니다.

이제 타겟을 정하게 됩니다. 아까 작성해둔 SNS 토픽을 선택하여 Personal Health Dashboard의 이벤트를 SNS 토픽으로 보내도록 설정합니다. 그 후, Next 버튼을 눌러 필요에 따라 태그를 설정하고 설정된 값을 확인한 후, 규칙을 만듭니다.

AWS Chatbot 생성

벌써 마지막 구축 단계인 Chatbot 작성입니다. Chatbot에 Slack 채널을 연결시키기 위해서는 우선 Slack의 워크스페이스를 등록합니다. 그 후, 해당 워크스페이스에서 통지를 받을 Slack 채널을 설정합니다.

Chatbot의 이름과 통지를 보낼 Slack의 채널 아이디를 입력합니다. 필요에 따라 CloudWatch Logs에 로그를 남길 것인가를 설정합니다. 그 후, Chatbot의 권한을 설정해주게 되는데 이번 실습을 위해서는 통지를 받는 권한만 있으면 되기 때문에 Notification permissions 만 설정합니다. 채널 가드레일 정책에 대해서도 AdministratorAccess를 설정하였지만, 필요에 따라 다른 IAM 정책 ARN을 설정하여 사용하시길 바랍니다. 마지막으로, 처음에 만들어두었던 SNS 토픽을 연결시키고 완료를 하면 Chatbot의 작성까지 모든 구축 작업이 완료되었습니다.

테스트

구축이 완료되었으니 이제 제대로 작동하는지 테스트를 해보도록 하겠습니다. 아까 EventBridge 규칙 생성 시에 복사해두었던 샘플 이벤트를 사용할 것입니다.

처음 단계에서 작성한 SNS 토픽으로 이동하여 Publish message를 클릭합니다.

그 후, Message Body에 EventBridge 규칙 생성 시에 복사해두었던 샘플 이벤트를 붙여넣고, Publish message 버튼을 클릭합니다.

만약, 구축이 성공했다면 다음과 같은 메세지를 Slack에서 확인할 수 있을 것입니다.

보충

만약 리소스를 여러 리전에서 사용하고 있는 경우는 각 리전마다 EventBridge 규칙과 SNS 토픽을 생성하고, Chatbot과 연결해주는 작업을 해야합니다. 물론 할 수는 있겠지만 리전 별로 만드는 작업이 귀찮고 관리가 힘들겠죠. 그럴 경우에는 CloudFormation의 StackSets 을 작성하여 여러 리전에 한번에 배포를 할 수 있습니다.

AWSTemplateFormatVersion: 2010-09-09
Description: SNS Topic for Health Issue Notice
Resources:
  HealthIssueSnsTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: !Sub health-issue-topic
  HealthIssueSnsTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: sns:Publish
            Resource: '*'
      Topics:
        - !Ref HealthIssueSnsTopic
  AWSEventRule:
    Type: AWS::Events::Rule
    Properties:
      Description: AWS Health Issue Event Rule
      State: ENABLED
      EventPattern:
        source:
          - aws.health
      Name: !Sub health-issue-event-rule
      Targets:
        - Id: !Sub health-issue-topic
          Arn: !Ref HealthIssueSnsTopic

EventBridge 규칙과, SNS 토픽을 작성하는 CloudFormation 예시 코드입니다. 이 파일을 이용해 StackSets을 작성하여 한번에 여러 리전에 똑같은 구성을 구축할 수 있습니다. 이렇게 여러 리전에 EventBridge 규칙과, SNS 토픽을 작성해놓고 Chatbot과 각각 연결 시키는 작업을 하면 훨씬 수월하게 여러 리전에서의 Personal Health Dashboard 정보를 받을 수 있을 것입니다.

Chatbot도 CloudFormation으로 관리하고 싶다면 다음과 같은 코드로 작성할 수 있습니다.

AWSTemplateFormatVersion: 2010-09-09
Description: Chatbot for Health Issue Notice
Parameters:
  SlackWorkspaceID:
    Type: String
    Description: Slack Workspace ID for sending notifications
  SlackChannelId:
    Type: String
    Description: Slack Channel ID for sending notifications
Resources:
  ChatbotIamRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub chatbot-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: chatbot.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess
  ChatbotToSlack:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: !Sub chatbot-to-slack
      LoggingLevel: INFO
      IamRoleArn: !GetAtt ChatbotIamRole.Arn
      SlackWorkspaceId: !Ref SlackWorkspaceID
      SlackChannelId: !Ref SlackChannelId
      SnsTopicArns:
        - !Sub arn:aws:sns:ap-northeast-1:${AWS::AccountId}:health-issue-topic
        - 연결 시킬 SNS 토픽 ARN들

마무리

이번 블로그에서는 AWS Chatbot을 이용해 Slack으로 AWS Peronsal Health Dashboard 정보를 통지하는 방법에 대해서 정리를 해보았습니다. 구축 내용도 어렵지 않고 간단하여, 실제 AWS 리소스를 사용해 서비스를 구축하고 있지 않으시더라도 실습 삼아 따라해보시면 재밌을 것이라 생각합니다. 그럼 이번 블로그는 이상입니다.