CloudFormation으로 작성한 리소스 및 스택의 변경을 감시할 수 있게 되었습니다

AWS CloudFormation을 EventBridge의 이벤트 소스로 사용하는 기능에 대한 글입니다.
2022.08.02

안녕하세요 클래스메소드의 수재입니다.
2022년 7월 20일에 CloudFormation과 관련된 기능이 업데이트 되었습니다.

간략히 설명하자면 이제 CloudFormation에 변경 사항이 있을 때 마다 EventBridge를 트리거 할 수 있게 되었습니다.
이번에는 해당 기사에 언급된 기능에 대해 알아보겠습니다.

업데이트 전에는?

기존에는 스택 이벤트에 대해 스택 생성 시 혹은 변경 세트 생성 시 AWS SNS로만 알림을 트리거할 수 있었습니다.

작성 후 리소스의 변경에 대해서는 드리프트 검사를 통하여 확인할 수 있었습니다.

기능 업데이트 후

AWS CloudFormation은 스택에서 생성, 업데이트, 삭제 또는 드리프트 감지 작업이 수행될 때마다 Amazon EventBridge에 이벤트를 보낼 수 있습니다. 다른 대상과 달리 전달할 이벤트 유형을 선택할 필요가 없습니다. EventBridge 규칙을 사용하여 이벤트를 정의된 대상으로 라우팅할 수 있습니다 - 공식 문서

이제 AWS CloudFormation 기반 스택 및 리소스의 변경 사항을 Amazon EventBridge의 이벤트 알림으로 확인할 수 있습니다. 고객은 이벤트 기반 애플리케이션을 생성하기 위해 CloudFormation 스택의 변경 사항을 주기적으로 폴링할 필요가 없어졌습니다. 고객은 폴링을 위해 사용자 지정 코드를 작성하지 않아도 될 뿐 아니라, 폴링 시 비어 있는 결과가 반환되는 사례에 대한 컴퓨팅 비용도 절감할 수 있게 되었습니다. - 기능 공지

스택 및 리소스의 변경 사항을 AWS EventBridge를 트리거할 수 있게 되었기 때문에 변경 사항을 주기적으로 확인할 필요 없이 액션이 일어나면 바로 대응이 가능하게 되었습니다.

설정해보기

EventBridge에서 규칙을 생성할 때 이벤트 소스를 AWS CloudFormation을 지정하면 됩니다.
콘솔 기준으로 상세한 설정 방법은 다음과 같습니다.

  1. AWS EventBridge에 엑세스합니다.
  2. 사이드바의 [규칙] 메뉴에서 [규칙 생성] 을 클릭하여 새로운 규칙을 생성합니다.
  3. 이름, 설명을 기입하고 규칙 유형은 [이벤트 패턴이 있는 규칙]을 선택합니다.
  4. 이벤트 소스는 다음과 같이 설정합니다. 필요한 감시 내용에 따라 이벤트 유형(event type)을 선택합니다. 수신하는 이벤트 소스마다 수신하는 포맷이 조금씩 다르기 때문에 유형 별로 규칙을 만드는 것을 추천합니다.각 이벤트 유형의 내용은 다음과 같습니다.
    • Resource status Change : 기본 리소스 속성을 변경하는 모든 업데이트
    • Stack status Change : 스택의 모든 상태 변경 업데이트
    • Drift detection status Change : 스택의 드리프트 감지 업데이트
    • 이벤트 유형별 메시지에 대한 상세한 내용은 공식 문서를 참고해주세요
  5. 이벤트를 수신할 대상을 선택합니다.
  6. 태그를 선택한 후 설정 내용을 검토합니다. 문제가 없다면 생성합니다.

다음과 같이 생성된 것을 확인할 수 있습니다.

비교해보기

CloudFormation의 설정 알림과 EventBridge의 타겟을 SNS로 설정하여 어떤 어떤 알림이 오는지 비교해보겠습니다.
EventBridge는 CloudFormation의 모든 이벤트를 수신하도록 설정했습니다.

스택 업데이트

