답변:
최신 정보
AWS는 해당 페이지에서 링크 된 전체 구성 안내서 를 포함 하여 " 인스턴스 스케줄러 " 라는 도구를 출시했습니다 . 아래에 설명하는 EC2 스케줄러의 기능이 몇 가지 더 개선 된 것으로 보이지만 본질적으로 동일합니다.
아래 가이드는 여전히 작동하지만 인스턴스 설치 프로그램에서 새 설치를 확인하는 것이 좋습니다.
원본 게시물
AWS에는 EC2 인스턴스 시작 및 중지를 매우 유연하게 제어 할 수있는 EC2 스케줄러 라는 도구 가 있습니다.
이 도구를 사용하면 도구를 설정할 때 기본 시작 및 중지 시간을 정의 할 수 있으며 나중에 변경할 수 있습니다. 제어 할 인스턴스를 선택할 수 있으며 태그를 사용하여 각 인스턴스에 대해 다른 시작 및 중지 시간을 지정할 수 있습니다.
훌륭한 도구이지만 문서는 다소 모호하고 혼동됩니다. 이 도구는 문서를 작성한 기술자가 아닌 도구를 작성한 엔지니어가 문서를 작성한 것과 같습니다.
참고 : 피드백이나 수정 사항이 있으면 의견을 보내주십시오. 이 질문에 근거한 질문이 있으면 자신의 질문을 시작하십시오.
EC2 스케줄러 란?
이 도구는 Cloudwatch Events 및 DynamoDB와 함께 작동하는 Lambda 함수입니다. 필요한 IAM 역할 및 정책을 설정하는 Cloudformation 템플릿을 사용하여 배포됩니다. 여기서 아키텍처에 대해 읽을 수 있습니다 .
전개
이 페이지 로 가서 "시작 솔루션"을 클릭하여 시작 하십시오 . 현재 직접 링크는 여기 있지만 변경 될 수 있습니다.
콘솔 맨 위에서 자원을 배치 할 리젼을 선택하십시오. 이 스크립트는 모든 리전에서 EC2 인스턴스를 제어하지만 한 리전에서 실행됩니다.
EC2 인스턴스 태깅
이것은 여기 의 문서 에서 다루고 있지만, 간단하지는 않습니다.
인스턴스에 태그를 지정하여 시작 및 중지 할 인스턴스를 제어합니다.
가장 간단한 경우에는 스케줄에 따라 시작 및 중지하려는 각 EC2 인스턴스에 태그를 지정해야합니다. 콘솔에서 EC2 인스턴스를 찾으려면 태그를 클릭하고이 태그를 생성하십시오.
복사하여 붙여 넣기를 활성화하려면
다른 스케줄에서 특정 인스턴스를 시작 및 중지하려면 태그 키 및 값에 추가 정보를 추가하십시오. 예를 들어 인스턴스가 1500 UTC에서 시작하여 화요일, 목요일 및 금요일에 2400 UTC에 중지하려면 다음을 입력하십시오.
키 : 스케줄러 : ec2-startstop : late 값 : 1500; 2400; utc; 화, 목, 금
"late"라는 단어는 모든 문자열 일 수 있으며 "late"는 특별한 의미가 없습니다.
이 도구를 사용하여 UTC를 현지 시간으로 변환 할 수 있습니다 .
태그 편집기 를 사용하여 인스턴스에 대량 태그를 지정할 수 있습니다 . 이렇게하면 대량 태그를보다 쉽게 설정할 수 있으며, 이는 개발, 테스트 및 프로덕션에 대해 다른 설정을하는 데 유용 할 수 있습니다. 나는 당신이 생산에 이것을 사용할지 의심합니다.
CloudFormation 파라미터
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를 찾을 수 있습니다.
아래 코드
{
"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": "*"
}
]
}
아래 코드
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)
아래 코드
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 이벤트를 생성합니다
참고 : Cron 표현식은 UTC로 평가됩니다. 원하는 시간대에 맞게 식을 조정하십시오. 다음은 매일 08:00 GMT / UTC에서 함수를 실행하는 예제입니다.
0 08 * * ? *
아침에 인스턴스를 다시 시작하려면이 단계를 반복하고 원하는 시작 시간을 사용하십시오. 기능이 실패 할 때마다 메일 메시지를 보내려면 SNS 주제를 설정하고 Lmbda 기능 작성 창의 디버깅에서 메시지 전송을 구성 할 수 있습니다.
이 모든 소스는 여기에서 찾을 수 있습니다 .AWS documentation