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

4분 분량
0

예정된 시간에 테스트 또는 중요하지 않은 AWS Elastic Beanstalk 환경을 종료하고 다시 빌드하고 싶습니다.

간략한 설명

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

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

중요: 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.    정책을 사용하여 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 boto3envid=['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.9 런타임과 호환됩니다.

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

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

4.    Elastic Beanstalk 환경을 종료하려면 다음 코드를 텍스트 편집기에 붙여넣습니다.

import boto3envid=['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 Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 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.9 --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.9 --region us-west-2

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

CloudWatch 이벤트 규칙을 생성하여 Lambda 함수를 시작하세요.

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

aws events put-rule --name "StartLambdaFunction" --schedule-expression "cron(0 8 * * ? *)" --region us-west-2aws 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.amazonaws.com)를 신뢰하고 규칙에 대한 권한 범위를 확장하려면 다음 명령을 실행합니다.

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 환경이 위치한 AWS 리전으로 바꿉니다.

관련 정보

Elastic Beanstalk 템플릿 조각

Lambda 배포 패키지

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