스택에 태그를 추가한 후 수신되는 알림을 확인해보겠습니다.

  • CloudFormation의 알림 설정
    StackId='arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3'
    Timestamp='2022-08-02T09:16:51.583Z'
    EventId='d8188db0-1243-11ed-913d-0e3662eb906b'
    LogicalResourceId='testtt'
    Namespace='------------'
    PhysicalResourceId='arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3'
    PrincipalId='------------------------:------------'
    ResourceProperties='null'
    ResourceStatus='UPDATE_COMPLETE'
    ResourceStatusReason=''
    ResourceType='AWS::CloudFormation::Stack'
    StackName='testtt'
    ClientRequestToken='Console-UpdateStack-208c2505-8a64-0721-4b82-13c7ba9a2253'

    스택의 상태가 변경될 때마다 알림이 수신되며 스택에 대한 상세한 정보가 수신됩니다.

  • EventBridge 설정

    {
    "version":"0",
    "id":"ed4fcedc-8247-f247-b124-d22d04ce2c0e",
    "detail-type":"CloudFormation Stack Status Change",
    "source":"aws.cloudformation",
    "account":"------------",
    "time":"2022-08-02T09:16:51Z",
    "region":"ap-northeast-1",
    "resources":[
    "arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3"
    ],
    "detail":{
    "stack-id":"arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3",
    "client-request-token":"Console-UpdateStack-208c2505-8a64-0721-4b82-13c7ba9a2253",
    "status-details":{
    "status":"UPDATE_COMPLETE","status-reason":""
    }
    }}

    마찬가지로 스택의 상태가 변경될 때마다 알림이 수신되며 대상 스택과 스택 상태에 대한 정보만 수신됩니다.
    EventBridge에서 작성한 해당 규칙의 [타겟(target)] - [입력(input)]에서 메시지의 포맷을 변경하지 않는다면 쭉 이어진 텍스트가 수신됩니다.
    따라서 하나의 역할에서 모든 이벤트를 수신하도록 설정하면 입력 포맷을 설정하기 조금 귀찮아집니다.

리소스 변경

스택으로 작성한 EC2 인스턴스의 타입을 변경한 후 수신되는 알림을 확인해보겠습니다.

  • CloudFormation의 알림 설정

위와 마찬가지로 스택의 상태에 대한 알림만 수신됩니다.

  • EventBridge 설정
    {
    "version":"0",
    "id":"2c8def39-9ce8-4f4a-2621-57d8312f3c18",
    "detail-type":"CloudFormation Resource Status Change",
    "source":"aws.cloudformation","account":"------------",
    "time":"2022-08-02T09:16:48Z","region":"ap-northeast-1",
    "resources":[
    "arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3"
    ],
    "detail":{
    "stack-id":"arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3",
    "logical-resource-id":"WebServerInstance",
    "physical-resource-id":"i-010fecf3-------",
    "resource-type":"AWS::EC2::Instance",
    "client-request-token":"Console-UpdateStack-208c2505-8a64-0721-4b82-13c7ba9a2253",
    "status-details":{
    "status":"UPDATE_COMPLETE","status-reason":""}
    }}

    모든 이벤트를 수신하도록 설정했기 때문에 스택 상태에 대한 알림과 함께 변경된 리소스에 대한 알림도 수신됩니다.
    대상 리소스가 무엇인지는 확인할 수 있지만 어떤 값으로 변경되었는지는 확인할 수 없었습니다.

드리프트 변경

마지막으로 스택으로 생성했던 인스턴스의 타입을 EC2 콘솔에서 변경한 후 드리프트를 검사해보겠습니다.

  • CloudFormation의 알림 설정

아무런 알림도 수신되지 않습니다.

  • EventBridge 설정
    {
    "version":"0",
    "id":"072a0155-9894-5567-a4c8-eee9977a6031",
    "detail-type":"CloudFormation Drift Detection Status Change",
    "source":"aws.cloudformation",
    "account":"------------",
    "time":"2022-08-02T09:41:59Z",
    "region":"ap-northeast-1",
    "resources":[
    "arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3"
    ],
    "detail":{
    "stack-id":"arn:aws:cloudformation:ap-northeast-1:------------:stack/testtt/28813110-1237-11ed-9c0e-064c46c689a3",
    "stack-drift-detection-id":"5adbb6c0-1247-11ed-a0c6-06d70e0e53bd",
    "status-details":{
    "stack-drift-status":"",
    "detection-status":"DETECTION_IN_PROGRESS"
    },
    "drift-detection-details":{
    "drifted-stack-resource-count":-1
    }
    }}

    리소스 변경과 마찬가지로 드리프트에 대한 설명이 수신됩니다.

마무리

이번에는 단순히 SNS를 타겟으로 하여 이벤트를 트리거했지만 실제로는 더 많은 상황에 응용할 수 있을 것으로 보이는 기능입니다.

긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 언제나 환영합니다. must01940 지메일로 연락 주시면 감사합니다!


본 블로그 게시글을 보시고 문의 사항이 있으신 분들은
클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !