매일 주어진 시간에 AWS EC2 인스턴스를 시작하고 중지하는 쉬운 방법이 있습니까? 이를 통해 개발 및 테스트 서버에 많은 돈을 절약 할 수 있습니다.
답변
최신 정보
AWS는 해당 페이지에서 링크 된 전체 구성 안내서 를 포함 하여 ” 인스턴스 스케줄러 ” 라는 도구를 출시했습니다 . 아래에 설명하는 EC2 스케줄러의 기능이 몇 가지 더 개선 된 것으로 보이지만 본질적으로 동일합니다.
아래 가이드는 여전히 작동하지만 인스턴스 설치 프로그램에서 새 설치를 확인하는 것이 좋습니다.
원본 게시물
AWS에는 EC2 인스턴스 시작 및 중지를 매우 유연하게 제어 할 수있는 EC2 스케줄러 라는 도구 가 있습니다.
이 도구를 사용하면 도구를 설정할 때 기본 시작 및 중지 시간을 정의 할 수 있으며 나중에 변경할 수 있습니다. 제어 할 인스턴스를 선택할 수 있으며 태그를 사용하여 각 인스턴스에 대해 다른 시작 및 중지 시간을 지정할 수 있습니다.
훌륭한 도구이지만 문서는 다소 모호하고 혼동됩니다. 이 도구는 문서를 작성한 기술자가 아닌 도구를 작성한 엔지니어가 문서를 작성한 것과 같습니다.
참고 : 피드백이나 수정 사항이 있으면 의견을 보내주십시오. 이 질문에 근거한 질문이 있으면 자신의 질문을 시작하십시오.
EC2 스케줄러 란?
이 도구는 Cloudwatch Events 및 DynamoDB와 함께 작동하는 Lambda 함수입니다. 필요한 IAM 역할 및 정책을 설정하는 Cloudformation 템플릿을 사용하여 배포됩니다. 여기서 아키텍처에 대해 읽을 수 있습니다 .
전개
이 페이지 로 가서 “시작 솔루션”을 클릭하여 시작 하십시오 . 현재 직접 링크는 여기 있지만 변경 될 수 있습니다.
콘솔 맨 위에서 자원을 배치 할 리젼을 선택하십시오. 이 스크립트는 모든 리전에서 EC2 인스턴스를 제어하지만 한 리전에서 실행됩니다.
EC2 인스턴스 태깅
이것은 여기 의 문서 에서 다루고 있지만, 간단하지는 않습니다.
인스턴스에 태그를 지정하여 시작 및 중지 할 인스턴스를 제어합니다.
가장 간단한 경우에는 스케줄에 따라 시작 및 중지하려는 각 EC2 인스턴스에 태그를 지정해야합니다. 콘솔에서 EC2 인스턴스를 찾으려면 태그를 클릭하고이 태그를 생성하십시오.
복사하여 붙여 넣기를 활성화하려면
- 키 : 스케줄러 : ec2-startstop
- 값 : true
다른 스케줄에서 특정 인스턴스를 시작 및 중지하려면 태그 키 및 값에 추가 정보를 추가하십시오. 예를 들어 인스턴스가 1500 UTC에서 시작하여 화요일, 목요일 및 금요일에 2400 UTC에 중지하려면 다음을 입력하십시오.
키 : 스케줄러 : ec2-startstop : late 값 : 1500; 2400; utc; 화, 목, 금
“late”라는 단어는 모든 문자열 일 수 있으며 “late”는 특별한 의미가 없습니다.
이 도구를 사용하여 UTC를 현지 시간으로 변환 할 수 있습니다 .
태그 편집기 를 사용하여 인스턴스에 대량 태그를 지정할 수 있습니다 . 이렇게하면 대량 태그를보다 쉽게 설정할 수 있으며, 이는 개발, 테스트 및 프로덕션에 대해 다른 설정을하는 데 유용 할 수 있습니다. 나는 당신이 생산에 이것을 사용할지 의심합니다.
CloudFormation 파라미터
CloudFormation 템플릿을 실행할 때 많은 매개 변수를 입력해야합니다. 대부분 기본값을 그대로 둘 수 있습니다. 가장 중요한 매개 변수는 다음과 같습니다.
- 스택 이름 : 원하는대로 호출하십시오. CloudFormation에서 불리는 것입니다.
- 사용자 정의 태그 이름 : EC2 인스턴스에 대해 태그의 “키”입니다. 적절한 이유가 있거나 여러 번 설치해야하는 경우가 아니면 기본값으로 두십시오.
- 기본 시작 / 중지 시간 : 인스턴스를 시작 및 중지하는 기본 UTC 시간
- DynamoDB : 설정이 DynamoDB에 저장됩니다. 테이블 이름 등을 변경할 수 있습니다. DynamoDB 프리 티어가 만료되지 않기 때문에 대부분의 사람들은 청구되지 않을 것입니다.
- (두 번째 화면) 권한-이것은 빨간 청어입니다. 아래 섹션을 참조하십시오. EC2 스케줄러를 설정할 때 기본값으로 유지하고 관리자로 실행하십시오.
- 알림 옵션 : SNS 알림을 설정하여 작동하는지 확인할 수있는 유용한 방법을 찾았습니다. 나는 그들을 비활성화하는 방법을 알아내는 데 시간을 소비하지 않고 Cloudformation 템플릿을 다시 실행하여 다시 설치하기 위해 삭제했습니다.
권한, 정책 및 역할
CloudFormation 템플릿의 권한 / IAM 역할 섹션은 빨간색 청어입니다. 즉, 크게 관련이 없습니다. CloudFormation 스크립트를 실행하는 데 사용되는 역할 만 지정하며, 생성 된 리소스 또는 람다 함수가 실행될 때 사용되는 역할에는 영향을 미치지 않습니다. 돌이켜 보면 이것은 분명하지만 내가 시작했을 때 분명하지 않았습니다.
동일한 역할 및 인라인 권한으로이 스크립트를 실행하는 역할이 IAM 내에 생성됩니다. Lambda 함수는 스크립트가 생성하는 “ec2 스케줄러 역할”을 사용하여 실행됩니다.
다른 사람에게 도움이 될 수 있도록 아래 정책을 포함 시켰습니다.
CloudWatch 이벤트 및 지표
Lambda 함수의 로그를 보려면 Cloudwatch 이벤트로 이동하십시오. 로깅은 꽤 좋습니다. 메트릭도 있으므로 실행시기, 실행 시간 등을 확인할 수 있습니다.
추가
람다 함수의 코드는 Github에서 사용할 수 있습니다 .
정책
이들은 일반적으로 필요하지 않지만 누군가를 위해 포함될 수 있으므로 포함시킬 것입니다.
IAM 역할 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeTags",
"iam:CreateRole",
"iam:GetRole",
"iam:PassRole",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:DeleteRole",
"dynamodb:*",
"lambda:*",
"SNS:Publish",
"events:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "S3:GetObject",
"Resource": [
"arn:aws:s3:::solutions-us-west-2",
"arn:aws:s3:::solutions-us-west-2/*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:StopInstances",
"ec2:StartInstances"
],
"Resource": [
"arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
]
}
]
}
IAM 역할에 대한 트러스트 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"cloudformation.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
답변
인스턴스를 시작하고 중지하려면 Lambda 서비스를 사용하는 또 다른 방법이 있습니다. 특정 인스턴스 ID를 제어한다고 가정합니다. 쉼표로 구분 된 더 많은 ID를 추가하여 여러 인스턴스를 제어 할 수 있습니다. (예 : ‘i-3453453’, ‘i-45656745’). AWS 콘솔 인스턴스 섹션에서 인스턴스의 ID를 찾을 수 있습니다.
Lambda 콘솔에서
- AWS Lambda 콘솔을 열고 Create function을 선택하십시오.
- 처음부터 작성자를 선택하십시오.
- “StopEC2Instances”와 같은 기능의 이름을 입력하십시오.
- 런타임에서 Python 2.7을 선택하십시오.
- 역할 드롭 다운 메뉴를 펼치고 사용자 정의 역할 작성을 선택하십시오. 브라우저에서 새 탭 또는 창이 열립니다.
- IAM 역할 드롭 다운 메뉴에서 새 IAM 역할 생성을 선택하고 “lambda_start_stop_ec2″와 같은 역할 이름을 입력하십시오.
- 정책 문서보기, 편집을 선택한 다음 설명서를 읽으라는 메시지가 표시되면 확인을 선택하십시오. 정책의 모든 텍스트를 다음으로 바꾸십시오.
아래 코드
{
"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": "*"
}
]
}
- 허용을 선택하여 역할 생성을 마치고 AWS Lambda 콘솔로 돌아갑니다.
- 인스턴스를 중지하려면 기능 코드 편집기의 모든 텍스트를 다음으로 바꾸십시오.
아래 코드
import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name=region)
ec2.stop_instances(InstanceIds=instances)
print 'stopped your instances: ' + str(instances)
리전 및 인스턴스 값을 자신의 값으로 바꾸십시오.
- 런타임 드롭 다운 메뉴에서 Python2.7을 선택하십시오.
- 기본 설정에서 시간 초과 기능에 10 초를 입력하십시오.
- 저장을 선택하십시오.
- 모든 단계를 반복하여 인스턴스를 시작하는 다른 함수를 작성하고이 Python 스크립트를 사용하여 모두 시작하십시오.
아래 코드
import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name=region)
ec2.start_instances(InstanceIds=instances)
print 'started your instances: ' + str(instances)
기능 예약
여기에서는 밤에 Lambda 기능을 트리거 할 CloudWatch 이벤트를 생성합니다
- Amazon CloudWatch 콘솔을 엽니 다.
- 이벤트를 선택한 다음 규칙 생성을 선택하십시오.
- 이벤트 소스에서 스케줄을 선택하십시오.
- Lambda에게 인스턴스 중지시기를 알려주는 시간 간격 또는 cron 표현식을 입력하십시오. 올바른 구문에 대한 자세한 내용은 규칙에 대한 표현식 식 구문을 참조하십시오.
참고 : Cron 표현식은 UTC로 평가됩니다. 원하는 시간대에 맞게 식을 조정하십시오. 다음은 매일 08:00 GMT / UTC에서 함수를 실행하는 예제입니다.
0 08 * * ? *
- 대상 추가를 선택한 다음 Lambda 함수를 선택하십시오.
- 함수에서 인스턴스를 중지하는 Lambda 함수를 선택하십시오.
- 세부 사항 구성을 선택하십시오.
- 제공된 필드에 다음 정보를 입력하십시오. 이름에 “StopEC2Instances”와 같은 의미있는 이름을 입력하십시오. 설명에 “매일 매일 밤 EC2 인스턴스 중지”와 같은 의미있는 설명을 추가하십시오. 상태에 대해 사용을 선택하십시오.
- 규칙 생성을 선택하십시오.
아침에 인스턴스를 다시 시작하려면이 단계를 반복하고 원하는 시작 시간을 사용하십시오. 기능이 실패 할 때마다 메일 메시지를 보내려면 SNS 주제를 설정하고 Lmbda 기능 작성 창의 디버깅에서 메시지 전송을 구성 할 수 있습니다.
이 모든 소스는 여기에서 찾을 수 있습니다 .AWS documentation