Amazon CloudWatch Event와 Lambda를 이용한 자동화 기능 만들기

Amazon CloudWatch 개념

Amazon CloudWatch는 모니터링 및 관찰 기능 서비스입니다. CloudWatch는 애플리케이션을 모니터링하고, 시스템 전반의 성능 변경 사항에 대응하며, 리소스 사용률을 최적화하고, 운영 상태에 대한 통합된 보기를 확보하는데 필요한 데이터와 실행 가능한 통찰력을 제공합니다. CloudWatch는 로그, 지표 및 이벤트 형태로 모니터링 및 운영 데이터를 수집하여 AWS와 온프레미스 서버에서 실행되는 AWS 리소스, 애플리케이션 및 서비스에 대한 통합된 보기를 제공합니다. CloudWatch를 사용하여 환경에서 이상 동작을 감지하며, 경보를 설정하고, 로그와 지표를 나란히 시각화하며, 자동화된 작업을 수행하고, 문제를 해결하며, 통찰력을 확보하여 애플리케이션을 원활하게 실행할 수 있습니다.


실습 목표

아래의 실습을 완료하였을 때, 아래의 절차대로 자동화가 실현됩니다.

  1. EC2 인스턴스가 Stopped로 상태 변화
  2. 상태 변화를 Amazon CloudWatch Event로 전송
  3. Amazon CloudWatch Event는 해당 이벤트가 발생하면 사전에 정의된 규칙에 따라 Lambda를 실행
  4. Lambda는 이벤트 인자를 확인하여 해당 EC2 인스턴스를 다시 시작


자동화 기능 구축하기

Lambda가 사용할 IAM Role 생성하기

  1. AWS 콘솔 창에서 IAM 콘솔 화면으로 이동합니다.

  2. IAM 역할을 생성하기 이전, 해당 역할이 수행할 정책(IAM Policies)을 정의해야 합니다. 정책을 생성하여 Lambda 함수가 EC2를 시작할 수 있는 권한을 가질 수 있도록 구성합니다. 화면에서 Policies 클릭 > Create Policy를 클릭합니다.

  3. 정책을 생성합니다. Service는 대상인 EC2를 선택, Actions는 Write의 StartInstances입니다. Resources는 모든 EC2를 대상으로 해당 액션을 취할 수 있도록 All resources를 선택합니다. 그 다음, 다음 단계로 이동합니다.

  4. 태그 페이지에서 다음을 클릭한 후, 아래와 같은 화면에서 정책의 이름(EC2Start)을 입력합니다. 마지막으로 Create policy를 통해, 해당 정책을 생성합니다.

  5. 다음 단계로 Lambda 함수가 사용할 역할을 생성합니다. 해당 역할에는 방금 생성한 정책을 포함하여, Lambda 함수가 EC2 인스턴스를 시작할 수 있는 권한을 갖도록 설정합니다. 화면에서 Roles 클릭 > Create role을 클릭합니다.

  6. AWS 서비스인 Lambda가 해당 역할을 사용할 수 있도록 아래의 그림과 같이 선택하고 다음 단계로 이동합니다.

  7. 역할에 포함될 정책을 선택합니다. 첫 번째로 선택할 정책은 Lambda가 CloudWatch Logs에 로그를 남길 수 있는 AWS 관리 정책인 AWSLambdaBasicExecutionRole을 선택합니다.

  8. 두 번째로 선택할 정책은 Lambda가 EC2 인스턴스를 시작할 수 있는 정책입니다. 해당 정책은 방금 전에 직접 우리가 생성했습니다. EC2Start를 검색하여 선택한 후, 다음 단계로 이동합니다.

  9. 다음은 역할에 필요한 태그를 설정하는 단계입니다. 본 실습에서는 해당 작업을 수행하지 않지만 프로덕션에서 관리 용이성을 위해 사용하는 것이 좋습니다. 다음 단계로 이동합니다.

  10. 역할의 이름을 LambdaEC2Start로 입력하고, 정책이 2개 선택되었는지 확인한 후, Create role를 클릭합니다. 이렇게 하여 Lambda 함수에 사용할 IAM Role(역할) 생성을 완료하였습니다.

