Bagaimana memulai dan menghentikan instance AWS EC2 berdasarkan jadwal berdasarkan waktu

17

Apakah ada cara mudah untuk memulai dan menghentikan instance AWS EC2 pada waktu tertentu setiap hari? Ini bisa menghemat banyak uang untuk pengembangan dan pengujian server saya.

Tim
sumber

Jawaban:

16

Memperbarui

AWS telah merilis alat yang disebut " Penjadwal Instance ", termasuk panduan konfigurasi lengkap yang ditautkan dari halaman itu. Tampaknya merupakan peningkatan dari Penjadwal EC2 yang saya jelaskan di bawah, dengan beberapa fitur lagi, tetapi pada dasarnya hal yang sama.

Panduan di bawah ini masih akan berfungsi, tetapi mungkin lebih baik untuk melihat penjadwal contoh untuk instalasi baru.

Pos Asli

AWS memiliki alat yang disebut Penjadwal EC2 yang memberi Anda kontrol yang sangat fleksibel untuk memulai dan menghentikan instance EC2.

Alat ini memungkinkan Anda untuk menentukan waktu mulai dan berhenti default ketika Anda mengatur alat, yang dapat Anda ubah nanti. Anda dapat memilih instance mana yang dikontrol, Anda dan Anda dapat menentukan waktu mulai dan berhenti yang berbeda untuk setiap instance menggunakan tag.

Meskipun ini merupakan alat yang hebat, dokumentasi ini agak kabur dan membingungkan. Sepertinya dokumentasi telah ditulis oleh seorang insinyur yang menulis alat dan tahu segalanya tentang itu, daripada seorang penulis teknis.

Catatan : jika Anda memiliki umpan balik atau komentar koreksi dihargai. Jika Anda memiliki pertanyaan berdasarkan ini, silakan mulai pertanyaan Anda sendiri.

Apa itu Penjadwal EC2

Alat ini adalah Fungsi Lambda yang berfungsi dengan Acara Cloudwatch dan DynamoDB. Ini dikerahkan menggunakan templat Cloudformation, yang juga mengatur peran dan kebijakan IAM yang diperlukan. Anda dapat membaca tentang arsitektur di sini .

Arsitektur Penjadwal AWS EC2

Penyebaran

Mulailah dengan membuka halaman ini dan mengklik "luncurkan solusi". Saat ini tautan langsung ada di sini , tetapi itu bisa berubah.

Pilih wilayah tujuan sumber daya yang Anda inginkan di bagian atas konsol. Script mengontrol instance EC2 di wilayah mana pun, tetapi dijalankan di satu wilayah.

Menandai Instance EC2

Ini tercakup dalam dokumentasi di sini , tetapi tidak sesederhana mungkin.

Anda mengontrol instans mana yang dimulai dan dihentikan dengan memberi tag instans Anda.

Kasing paling sederhana mengharuskan Anda untuk menandai setiap instance EC2 yang ingin Anda mulai dan hentikan sesuai jadwal. Untuk melakukan ini, temukan instance EC2 Anda di konsol, klik tag, dan buat tag ini

Pemberian Tag Instance EC2 untuk Penjadwal

Untuk mengaktifkan salin dan tempel:

  • Kunci: penjadwal: EC2-startstop
  • Nilai: benar

Jika Anda ingin memulai dan menghentikan instance spesifik pada jadwal yang berbeda, Anda menambahkan informasi tambahan ke kunci dan nilai tag. Misalnya jika Anda ingin contoh dimulai pada 1500 UTC dan berhenti pada 2400 UTC pada hari Selasa, Kamis dan Jumat Anda memasukkan yang berikut ini.

Kunci: scheduler: ec2-startstop: late Nilai: 1500; 2400; utc; tue, thu, fri

Perhatikan bahwa kata "terlambat" dapat berupa string apa pun, "terlambat" tidak memiliki arti khusus.

Anda dapat mengonversi UTC ke waktu lokal Anda menggunakan alat ini .

Anda dapat menggunakan editor tag untuk membuat instance tag massal. Itu bisa lebih mudah membiarkan Anda mengatur penandaan massal, yang dapat berguna untuk memiliki pengaturan yang berbeda untuk dev, pengujian, dan produksi. Saya ragu Anda akan menggunakannya untuk produksi.

