일정에 따라 Elastic Beanstalk 환경을 중지하고 다시 시작하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 11월 8일

테스트나 중요하지 않은 AWS Elastic Beanstalk 환경을 예약된 시간에 종료하고 다시 빌드하려면 어떻게 해야 합니까?

간략한 설명

API 호출 terminate-environmentrebuild-environment를 사용하여 Elastic Beanstalk 환경을 중지하고 다시 시작할 수 있습니다. 종료된 환경은 종료 후 6주(42일) 이내에만 재구축할 수 있습니다.

이러한 호출을 일정에 따라 수행하려면 Amazon CloudWatch Events에서 매일 특정 시간에 AWS Lambda 함수를 트리거하는 이벤트를 구성합니다. 그런 다음, Elastic Beanstalk API를 호출하도록 해당 Lambda 함수를 구성합니다.

중요: Elastic Beanstalk 환경이나 해당 인스턴스에 대해 수행한 대역 외 변경 사항은 환경이 종료된 후에 유지되지 않습니다. 환경을 변경할 경우 이 점을 고려하십시오. 또한 종료 시간을 기록하고, 이 시간 전에 인스턴스를 사용하는 모든 작업을 완료합니다. 사용자가 해당 인스턴스에 연결되어 있지 않더라도 인스턴스는 예약된 시간에 종료됩니다.

​해결 방법

계속하기 전에 Elastic Beanstalk 환경의 ID(EnvironmentId)를 기록합니다.

중요: 다음 해결 방법은 Elastic Beanstalk 환경 및 리소스에서 서비스가 생성한 모든 태그를 제거할 수 있습니다.

Lambda 함수에 대한 IAM 역할 생성

1.    Lambda 함수에 대해 AWS Identity and Access Management(IAM) 역할에 다음 인라인 정책(예: Lambda.json)을 생성합니다. 다음 예제를 참조하십시오.

$ cat Lambda.json 
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com"
        ]
      },
      "Action": [
        "sts:AssumeRole"
      ]
    }
  ]
}

2.    다음과 같이 1단계에서 생성한 정책을 사용하여 IAM 역할을 생성합니다.

aws iam create-role --role-name elasticbeanstalk-lambda-role --assume-role-policy-document file://Lambda.json

3.    IAM 역할의 Amazon 리소스 이름(ARN)을 기록합니다.

4.    IAM 역할에 다음과 같은 관리형 정책을 연결합니다.

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AWSElasticBeanstalkFullAccess --role-name elasticbeanstalk-lambda-role

Lambda 함수 배포 패키지 생성

1.    Elastic Beanstalk 환경을 다시 시작하려면 텍스트 편집기에 다음 코드를 복사합니다.

import boto3
envid=['e-awsenvidid']
client = boto3.client('elasticbeanstalk')
def handler(event, context):
    try:
         for appid in range(len(envid)):
             response = client.rebuild_environment(EnvironmentId=str(envid[appid].strip()))
             if response:
                 print('Restore environment %s' %str(envid[appid]))
             else:
                 print('Failed to Restore environment %s' %str(envid[appid]))

    except Exception as e:
        print(e)

중요: e-awsenvidid를 Elastic Beanstalk의 환경 ID로 바꿉니다.

참고: 위의 코드 예제는 Python 3.6 런타임과 호환됩니다.

2.    코드를 Python 파일로 저장합니다(예: StartElasticBeanstalk.py).

3.    Python 파일을 ZIP 파일로 압축합니다(예: StartElasticBeanstalk.zip).

4.    Elastic Beanstalk 환경을 종료하려면 텍스트 편집기에 다음 코드를 복사합니다.

import boto3
envid=['e-awsenvidid']
client = boto3.client('elasticbeanstalk')
def handler(event, context):
    try:
         for appid in range(len(envid)):
             response = client.terminate_environment(EnvironmentId=str(envid[appid].strip()))
             if response:
                 print('Terminating environment %s' %str(envid[appid]))
             else:
                 print('Failed to Terminate environment %s' %str(envid[appid]))
             
    except Exception as e:
        print(e)

중요: e-awsenvidid를 Elastic Beanstalk의 환경 ID로 바꿉니다.

5.    코드를 Python 파일로 저장합니다(예: StopElasticBeanstalk.py).

6.    Python 파일을 ZIP 파일로 압축합니다(예: StopElasticBeanstalk.zip).

Lambda 함수 생성

Elastic Beanstalk 환경을 중지하고 다시 시작하는 Lambda 함수를 생성하려면 AWS 명령줄 인터페이스(AWS CLI)에서 다음 명령을 실행합니다.

aws lambda create-function \
--function-name StartElasticBeanstalk \
--zip-file fileb://file-path/StartElasticBeanstalk.zip \
--role arn:aws:iam::012345678912:role/elasticbeanstalk-lambda-role \
--handler StartElasticBeanstalk.handler \
--runtime python3.6 --region us-west-2

aws lambda create-function \
--function-name StopElasticBeanstalk \
--zip-file fileb://file-path/StopElasticBeanstalk.zip \
--role arn:aws:iam::012345678912:role/elasticbeanstalk-lambda-role \
--handler StopElasticBeanstalk.handler \
--runtime python3.6 --region us-west-2

중요: 이 단계와 다른 단계에서는 us-west-2를 Elastic Beanstalk 환경이 위치한 리전으로 바꿔야 합니다. 또한 배포 패키지(StartElasticBeanstalk.zip 또는 StopElasticBeanstalk.zip)와 IAM 역할의 ARN을 각 명령에 파라미터로 제공합니다.

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

1.    Lambda 함수를 시작하고 중지하려면 다음 명령을 실행합니다.

aws events put-rule --name "StartLambdaFunction" --schedule-expression "cron(0 8 * * ? *)" --region us-west-2
aws events put-rule --name "StopLambdaFunction" --schedule-expression "cron(0 18 * * ? *)" --region us-west-2

참고: -schedule-expression 속성에는 cron 구문이 필요합니다. 필요에 따라 이 속성의 값을 업데이트해야 합니다.

2.    CloudWatch Events 서비스 보안 주체(events.amazonaws.com)를 신뢰하고 권한 범위를 1단계에서 만든 규칙으로 확장하려면 다음 add-permission 명령을 실행합니다.

aws lambda add-permission \
--function-name StartElasticBeanstalk \
--statement-id StartLambdaFunction \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-west-2:012345678912:rule/StartLambdaFunction --region us-west-2

aws lambda add-permission \
--function-name StopElasticBeanstalk \
--statement-id StopLambdaFunction \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-west-2:012345678912:rule/StopLambdaFunction --region us-west-2

3.    규칙이 일정에 따라 실행되도록 생성한 Lambda 함수를 이 규칙에 추가하려면 다음 put-targets 명령을 실행합니다.

aws events put-targets --rule StartLambdaFunction --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:012345678912:function:StartElasticBeanstalk" --region us-west-2

aws events put-targets --rule StopLambdaFunction --targets "Id"="2","Arn"="arn:aws:lambda:us-west-2:012345678912:function:StopElasticBeanstalk" --region us-west-2

중요: 각 명령의 ARN을 IAM 역할의 ARN으로 바꿉니다.

AWS CloudFormation 템플릿 사용

AWS CloudFormation 템플릿을 생성하여 이 해결 방법의 모든 작업을 수행할 수 있습니다. Lambda IAM 실행 역할을 생성하고, Lambda 함수를 시작하며, Lambda 함수를 중지한 후 CloudWatch 이벤트를 트리거하도록 템플릿을 구성할 수 있습니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?