시간 기반 일정에 따라 AWS EC2 인스턴스를 시작 및 중지하는 방법


17

매일 주어진 시간에 AWS EC2 인스턴스를 시작하고 중지하는 쉬운 방법이 있습니까? 이를 통해 개발 및 테스트 서버에 많은 돈을 절약 할 수 있습니다.

답변:


16

최신 정보

AWS는 해당 페이지에서 링크 된 전체 구성 안내서 를 포함 하여 " 인스턴스 스케줄러 " 라는 도구를 출시했습니다 . 아래에 설명하는 EC2 스케줄러의 기능이 몇 가지 더 개선 된 것으로 보이지만 본질적으로 동일합니다.

아래 가이드는 여전히 작동하지만 인스턴스 설치 프로그램에서 새 설치를 확인하는 것이 좋습니다.

원본 게시물

AWS에는 EC2 인스턴스 시작 및 중지를 매우 유연하게 제어 할 수있는 EC2 스케줄러 라는 도구 가 있습니다.

이 도구를 사용하면 도구를 설정할 때 기본 시작 및 중지 시간을 정의 할 수 있으며 나중에 변경할 수 있습니다. 제어 할 인스턴스를 선택할 수 있으며 태그를 사용하여 각 인스턴스에 대해 다른 시작 및 중지 시간을 지정할 수 있습니다.

훌륭한 도구이지만 문서는 다소 모호하고 혼동됩니다. 이 도구는 문서를 작성한 기술자가 아닌 도구를 작성한 엔지니어가 문서를 작성한 것과 같습니다.

참고 : 피드백이나 수정 사항이 있으면 의견을 보내주십시오. 이 질문에 근거한 질문이 있으면 자신의 질문을 시작하십시오.

EC2 스케줄러 란?

이 도구는 Cloudwatch Events 및 DynamoDB와 함께 작동하는 Lambda 함수입니다. 필요한 IAM 역할 및 정책을 설정하는 Cloudformation 템플릿을 사용하여 배포됩니다. 여기서 아키텍처에 대해 읽을 수 있습니다 .

AWS EC2 스케줄러 아키텍처

전개

이 페이지 로 가서 "시작 솔루션"을 클릭하여 시작 하십시오 . 현재 직접 링크는 여기 있지만 변경 될 수 있습니다.

콘솔 맨 위에서 자원을 배치 할 리젼을 선택하십시오. 이 스크립트는 모든 리전에서 EC2 인스턴스를 제어하지만 한 리전에서 실행됩니다.

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"
    }
  ]
}

아마존은 이후 사물을 변경했습니다- "EC2 스케줄러가 AWS 인스턴스 스케줄러로 대체되었습니다"
Max Barraclough

감사합니다 Max, 링크를 포함하도록 답변을 업데이트했습니다. 전체 구현 안내서와 함께 제공되므로 전체 지침을 제공 할 필요가 없다고 생각합니다.
Tim

1
그들이 어떻게 사물을 복잡하게 만드는지 믿기지 않습니다 ...
Mehdi

9

인스턴스를 시작하고 중지하려면 Lambda 서비스를 사용하는 또 다른 방법이 있습니다. 특정 인스턴스 ID를 제어한다고 가정합니다. 쉼표로 구분 된 더 많은 ID를 추가하여 여러 인스턴스를 제어 할 수 있습니다. (예 : 'i-3453453', 'i-45656745'). AWS 콘솔 인스턴스 섹션에서 인스턴스의 ID를 찾을 수 있습니다.

Lambda 콘솔에서

  1. AWS Lambda 콘솔을 열고 Create function을 선택하십시오.
  2. 처음부터 작성자를 선택하십시오.
  3. "StopEC2Instances"와 같은 기능의 이름을 입력하십시오.
  4. 런타임에서 Python 2.7을 선택하십시오.
  5. 역할 드롭 다운 메뉴를 펼치고 사용자 정의 역할 작성을 선택하십시오. 브라우저에서 새 탭 또는 창이 열립니다.
  6. IAM 역할 드롭 다운 메뉴에서 새 IAM 역할 생성을 선택하고 "lambda_start_stop_ec2"와 같은 역할 이름을 입력하십시오.
  7. 정책 문서보기, 편집을 선택한 다음 설명서를 읽으라는 메시지가 표시되면 확인을 선택하십시오. 정책의 모든 텍스트를 다음으로 바꾸십시오.

아래 코드

{
  "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": "*"
    }
  ]
}
  1. 허용을 선택하여 역할 생성을 마치고 AWS Lambda 콘솔로 돌아갑니다.
  2. 인스턴스를 중지하려면 기능 코드 편집기의 모든 텍스트를 다음으로 바꾸십시오.

아래 코드

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)

리전 및 인스턴스 값을 자신의 값으로 바꾸십시오.

  1. 런타임 드롭 다운 메뉴에서 Python2.7을 선택하십시오.
  2. 기본 설정에서 시간 초과 기능에 10 초를 입력하십시오.
  3. 저장을 선택하십시오.
  4. 모든 단계를 반복하여 인스턴스를 시작하는 다른 함수를 작성하고이 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 이벤트를 생성합니다

  1. Amazon CloudWatch 콘솔을 엽니 다.
  2. 이벤트를 선택한 다음 규칙 생성을 선택하십시오.
  3. 이벤트 소스에서 스케줄을 선택하십시오.
  4. Lambda에게 인스턴스 중지시기를 알려주는 시간 간격 또는 cron 표현식을 입력하십시오. 올바른 구문에 대한 자세한 내용은 규칙에 대한 표현식 식 구문을 참조하십시오.

참고 : Cron 표현식은 UTC로 평가됩니다. 원하는 시간대에 맞게 식을 조정하십시오. 다음은 매일 08:00 GMT / UTC에서 함수를 실행하는 예제입니다.

0 08 * * ? *
  1. 대상 추가를 선택한 다음 Lambda 함수를 선택하십시오.
  2. 함수에서 인스턴스를 중지하는 Lambda 함수를 선택하십시오.
  3. 세부 사항 구성을 선택하십시오.
  4. 제공된 필드에 다음 정보를 입력하십시오. 이름에 "StopEC2Instances"와 같은 의미있는 이름을 입력하십시오. 설명에 "매일 매일 밤 EC2 인스턴스 중지"와 같은 의미있는 설명을 추가하십시오. 상태에 대해 사용을 선택하십시오.
  5. 규칙 생성을 선택하십시오.

아침에 인스턴스를 다시 시작하려면이 단계를 반복하고 원하는 시작 시간을 사용하십시오. 기능이 실패 할 때마다 메일 메시지를 보내려면 SNS 주제를 설정하고 Lmbda 기능 작성 창의 디버깅에서 메시지 전송을 구성 할 수 있습니다.

이 모든 소스는 여기에서 찾을 수 있습니다 .AWS documentation


에디터에서 파이썬 코드가 어떻게 보이게 만들 수 있습니까?
netfed

도움말 '?'을 클릭하십시오 마크 다운 형식 사용에 대해 자세히 알아보십시오. serverfault.com/editing-help
jscott

1
서식 코드의 버그입니다. 다른 형식 사이에 일반 텍스트를 입력해야합니다 (이 경우 코드 블록과 번호가 매겨진 블록). 이것이 바로 "아래 코드"를 넣은 이유입니다. 모든 곳에서 의미가있는 것은 아니지만 작동합니다.
Tim

@Tim 설명해 주셔서 감사합니다. 난 몰랐어. cron 표현식의 형식도 해결했습니다. 다시 감사합니다.
netfed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.