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

최종 업데이트 날짜: 2020년 10월 21일

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

간략한 설명

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

이 설정을 진행하려면 다음을 수행하십시오.

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

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

3.    예약에 따라 함수를 트리거하는 CloudWatch Events 규칙을 생성합니다. 예를 들어, 야간에 EC2 인스턴스를 중지했다가 아침에 다시 시작하는 규칙을 생성할 수 있습니다.

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

해결 방법

중지 및 시작할 EC2 인스턴스의 ID를 수집한 후에 다음 지침을 따릅니다.

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 역할을 생성합니다. 권한 정책을 연결할 때, 생성한 IAM 정책을 검색하여 선택합니다.

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

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

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

3.    기본 정보 아래에서 다음을 추가합니다.
함수 이름에서는 EC2 인스턴스를 중지하는 데 사용되는 함수로 식별하는 이름을 입력합니다. 예: ‘StopEC2Instances’.
런타임에서는 [Python 3.7]을 선택합니다.
[권한] 아래에서 [실행 역할 선택 또는 생성]을 확장합니다.
[실행 역할] 아래에서 [기존 역할 사용]을 선택합니다.
[기존 역할] 아래에서 이미 생성한 IAM 역할을 선택합니다.

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

5.    코드를 복사한 다음, 함수 코드 아래에 있는 코드 편집기의 편집 창(lambda_function)에 붙여넣습니다. 이 코드는 사용자가 식별한 EC2 인스턴스를 중지시킵니다.

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

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))

6.    [기본 설정] 아래에서 시간 제한을 10초로 설정합니다.

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

7.    [저장(Save)]을 선택합니다.

8.    1-7단계를 반복하여 다른 함수를 생성합니다. 다음 작업을 다른 방식으로 수행하면 이 함수가 사용자의 EC2 인스턴스를 시작할 수 있습니다.
3단계에서 EC2 인스턴스를 시작하는 데 사용되는 함수로 식별하는 함수 이름을 입력합니다. 예: ‘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))

Lambda 함수 테스트

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

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

3.    [작업]을 선택한 다음, [테스트]를 선택합니다.

4.    테스트 이벤트 구성 대화 상자에서 [새 테스트 이벤트 생성]을 선택합니다.

5.    이벤트 이름을 입력한 다음, [생성]을 선택합니다.

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

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

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

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

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

1.    Amazon CloudWatch 콘솔을 엽니다.

2.    왼쪽 탐색 창의 [이벤트] 아래에서 [규칙]을 선택합니다.

3.    규칙 생성(Create rule)을 선택합니다.

4.    [이벤트 소스] 아래에서 [예약]을 선택합니다.

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

6.    [대상] 아래에서 [대상 추가]를 선택합니다.

7.    [Lambda 함수]를 선택합니다.

8.    함수에서 EC2 인스턴스를 중지하는 함수를 선택합니다.

9.    [Configure details]를 선택합니다.

10.    규칙 정의 아래에서 다음을 수행합니다.
이름에서 ‘StopEC2Instances’와 같이 규칙을 식별하기 위한 이름을 입력합니다.
설명에서 규칙을 설명합니다(선택 사항). 예: ‘Stops EC2 instances every night at 10 PM.’
상태에서 [활성화] 확인란을 선택합니다.

11.    규칙 생성(Create rule)을 선택합니다.

12.    1-11단계를 반복하여 EC2 인스턴스를 시작할 규칙을 생성합니다. 다음 작업을 다른 방식으로 수행합니다.
5단계의 Cron 표현식에서는 인스턴스를 시작할 시간을 Lambda에 알리는 표현식을 입력합니다.
8단계의 함수에서는 EC2 인스턴스를 시작하는 함수를 선택합니다.
10단계에서, [Rule definition] 아래에 "StartEC2Instances"와 같은 [Name]을 입력하고 선택적으로 "매일 아침 오전 6시에 EC2 인스턴스 시작”과 같은 [Description]을 입력합니다.