예약된 시간에 테스트 또는 중요하지 않은 AWS Elastic Beanstalk 환경을 중지하고 다시 시작하려면 어떻게 해야 하나요?
예약된 시간에 테스트 또는 중요하지 않은 AWS Elastic Beanstalk 환경을 종료하고 다시 구축하려고 합니다.
간략한 설명
API 호출 terminate-environment 및 rebuild-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 환경이 위치한 리전으로 바꿉니다.
관련 정보
관련 콘텐츠
- 질문됨 4달 전lg...
- 질문됨 2달 전lg...
- 질문됨 22일 전lg...
- 질문됨 17일 전lg...
- AWS 공식업데이트됨 4년 전