EC2를 시작하는 Lambda 생성하기

  1. AWS 콘솔 창에서 Lambda 콘솔 화면으로 이동합니다.

  2. Functions에서 Create function을 클릭하여 Lambda 함수를 생성하는 작업을 시작합니다.

  3. 함수의 아래의 화면과 같이 생성합니다. 먼저 Author from scratch가 선택되어 있는 것을 확인합니다. 다음으로 EC2StartFunction으로 이름을 입력합니다. 런타임의 경우, Python 3.8을 선택합니다. Change default execution role을 클릭하여 확장시킨 후, 위에서 생성한 IAM Role을 사용하기 위해 Use an existing role 클릭 > Existing role에서 LambdaEC2Start를 선택합니다. 마지막으로 Create function 버튼을 클릭하여 람다 함수를 생성합니다.

  4. 아래의 python code를 lambda_function.py 파일에 붙여넣은 후, Deploy 버튼을 클릭합니다. 이때, 아래와 같이 들여쓰기가 제대로 반영되었는지 다시 한번 더 확인하는 작업이 필요합니다.

    import json
    import boto3
    ec2 = boto3.resource('ec2')
    
    def lambda_handler(event, context):
        print(event)
        ec2.Instance(event["detail"]["instance-id"]).start()
        print("Instnace ID: "+event["detail"]["instance-id"]+"Started!")
    
  5. Deploy 버튼 클릭 후, 아래와 같이 화면이 바뀐 것을 확인할 수 있습니다.

Amazon CloudWatch Event에서 규칙 작성하기

  1. AWS 콘솔 창에서 CloudWatch 콘솔 화면으로 이동합니다.

  2. 왼쪽 사이드바에서 Events 아래에 있는 Rules 클릭 > Create rule을 클릭합니다.

  3. Event SourceTargets를 아래의 화면과 같이 구성합니다. 먼저, Event Source에서 Event Pattern이 선택된 것을 확인한 후, Service Names에는 EC2, Event Type에는 EC2 Instance State-change Notification을 선택합니다. 그리고 아래에서 Specific state(s) 를 선택한 후, Stopped를 선택합니다. 이와 같은 설정을 통해, EC2가 stopped의 상태로 변경되었을 때, 해당 이벤트가 발생하도록 구성했습니다.

    그 다음, Targets에서 Add targe을 클릭한 후, 앞서 생성한 Lambda 함수를 선택합니다. Configure details 버튼을 클릭하여 다음 단계로 이동합니다.

이를 통해, EC2 인스턴스 상태가 stopped로 변하면 Lambda 함수 안에 있는 코드가 실행되어 EC2 인스턴스가 자동적으로 다시 시작됩니다.

  1. 단계 2에서 CloudWatch Event 규칙에 대한 이름을 입력한 후, Create rule 버튼을 통해, 규칙 작성을 완료합니다.

    정상적으로 생성했을 경우, 규칙 리스트에서 방금 생성한 규칙을 확인할 수 있습니다.

테스트 인스턴스 생성하기

  1. 그 다음으로 작성한 자동화 Lambda 함수가 정상적으로 동작하는지 테스트하기 위해, 인스턴스를 생성합니다. 테스트로 사용할만한 인스턴스가 이미 있는 경우, 생성 작업을 생략하고 인스턴스를 중단하는 단계로 이동합니다.

  2. EC2 Dashboard에서 Launch instance 클릭합니다.

  3. 먼저, Amazon Linux 2 AMI를 선택합니다.

  4. 그 다음, 인스턴스 타입은 t2.micro를 선택하고 Review and Launch 버튼을 클릭합니다.

  5. 아래 화면과 같이 최종적으로 생성될 인스턴스 스펙을 확인한 후, Launch 버튼을 클릭합니다.

  6. 이 때, 키페어를 선택하는 팝업창이 나타나는데, 본 실습에서는 해당 인스턴스에 직접 접속하지 않기 때문에 아래와 같이 키페어 없이 실행하는 옵션을 선택합니다.

  7. 잠시 후면 생성한 인스턴스의 상태가 running으로 변경됩니다.

  8. 인스턴스를 중지시켜 Lambda 함수가 제대로 동작하는지 확인합니다. 방금 생성한 인스턴스를 선택한 후, Instance state에서 Stop instance 버튼을 클릭합니다.

  9. 아래 화면과 같은 창이 뜨면 확인 버튼을 눌러 인스턴스를 중단시킵니다.

  10. 방금 전 중단시킨 인스턴스가 시간이 지나면 재시작되어 있는 것을 확인합니다.

Lambda의 로그 및 실행 시간 확인하기

  1. Lamba 콘솔 창에서 EC2StartFunction을 클릭한 후, Monitor 탭을 선택합니다. Lambda 함수의 실행 횟수, 실행 기간 및 에러 등의 지표를 확인할 수 있습니다. View logs in CloudWatch 버튼을 클릭하여 CloudWatch 콘솔창에서 로그를 확인합니다.

  2. CloudWatch Logs에서 실습에서 생성한 람다 함수의 로그 스트림을 선택합니다. 로그 이벤트에서 관련 로그와 함수의 실해 시간을 확인합니다.

이로써 AWS Lambda를 통한 자동화 기능 구축하기 실습을 완료하였습니다. 추후, 비용이 부과되지 않기 위해, 5. 실습 리소스 정리 페이지로 이동하여 자원을 삭제합니다.