Lambda를 사용하여 Amazon EC2 인스턴스를 정기적으로 중지하고 시작하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2022년 1월 13일

EC2 인스턴스를 자동으로 중지 및 시작하여 Amazon Elastic Compute Cloud(Amazon EC2) 사용량을 줄이려고 합니다. 이를 위해 AWS Lambda 및 Amazon EventBridge를 사용하려면 어떻게 해야 하나요?

간략한 설명

참고: 이 설정 예제는 간단한 솔루션입니다. 더 강력한 솔루션이 필요하면 AWS Instance Scheduler를 사용하세요. 자세한 내용은 AWS Instance Scheduler를 사용하여 인스턴스를 중지 및 시작하려면 어떻게 해야 합니까?를 참조하세요.

Lambda를 사용하여 EC2 인스턴스를 정기적으로 중지 및 시작하려면 다음을 수행합니다.

1.    Lambda 함수에 대한 AWS Identity and Access Management(IAM) 정책 및 실행 역할을 생성합니다.

2.    EC2 인스턴스를 중지 및 시작하는 Lambda 함수를 생성합니다.

3.    Lambda 함수를 테스트합니다.

4.    일정에 따라 함수를 트리거하는 EventBridge 규칙을 생성합니다.
참고: AWS 계정에서 발생하는 이벤트에 따라 트리거되도록 규칙을 생성할 수도 있습니다.

해결 방법

참고: 다음 절차를 완료한 후 시작 시 클라이언트 오류(client error on launch)라는 오류가 발생하면, 암호화된 볼륨이 연결된 상태로 인스턴스를 시작하면 “시작 시 클라이언트 오류(client error on launch)”라는 오류와 함께 인스턴스가 즉시 중지됩니다를 참조하세요.

중지 및 시작하려는EC2 인스턴스의 ID를 가져옵니다. 이어서 다음 작업을 수행합니다.

Lambda 함수에 대한 IAM 정책 및 실행 역할 생성

1.    JSON 정책 편집기를 사용하여 IAM 정책을 생성합니다. 다음 JSON 정책 문서를 복사하여 정책 편집기에 붙여 넣습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

2.    Lambda의 IAM 역할을 생성합니다.

중요: 권한 정책을 Lambda에 연결할 때는 방금 생성한 IAM 정책을 선택해야 합니다.

EC2 인스턴스를 중지 및 시작하는 Lambda 함수 생성

1.    AWS Lambda 콘솔에서 [함수 생성(Create function)]을 선택합니다.

2.    [새로 작성(Author from scratch)]을 선택합니다.

3.    기본 정보 아래에서 다음을 추가합니다.
함수 이름에서는 EC2 인스턴스를 중지하는 데 사용되는 함수로 식별하는 이름을 입력합니다. 예를 들어, "StopEC2Instances"를 입력합니다.
런타임(Runtime)에서 Python 3.9를 선택합니다.
권한(Permissions)에서 기본 실행 역할 변경(Change default execution role)을 확장합니다.
실행 역할(Execution role) 아래에서 기존 역할 사용(Use an existing role)을 선택합니다.
[기존 역할] 아래에서 이미 생성한 IAM 역할을 선택합니다.

4.    [함수 생성]을 선택합니다.

5.    코드(Code)코드 소스(Code source)에서 다음 코드를 복사하여 코드 편집기의 편집기 창에 붙여 넣습니다(lambda_function). 이 코드는 사용자가 식별한 EC2 인스턴스를 중지시킵니다.

예제 함수 코드 - EC2 인스턴스 중지

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

중요: 리전에서 ‘us-west-1’을 사용자의 인스턴스가 위치하는 AWS 리전으로 대체하세요. 인스턴스에서 예제 EC2 인스턴스 ID를 중지 및 시작할 특정 인스턴스의 ID로 대체하십시오.

6.    배포(Deploy)를 선택합니다.

7.    구성(Configuration) 탭에서 일반 구성(General configuration), 편집(Edit)을 선택합니다. 제한 시간(Timeout)을 10초로 설정한 다음 저장(Save)을 선택합니다.

