예약된 시간에 테스트 또는 중요하지 않은 AWS Elastic Beanstalk 환경을 중지하고 다시 시작하려면 어떻게 해야 하나요?

4분 분량
0

예약된 시간에 테스트 또는 중요하지 않은 AWS Elastic Beanstalk 환경을 종료하고 다시 구축하려고 합니다.

간략한 설명

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

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

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

참고: 다음 해결 방법으로 모든 작업을 수행하도록 AWS CloudFormation 템플릿을 생성구성할 수 있습니다. 템플릿에서 Lambda에 대한 AWS Identity and Access Management(IAM) 실행 역할을 생성해야 합니다. 그런 다음, 템플릿에서 Lambda 함수를 시작하고 Lambda 함수를 중지한 후 마지막으로 CloudWatch 이벤트를 트리거해야 합니다.

해결 방법

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

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

Lambda 함수에 대한 IAM 역할 생성

1.    Lambda 함수의 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/AdministratorAccess-AWSElasticBeanstalk --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 함수 생성

참고: AWS 명령줄 인터페이스(AWS CLI) 명령줄을 실행할 때 오류가 발생할 경우 AWS CLI의 가장 최신 버전을 사용하고 있는지 확인하세요.

Elastic Beanstalk 환경을 중지하고 다시 시작하는 Lambda 함수를 생성하려면 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 환경이 위치한 AWS 리전으로 바꾸십시오. 또한 배포 패키지(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 구문이 필요합니다. 필요에 따라 --schedule-expression 속성의 값을 업데이트합니다. us-west-2를 Elastic Beanstalk 환경이 위치한 AWS 리전으로 바꾸십시오.

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

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

참고: us-west-2를 Elastic Beanstalk 환경이 위치한 AWS 리전으로 바꿉니다.

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으로 바꿉니다. us-west-2를 Elastic Beanstalk 환경이 위치한 리전으로 바꿉니다.


관련 정보

Elastic Beanstalk 템플릿 코드 조각

Lambda 배포 패키지

AWS 공식
AWS 공식업데이트됨 9달 전
댓글 없음