Zamana bağlı bir zamanlamaya göre AWS EC2 yönetim ortamını başlatma ve durdurma


17

AWS EC2 bulut sunucularını her gün belirli bir saatte başlatmanın ve durdurmanın kolay bir yolu var mı? Bu, geliştirme ve test sunucularım için oldukça fazla para kazandırabilir.

Yanıtlar:


16

Güncelleme

AWS , bu sayfadan bağlanan tam bir yapılandırma kılavuzu da dahil olmak üzere " Örnek Zamanlayıcı " adlı bir araç yayınladı . Aşağıda tarif ettiğim EC2 Zamanlayıcı'nın birkaç özelliği daha var, ancak aslında aynı şey.

Aşağıdaki kılavuz yine de çalışır, ancak yeni yüklemeler için örnek zamanlayıcıya bakmak muhtemelen daha iyidir.

Orijinal Mesaj

AWS, EC2 örneklerini başlatma ve durdurma konusunda çok esnek kontrol sağlayan EC2 Zamanlayıcı adlı bir araca sahiptir .

Araç, aracı kurduğunuzda daha sonra değiştirebileceğiniz varsayılan başlangıç ​​ve bitiş zamanlarını tanımlamanıza olanak tanır. Hangi örneklerin denetleneceğini seçebilir, siz ve etiketleri kullanarak her örnek için farklı başlangıç ​​ve bitiş zamanları belirleyebilirsiniz.

Harika bir araç olsa da, dokümantasyon biraz belirsiz ve kafa karıştırıcı. Dokümantasyon, aracı yazan ve teknik bir yazardan ziyade her şeyi bilen bir mühendis tarafından yazılmış gibi.

Not : Görüşleriniz veya düzeltmeleriniz varsa yorumlar takdir edilir. Buna dayalı bir sorunuz varsa lütfen kendi sorunuzu başlatın.

EC2 Zamanlayıcı nedir

Bu araç, Cloudwatch Etkinlikleri ve DynamoDB ile çalışan bir Lambda İşlevidir. Gerekli IAM rollerini ve politikalarını da ayarlayan bir Cloudformation şablonu kullanılarak dağıtılır. Mimari hakkında buradan bilgi edinebilirsiniz .

AWS EC2 Zamanlayıcı Mimarisi

yayılma

Bu sayfaya gidip "çözümü başlat" ı tıklayarak başlayın . Şu anda doğrudan bağlantı burada , ancak değişebilir.

Konsolun üst kısmında kaynakların dağıtılmasını istediğiniz bölgeyi seçin. Komut dosyası, herhangi bir bölgedeki EC2 örneklerini denetler, ancak bir bölgede çalışır.

EC2 Örneklerini Etiketleme

Buradaki belgelerde ele alınmaktadır , ancak olması gerektiği kadar basit değildir.

Örneklerinizi etiketleyerek hangi örneklerin başlatılıp durdurulacağını siz kontrol edersiniz.

En basit durum, başlatılmasını ve durdurulmasını istediğiniz her EC2 örneğini programa göre etiketlemenizi gerektirir. Bunu yapmak için EC2 örneğinizi konsolda bulun, etiketleri tıklayın ve bu etiketi oluşturun

Zamanlayıcı için EC2 Örnek Etiketleme

Kopyala ve yapıştır özelliğini etkinleştirmek için:

  • Anahtar: zamanlayıcı: ec2-startstop
  • Değer: doğru

Belirli bir vakanın farklı bir programda başlatılmasını ve durdurulmasını istiyorsanız etiket anahtarına ve değerine ek bilgiler eklersiniz. Örneğin, bir örneğin 1500 UTC'de başlamasını ve Salı, Perşembe ve Cuma günleri 2400 UTC'de durmasını istiyorsanız, aşağıdakileri girersiniz.

Anahtar: zamanlayıcı: ec2-startstop: late Değer: 1500; 2400; utc; sal, thu, fri

"Geç" kelimesinin herhangi bir dize olabileceğini, "geç" kelimesinin özel bir anlamı olmadığını unutmayın.

Bu aracı kullanarak UTC'yi yerel saatinize dönüştürebilirsiniz .

Etiket örneklerini toplu olarak etiketlemek için etiket düzenleyiciyi kullanabilirsiniz. Bu, geliştirici, test ve üretim için farklı ayarlara sahip olmak için yararlı olabilecek toplu etiketleme ayarlamanıza daha kolay izin verebilir. Yine de bunu üretimde kullanacağınızdan şüpheliyim.