Parameter CloudFormation

Ketika Anda menjalankan template CloudFormation Anda harus memasukkan banyak parameter. Sebagian besar Anda dapat meninggalkan default. Inilah beberapa parameter terpenting

  • Stack Name: sebutkan apa saja yang kamu suka. Hanya saja itu namanya di CloudFormation.
  • Nama Tag Kustom: ini adalah "kunci" dari tag yang Anda berikan terhadap instance EC2. Biarkan pada nilai default kecuali Anda memiliki alasan yang bagus, atau perlu beberapa instalasi.
  • Waktu mulai / henti default: Waktu UTC default untuk memulai dan menghentikan instans
  • DynamoDB: pengaturan disimpan di DynamoDB. Anda dapat mengubah nama tabel dan semacamnya. Karena tingkat bebas DynamoDB tidak kedaluwarsa, kebanyakan orang tidak akan dikenakan biaya.
  • (Layar kedua) Izin - ini adalah herring merah, lihat bagian di bawah ini. Biarkan sebagai default, dan jalankan sebagai administrator ketika Anda mencoba mengatur Penjadwal EC2.
  • Opsi pemberitahuan: Saya merasa berguna untuk mengatur notifikasi SNS sehingga saya bisa memvalidasi itu berfungsi. Saya belum menghabiskan waktu untuk mencari tahu cara menonaktifkannya, saya baru saja menghapusnya menjalankan kembali template Cloudformation untuk menginstal ulang.

Izin, Kebijakan, dan Peran

Bagian peran Izin / IAM dari templat CloudFormation adalah herring merah - artinya sebagian besar tidak relevan. Ini menentukan hanya peran yang digunakan untuk menjalankan skrip CloudFormation, tidak ada bedanya dengan sumber daya yang dibuat atau peran yang digunakan ketika fungsi lambda berjalan. Kalau dipikir-pikir ini jelas, tetapi tidak jelas bagi saya ketika saya mulai.

Apa pun peran yang Anda jalankan skrip ini sebagai peran dan izin inline yang sama dibuat dalam IAM. Fungsi Lambda berjalan menggunakan "peran penjadwal EC2" yang dibuat skrip.

Saya telah memasukkan kebijakan saya di bawah jika mereka bermanfaat bagi siapa pun.

Acara dan Metrik CloudWatch

Jika Anda ingin melihat log dari Fungsi Lambda Anda, buka Acara Cloudwatch. Penebangannya cukup bagus. Ada juga metrik, sehingga Anda dapat melihat kapan dijalankan, waktu dijalankan, dll.

Tambahan

Kode untuk fungsi lambda tersedia di Github .

Kebijakan

Ini umumnya tidak diperlukan, tetapi bisa untuk seseorang jadi saya akan memasukkannya.

Kebijakan untuk Peran 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"
            ]
        }
    ]
}

Kebijakan kepercayaan untuk peran IAM

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Tim
sumber
Amazon telah mengubah banyak hal - "EC2 Scheduler telah digantikan oleh AWS Instance Scheduler"
Max Barraclough
Terima kasih Max, saya telah memperbarui jawaban untuk menyertakan tautan. Itu datang dengan panduan implementasi penuh jadi saya tidak berpikir saya perlu memberikan instruksi lengkap.
Tim
1
Sulit dipercaya bagaimana mereka suka memperumit masalah ...
Mehdi
9

Jika Anda hanya ingin memulai dan menghentikan instances, berikut ini contoh lain yang juga menggunakan layanan Lambda. Itu mengasumsikan Anda ingin mengontrol id instance tertentu. Anda dapat mengontrol beberapa instance dengan menambahkan lebih banyak id yang dipisahkan oleh koma. (mis: 'i-3453453', 'i-45656745'). Anda dapat menemukan id instance Anda di bagian Instance AWS konsol.

