Як запустити та зупинити екземпляр AWS EC2 на основі часового графіку


17

Чи є простий спосіб запускати та зупиняти екземпляри AWS EC2 у визначений час щодня? Це могло б заощадити мені досить багато грошей на моїй розробці та тестових серверах.

Відповіді:


16

Оновлення

AWS випустила інструмент під назвою " Планувальник екземплярів ", включаючи повне керівництво по конфігурації, яке посилається на цю сторінку. Здається, це є вдосконаленням планувальника EC2, який я описую нижче, маючи ще кілька функцій, але це, по суті, те саме.

Поданий посібник все ще працюватиме, але, мабуть, краще переглянути плановий примірник нових установок.

Оригінальна публікація

AWS має інструмент під назвою EC2 Scheduler, який дає вам дуже гнучкий контроль над запуском та зупинкою екземплярів EC2.

Інструмент дозволяє визначити час запуску та зупинки за замовчуванням, коли ви налаштовуєте інструмент, який ви можете змінити пізніше. Ви можете вибрати, які екземпляри контролюються, ви і можете вказати різні часи запуску та зупинки для кожного примірника за допомогою тегів.

Хоча це чудовий інструмент, документація дещо розпливчаста і заплутана. Це як документація написана інженером, який написав інструмент і знає про нього все, а не технічним письменником.

Примітка : якщо у вас є відгуки або виправлення, коментарі оцінюються. Якщо у вас виникло запитання на основі цього, будь ласка, розпочніть власне запитання.

Що таке планувальник EC2

Цей інструмент - це функція лямбда, яка працює з Cloudwatch Events та DynamoDB. Він розгортається за допомогою шаблону Cloudformation, який також встановлює необхідні ролі та політики IAM. Про архітектуру ви можете прочитати тут .

AWS EC2 Scheduler Architecture

Розгортання

Для початку перейдіть на цю сторінку і натисніть «запустити рішення». Зараз пряме посилання є тут , але воно може змінитися.

Виберіть регіон, до якого потрібно розгорнути ресурси, у верхній частині консолі. Сценарій контролює випадки EC2 у будь-якому регіоні, але він працює в одному регіоні.

Позначення екземплярів EC2

Це висвітлено в документації тут , але це не так просто, як це могло б бути.

Ви визначаєте, які екземпляри починаються та зупиняються, позначаючи їх.

Найпростіший випадок вимагає відзначити кожен екземпляр EC2, який потрібно запустити і зупинити відповідно до розкладу. Для цього знайдіть свій екземпляр EC2 у консолі, натисніть теги та створіть цей тег

Теги інстанцій EC2 для планувальника

Щоб увімкнути копіювання та вставити:

  • Ключ: планувальник: ec2-стартовий стоп
  • Значення: вірно

Якщо ви хочете, щоб певний екземпляр був запущений і зупинений в іншому розкладі, ви додаєте додаткову інформацію до ключа та значення тегу. Наприклад, якщо ви хочете, щоб екземпляр починався з 1500 UTC і зупинявся на 2400 UTC у вівторок, четвер і п’ятницю, ви вводите наступне.

Ключ: планувальник: ec2-startstop: пізнє значення: 1500; 2400; utc; вт, чт, пт

Зауважте, що слово "пізно" може бути будь-яким рядком, "пізно" не має особливого значення.

Ви можете перетворити UTC на місцевий час за допомогою цього інструменту .

Ви можете використовувати редактор тегів для масових примірників тегів. Це може легше дозволити вам налаштувати масове тегування, що може бути корисно для різних налаштувань для розробника, тестування та виробництва. Я сумніваюся, ви б використовували це на виробництві.

Параметри Cloud Cloud Formation

При запуску шаблону CloudFormation вам доведеться ввести безліч параметрів. Більшість ви можете залишити за замовчуванням. Ось деякі найважливіші параметри

  • Назва стека: називайте його всім, що вам подобається. Це просто те, що його називають у CloudFormation.
  • Назва спеціального тегу: це "ключ" тегу, який ви ставите проти екземпляра EC2. Залиште це значення за замовчуванням, якщо ви не маєте вагомих причин або не потребуєте кількох установок.
  • Час початку / зупинки за замовчуванням: час за замовчуванням UTC, щоб запустити та зупинити екземпляри
  • DynamoDB: налаштування зберігаються в DynamoDB. Ви можете змінити назву таблиці та ін. Оскільки безкоштовний рівень DynamoDB не закінчується, більшість людей навряд чи платять.
  • (другий екран) Дозволи - це червона оселедець, див. розділ нижче. Залиште це як за замовчуванням і запустіть як адміністратор, коли ви намагаєтеся налаштувати EC2 Scheduler.
  • Варіанти сповіщень: я вважаю корисним налаштувати сповіщення SNS, щоб я міг перевірити, чи працює він. Я не витратив час, щоб розробити, як їх відключити, я просто видалив його, запустив шаблон Cloudformation для його перевстановлення.

