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

최종 업데이트 날짜: 2019년 6월 28일

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

간략한 설명

참고: 이 예제는 간단한 해결 방법에 대한 설정을 보여줍니다. 보다 강력한 해결 방법을 원하는 경우 AWS 인스턴스 스케줄러를 사용하십시오.

이 설정의 경우 다음 작업을 수행합니다.

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.    Lambda 콘솔에서 [Create function]을 선택합니다.

2.    [Author from scratch]를 선택합니다.

3.    [Basic information]에서 다음을 추가합니다.
[unction name]에 EC2 인스턴스를 중지하는 데 사용할 함수로 표시될 이름을 입력합니다. 예를 들어, "StopEC2Instances"를 입력합니다.
[Runtime]에서 [Python 2.7]을 선택합니다.
[Permissions]에서 [Choose or create an execution role]을 확장합니다.
[Execution role]에서 [Use an existing role]을 선택합니다.
[Existing role]에서, 생성한 IAM 역할을 선택합니다.

4.    [Create function]을 선택합니다.

5.    이 코드를 복사하여 [Function code] 아래 코드 편집기의 편집기 창에 붙여넣습니다(lambda_function). 이 코드는 지정한 EC2 인스턴스를 중지합니다.

참고: region에서 "us-west-1"을 해당 인스턴스가 존재하는 AWS 리전으로 대체합니다. instances에서는 EC2 인스턴스 ID 예제를 중지 및 시작할 특정 인스턴스를 대체합니다.

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']

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

6.    [Basic settings]에서 [Timeout]을 10초로 설정합니다.

참고: 필요에 따라 사용 사례에 맞게 Lambda 함수 설정을 구성하십시오. 예를 들어, 여러 인스턴스를 중지 및 시작하려는 경우 제한 시간메모리에 서로 다른 값을 사용해야 할 수 있습니다.

7.    [Save]를 선택합니다.

8.    1-7단계를 반복하여 다른 함수를 생성합니다. 이 함수가 EC2 인스턴스를 시작하도록 조금 다르게 다음을 수행합니다.
3단계에서, EC2 인스턴스를 시작하는 데 사용될 함수의 [Function name]을 입력합니다. 예를 들어, "StartEC2Instances"를 입력합니다.
5단계에서, 이 코드를 복사하여 코드 편집기의 편집기 창에 붙여넣습니다(lambda_function).

참고: regioninstances에 대해 EC2 인스턴스를 중지하는 코드에 사용했던 것과 동일한 값을 사용합니다.

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']

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

Lambda 함수 테스트

1.    Lambda 콘솔에서 [Functions]를 선택합니다.

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

3.    [Actions]를 선택하고 [Test]를 선택합니다.

4.    [Configure test event] 대화 상자에서 [Create new test event]를 선택합니다.

5.    [Event name]을 입력하고 [Create]를 선택합니다.

참고: 테스트 이벤트에 대해 JSON 코드는 변경하지 않아도 됩니다. 함수에서는 사용하지 않습니다.

6.    [Test]를 선택하여 함수를 실행합니다.

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

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

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

1.    CloudWatch 콘솔을 엽니다.

2.    왼쪽 탐색 창의 [Events]에서 [Rules]를 선택합니다.

3.    [Create rule]을 선택합니다.

4.    [Event Source]에서 [Schedule]을 선택합니다.

5.    다음 중 하나를 수행합니다.
[Fixed rate of]에 시간 간격(분, 시간 또는 일)을 입력합니다.
[Cron expression]에 인스턴스를 중지할 시기를 Lambda에 알려주는 표현식을 입력합니다. 표현식 구문에 대한 자세한 내용은 규칙에 대한 예약 표현식을 참조하십시오.
참고: Cron 표현식은 UTC로 평가됩니다. 기본 시간대로 표현식을 조정해야 합니다.

6.    [Targets]에서 [Add target]을 선택합니다.

7.    [Lambda function]을 선택합니다.

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

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

10.    [Rule definition]에서 다음을 수행합니다.
[Name]에 규칙을 식별하는 이름(예: "StopEC2Instances")을 입력합니다.
(선택 사항) [Description]에서 이벤트를 설명합니다. 예를 들어, "매일 밤 오후 10시에 EC2 인스턴스 중지"라고 입력할 수 있습니다.
[State]에서 [Enabled] 확인란을 선택합니다.

11.    [Create rule]을 선택합니다.

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