참고: 각자의 사용 사례에 필요한 대로 Lambda 함수 설정을 구성합니다. 예를 들어, 여러 인스턴스를 중지 및 시작하려는 경우 제한 시간(Timeout)메모리(Memory)에 다른 값을 입력해야 할 수도 있습니다.

8.    1-7단계를 반복하여 다른 함수를 생성합니다. 다음 작업을 다른 방식으로 수행하면 이 함수가 사용자의 EC2 인스턴스를 시작할 수 있습니다.

3단계에서 이전에 사용한 것과 다른 함수 이름을 입력합니다. 예를 들어, "StartEC2Instances"를 입력합니다.
5단계에서 다음 코드를 복사하여 코드 편집기의 편집 창에 붙여넣습니다(lambda_function).

예제 함수 코드—EC2 인스턴스 시작

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

중요: 리전인스턴스에서는 EC2 인스턴스를 중지하기 위해 코드에 사용한 값과 동일한 값을 사용합니다.

Lambda 함수 테스트

1.    AWS Lambda 콘솔에서 [함수(Functions)]를 선택합니다.

2.    생성한 함수 중 하나를 선택합니다.

3.    코드(Code) 탭을 선택합니다.

4.    코드 소스(Code source) 섹션에서 테스트(Test)를 선택합니다.

5.    테스트 이벤트 구성(Configure test event) 대화 상자에서 새 테스트 이벤트 생성(Create new test event)을 선택합니다.

6.    이벤트 이름(Event name)을 입력합니다. 그런 다음 [생성]을 선택합니다.

참고: 테스트 이벤트의 JSON 코드는 함수가 사용하지 않기 때문에 변경할 필요가 없습니다.

7.    테스트(Test)를 선택하여 함수를 실행합니다.

8.    생성한 다른 함수에 대해서도 1~6단계를 반복합니다.

팁: 테스트 전후에 EC2 인스턴스의 상태를 검사하여 함수가 예상한 대로 작동하는지 확인할 수 있습니다.

Lambda 함수를 트리거하는 EventBridge 규칙 생성

1.    EventBridge 콘솔을 엽니다.

2.    [규칙 생성]을 선택합니다.

3.    규칙의 이름(Name)을 입력합니다(예: "StopEC2Instances"). 설명(Description)을 입력할 수도 있습니다(선택 사항).

4.    패턴 정의(Define pattern)에서 일정(Schedule)을 선택합니다.

5.    다음 중 하나를 수행합니다.

정액 요금 기준에서는 시간 간격을 분, 시간 또는 일 단위로 입력합니다.
[Cron 표현식]에는 인스턴스를 중지할 시간을 Lambda에 알리는 표현식을 입력합니다. 표현식 구문에 대한 자세한 내용은 규칙에 대한 예약 표현식을 참조하세요.
참고
: Cron 표현식은 UTC 기준으로 평가됩니다. 선호하는 시간대에 맞추어 표현식을 조정하세요.

6.    대상 선택(Select targets)대상(Target) 드롭다운 메뉴에서 Lambda 함수를 선택합니다.

7.    함수(Function)에서 EC2 인스턴스를 중지하는 함수를 선택합니다.

8.    아래로 스크롤하고 생성(Create)을 선택합니다.

9.    1-8단계를 반복하여 EC2 인스턴스를 시작할 규칙을 생성합니다. 다음 작업을 다른 방식으로 수행합니다.

규칙의 이름을 입력합니다(예: "StartEC2Instances").
(선택 사항) 설명(Description)을 입력합니다(예: "매일 아침 7시에 EC2 인스턴스 시작)".
5단계의 Cron 표현식(Cron expression)에서는 인스턴스를 시작할 시간을 Lambda에 알리는 표현식을 입력합니다.
7단계의 함수(Function)에서는 EC2 인스턴스를 시작하는 함수를 선택합니다.

(선택 사항) AWS Instance Scheduler를 사용하여 절차 자동화

자세한 내용은 AWS 인스턴스 시작 및 중지 자동화를 참조하세요.