Дозволи, правила та ролі

Розділ ролей Permissions / IAM шаблону CloudFormation - це червона оселедець - тобто це в значній мірі не має значення. Він визначає лише роль, яка використовується для запуску сценарію CloudFormation, при цьому немає ніякого значення для створених ресурсів або ролі, яка використовується при запуску функції лямбда. З ретроспективою це очевидно, але мені це було не очевидно, коли я починав.

Яку б роль ви не виконували цей сценарій, оскільки однакові ролі та вбудовані дозволи створюються в IAM. Функція лямбда запускається, використовуючи "роль планувальника 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"
Макс Барраклу

Дякую Макс, я оновив відповідь, щоб включити посилання. Він постачається з повним посібником із впровадження, тому я не думаю, що мені потрібно надавати повні інструкції.
Тім

1
Неймовірно, як вони люблять ускладнювати речі ...
Мехді

10

Якщо ви просто хочете запускати та зупиняти екземпляри, ось ще один досвід, який також використовує послугу Lambda. Він передбачає, що ви хочете керувати певним ідентифікатором екземпляра. Ви можете керувати кількома екземплярами, додаючи більше ідентифікаторів, розділених комою. (наприклад: 'i-3453453', 'i-45656745'). Ви можете знайти ідентифікатор вашого примірника в розділі "Примірники консолі AWS".

У консолі лямбда

  1. Відкрийте консоль AWS Lambda та виберіть Створити функцію.
  2. Виберіть "Автор" з нуля.
  3. Введіть ім’я для вашої функції, наприклад "StopEC2Insances."
  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. У спадному меню Runtime виберіть Python2.7.
  2. У Основних налаштуваннях введіть 10 секунд для функції Timeout.
  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)

Сплануйте функції

Тут ви створите подію CloudWatch, яка запустить вашу функцію Lambda вночі

  1. Відкрийте консоль Amazon CloudWatch.
  2. Виберіть Події, а потім виберіть Створити правило.
  3. Виберіть Розклад у Джерело події.
  4. Введіть проміжок часу або вираз cron, який підкаже Lambda, коли потрібно зупинити ваші екземпляри. Щоб отримати додаткові відомості про правильний синтаксис, див. Синтаксис виразів розкладу для правил.

Примітка: вирази Cron оцінюються в UTC. Не забудьте відрегулювати вираз для бажаного часового поясу. Ось приклад, який виконуватиме функцію щодня о 08:00 GMT / UTC):

0 08 * * ? *
  1. Виберіть Додати ціль і виберіть функцію лямбда.
  2. Для функції виберіть функцію лямбда, яка зупиняє ваші екземпляри.
  3. Виберіть Налаштувати деталі.
  4. Введіть у надані поля наступну інформацію: Для Імені введіть значущу назву, наприклад "StopEC2Insances." Для опису додайте змістовний опис, наприклад "зупиняє випадки EC2 щодня вночі". Для стану виберіть Увімкнено.
  5. Виберіть Створити правило.

Щоб перезапустити примірники вранці, повторіть ці дії та скористайтеся бажаним часом початку. Якщо ви хочете відправляти поштове повідомлення, коли функції не спрацьовують, ви можете налаштувати тему SNS та налаштувати відправлення цього повідомлення під налагодженням у вікні створення функцій Lmbda.

Джерело всього цього можна знайти тут: документація AWS


Як же ви зможете змусити код Python добре редагувати редактор, як це з’ясувалося зараз?
netfed

Клацніть на допомогу "?" і ви дізнаєтесь більше про використання форматування розмітки. serverfault.com/editing-help
jscott

1
Це помилка у коді форматування. Ви повинні розмістити звичайний текст між різним форматуванням - в цьому випадку код коду та нумерований блок. Тому я ставлю "код нижче" - не має сенсу, в усіх місцях, але він працює.
Тім

@Tim Дякую за уточнення. Я не знаю, що. Це також вирішило форматування виразу cron. Знову дякую.
netfed
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.