Di konsol Lambda

  1. Buka konsol AWS Lambda, dan pilih Buat fungsi.
  2. Pilih Penulis dari awal.
  3. Masukkan Nama untuk fungsi Anda, seperti "StopEC2In Situ."
  4. Untuk Runtime, pilih Python 2.7
  5. Luaskan menu tarik-turun Peran, dan pilih Buat peran khusus. Ini membuka tab atau jendela baru di browser Anda.
  6. Di menu tarik-turun Peran IAM, pilih Buat Peran IAM baru, dan masukkan Nama Peran, seperti "lambda_start_stop_ec2."
  7. Pilih Lihat Dokumen Kebijakan, Edit, lalu pilih Oke ketika diminta untuk membaca dokumentasi. Ganti semua teks dalam kebijakan dengan ini:

Kode di bawah ini

{
  "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. Pilih Allow untuk menyelesaikan pembuatan peran dan kembali ke konsol AWS Lambda.
  2. Untuk menghentikan instance Anda, ganti semua teks dalam editor kode fungsi dengan yang berikut ini:

Kode di bawah ini

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)

Ingatlah untuk mengganti nilai region dan instance dengan milik Anda.

  1. Dari menu tarik-turun Runtime, pilih Python2.7.
  2. Dalam Pengaturan dasar, masukkan 10 detik untuk fungsi Timeout.
  3. Pilih Simpan.
  4. Ulangi semua langkah untuk membuat fungsi lain yang akan memulai instance Anda, tetapi kemudian gunakan skrip python ini untuk memulai semuanya:

Kode di bawah ini

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)

Jadwalkan fungsinya

Di sini Anda akan membuat Acara CloudWatch yang akan memicu fungsi Lambda Anda di malam hari

  1. Buka konsol Amazon CloudWatch.
  2. Pilih Acara, lalu pilih Buat aturan.
  3. Pilih Jadwal di bawah Sumber Acara.
  4. Masukkan interval waktu atau ekspresi cron yang memberi tahu Lambda kapan harus menghentikan instance Anda. Untuk informasi lebih lanjut tentang sintaks yang benar, lihat Jadwalkan Ekspresi Sintaks untuk Aturan.

Catatan: Ekspresi Cron dievaluasi dalam UTC. Pastikan untuk menyesuaikan ekspresi untuk zona waktu pilihan Anda. Berikut adalah contoh yang akan menjalankan fungsinya setiap hari pada pukul 08:00 GMT / UTC):

0 08 * * ? *
  1. Pilih Tambahkan target, lalu pilih fungsi Lambda.
  2. Untuk Fungsi, pilih fungsi Lambda yang menghentikan instance Anda.
  3. Pilih Konfigurasikan detail.
  4. Masukkan informasi berikut di bidang yang disediakan: Untuk Nama, masukkan nama yang bermakna, seperti "StopEC2In Situ." Untuk Keterangan, tambahkan deskripsi yang bermakna, seperti "menghentikan instance EC2 setiap hari di malam hari." Untuk Status, pilih Diaktifkan.
  5. Pilih Buat aturan.

Untuk memulai kembali instans Anda di pagi hari, ulangi langkah-langkah ini dan gunakan waktu mulai yang Anda inginkan. Jika Anda ingin mengirim pesan email setiap kali fungsi gagal, Anda dapat mengatur topik SNS dan mengkonfigurasi pengiriman pesan itu di bawah Debugging di Lmbda Function Creation Window.

Sumber semua ini dapat ditemukan di sini: dokumentasi AWS

netfed
sumber
Bagaimana Anda bisa membuat kode Python terlihat baik-baik saja di editor, seperti yang ternyata tadi?
Netfed
Klik pada bantuan '?' dan Anda akan menemukan lebih banyak tentang menggunakan format markdown. serverfault.com/editing-help
jscott
1
Itu adalah bug dalam kode pemformatan. Anda harus meletakkan teks biasa di antara format yang berbeda - dalam hal ini blok kode dan blok bernomor. Itu sebabnya saya memasukkan "kode di bawah" - tidak masuk akal, di semua tempat, tetapi berhasil.
Tim
@Tim Terima kasih telah mengklarifikasi. Saya tidak tahu hal itu. Itu memecahkan format ekspresi cron juga. Terima kasih lagi.
Netfed