CloudFormation Parametreleri

CloudFormation şablonunu çalıştırdığınızda çok fazla parametre girmeniz gerekir. Çoğu varsayılan olarak bırakabilirsiniz. İşte en önemli parametrelerden bazıları

  • Yığın Adı: İstediğiniz her şeyi arayın. CloudFormation'da buna denir.
  • Özel Etiket Adı: Bu, EC2 örneğine yerleştirdiğiniz etiketin "anahtarı" dır. İyi bir nedeniniz yoksa veya birden fazla kuruluma ihtiyacınız yoksa varsayılan değerde bırakın.
  • Varsayılan başlatma / durdurma zamanı: Örnekleri başlatmak ve durdurmak için varsayılan UTC zamanı
  • DynamoDB: ayarlar DynamoDB'de saklanır. Tablo adını ve benzerlerini değiştirebilirsiniz. DynamoDB ücretsiz katmanının süresi dolmadığından çoğu insanın ücretlendirilmesi olası değildir.
  • (ikinci ekran) İzinler - bu kırmızı bir ringa balığıdır, aşağıdaki bölüme bakın. Varsayılan olarak bırakın ve EC2 Zamanlayıcı'yı ayarlamaya çalıştığınızda yönetici olarak çalışıyor.
  • Bildirim seçenekleri: Çalıştığını doğrulayabilmem için SNS bildirimlerini ayarlamayı yararlı buldum. Onları nasıl devre dışı bırakacağımı çözmek için zaman harcamadım, sadece yeniden yüklemek için Cloudformation şablonunu yeniden çalıştırdım.

İzinler, Politikalar ve Roller

CloudFormation şablonunun İzinler / IAM rolü bölümü kırmızı bir ringa balığıdır - yani büyük önemsizdir. Yalnızca CloudFormation komut dosyasını çalıştırmak için kullanılan rolü belirtir, oluşturulan kaynaklarda veya lambda işlevi çalıştığında kullanılan rolde fark etmez. Geçmişe bakıldığında bu açıktır, ancak başladığımda benim için açık değildi.

Bu komut dosyasını aynı rolle çalıştırdığınız herhangi bir rol ve satır içi izinler IAM içinde oluşturulur. Lambda işlevi, komut dosyasının oluşturduğu bir "ec2 zamanlayıcı rolü" kullanarak çalışır.

Herkes için yararlı olmaları durumunda politikalarımı aşağıya ekledim.

CloudWatch Etkinlikleri ve Metrikleri

Lambda İşlevinizden günlükleri görmek istiyorsanız Cloudwatch Etkinlikleri'ne gidin. Günlüğe kaydetme oldukça iyidir. Metrikler de vardır, böylece ne zaman çalıştığını, ne zaman çalıştığını vb. Görebilirsiniz.

Ek

Lambda fonksiyonunun kodu Github'da mevcuttur .

Politikalar

Bunlar genellikle gerekli değildir, ancak birisi için olabilir, bu yüzden onları dahil edeceğim.

IAM Rolü Politikası

{
    "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 rolü için güven politikası

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Amazon o zamandan beri bazı şeyleri değiştirdi - "EC2 Zamanlayıcı'nın yerini AWS Örnek Zamanlayıcısı aldı"
Max Barraclough

Teşekkürler Max, cevabı bir link içerecek şekilde güncelledim. Tam bir uygulama kılavuzu ile birlikte gelir, bu yüzden tam talimatlar vermem gerektiğini düşünmüyorum.
Tim

1
Bir şeyleri nasıl karmaşıklaştırmak istedikleri inanılmaz ...
Mehdi

10

Örnekleri başlatmak ve durdurmak istiyorsanız, Lambda hizmetini de kullanan başka bir şey. Belirli bir örnek kimliğini kontrol etmek istediğinizi varsayar. Virgülle ayrılmış daha fazla kimlik ekleyerek birden fazla örneği kontrol edebilirsiniz. (örneğin: 'i-3453453', 'i-45656745'). Örneğin kimliğini AWS konsolu Örnekleri bölümünde bulabilirsiniz.

Lambda konsolunda

  1. AWS Lambda konsolunu açın ve İşlev oluştur'u seçin.
  2. Sıfırdan Yazar'ı seçin.
  3. İşleviniz için "StopEC2Instances" gibi bir Ad girin.
  4. Çalışma Zamanı için Python 2.7'yi seçin
  5. Rol açılır menüsünü genişletin ve Özel rol oluştur'u seçin. Bu, tarayıcınızda yeni bir sekme veya pencere açar.
  6. IAM Rolü açılır menüsünde Yeni bir IAM Rolü Oluştur'u seçin ve “lambda_start_stop_ec2” gibi bir Rol Adı girin.
  7. İlke Belgesini Görüntüle, Düzenle'yi seçin ve ardından belgeleri okuması istendiğinde Tamam'ı seçin. Politikadaki tüm metni bununla değiştir:

Aşağıdaki kod

{
  "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. Rolün oluşturulmasını bitirmek ve AWS Lambda konsoluna geri dönmek için İzin Ver'i seçin.
  2. Örneklerinizi durdurmak için İşlev kodu düzenleyicisindeki tüm metni aşağıdakiyle değiştirin:

Aşağıdaki kod

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)

Bölge ve örnek değerlerini kendi değerlerinizle değiştirmeyi unutmayın.

  1. Çalışma Zamanı açılır menüsünden Python2.7'yi seçin.
  2. Temel ayarlarda, Zaman Aşımı işlevi için 10 saniye girin.
  3. Kaydet'i seçin.
  4. Örneklerinizi başlatacak başka bir işlev oluşturmak için tüm adımları tekrarlayın, ancak hepsini başlatmak için bu python komut dosyasını kullanın:

Aşağıdaki kod

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)

İşlevleri zamanlama

Burada gece Lambda işlevinizi tetikleyecek bir CloudWatch Etkinliği oluşturacaksınız

  1. Amazon CloudWatch konsolunu açın.
  2. Etkinlikler'i ve ardından Kural oluştur'u seçin.
  3. Etkinlik Kaynağı altında Zamanla'yı seçin.
  4. Lambda'ya örneklerinizi ne zaman durduracağını söyleyen bir zaman aralığı veya cron ifadesi girin. Doğru sözdizimi hakkında daha fazla bilgi için bkz. Kurallar için İfade Sözdizimini Zamanlama.

Not: Cron ifadeleri UTC olarak değerlendirilir. İfadeyi tercih ettiğiniz saat dilimi için ayarladığınızdan emin olun. İşte işlevi her gün 08:00 GMT / UTC'de çalıştıracak bir örnek):

0 08 * * ? *
  1. Hedef ekle'yi ve ardından Lambda işlevini seçin.
  2. İşlev için, örneklerinizi durduran Lambda işlevini seçin.
  3. Ayrıntıları yapılandır'ı seçin.
  4. Sağlanan alanlara aşağıdaki bilgileri girin: Ad için, "StopEC2Instances" gibi anlamlı bir ad girin. Açıklama için “EC2 örneklerini her gün gece durdurur” gibi anlamlı bir açıklama ekleyin. Durum için Etkin'i seçin.
  5. Kural oluştur'u seçin.

Örneklerinizi sabah yeniden başlatmak için bu adımları tekrarlayın ve tercih ettiğiniz başlangıç ​​saatini kullanın. İşlevler başarısız olduğunda bir posta iletisi göndermek istiyorsanız, bir SNS konusu ayarlayabilir ve bu iletinin Lmbda İşlev Oluşturma Penceresinde Hata Ayıklama altında gönderilmesini yapılandırabilirsiniz.

Tüm bunların kaynağı burada bulunabilir: AWS belgeleri


Python kodunun editörde iyi görünmesini nasıl sağlayabilirsiniz, tıpkı şimdi olduğu gibi?
netfed

'?' Yardımını tıklayın ve işaretleme biçimlendirmesini kullanma hakkında daha fazla bilgi edineceksiniz. serverfault.com/editing-help
jscott

1
Biçimlendirme kodunda bir hata. Farklı biçimlendirme arasına düz metin koymalısınız - bu durumda bir kod bloğu ve numaralı bir blok. Bu yüzden "kodu aşağıya" koydum - her yerde mantıklı değil, ama işe yarıyor.
Tim

@Tim Açıkladığınız için teşekkürler. Bunu bilmiyordum. Ayrıca cron ifadesinin biçimlendirmesini de çözdü. Tekrar teşekkürler.
18'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.