Come avviare e arrestare l'istanza di AWS EC2 in base a una pianificazione basata sul tempo


17

Esiste un modo semplice per avviare e arrestare le istanze di AWS EC2 ogni giorno a una determinata ora? Questo potrebbe farmi risparmiare un sacco di soldi per i miei server di sviluppo e test.

Risposte:


16

Aggiornare

AWS ha rilasciato uno strumento chiamato " Instance Scheduler ", inclusa una guida alla configurazione completa che è collegata da quella pagina. Sembra essere un miglioramento dello Scheduler EC2 che descrivo di seguito, con alcune funzionalità in più, ma è essenzialmente la stessa cosa.

La guida di seguito continuerà a funzionare, ma probabilmente è meglio guardare lo schedulatore delle istanze per le nuove installazioni.

Posta originale

AWS ha uno strumento chiamato EC2 Scheduler che ti offre un controllo molto flessibile sull'avvio e l'arresto delle istanze EC2.

Lo strumento consente di definire i tempi di inizio e di fine predefiniti quando si imposta lo strumento, che è possibile modificare in seguito. Puoi scegliere quali istanze vengono controllate, tu e tu puoi specificare diversi orari di inizio e fine per ogni istanza usando i tag.

Sebbene sia un ottimo strumento, la documentazione è piuttosto vaga e confusa. È come se la documentazione fosse stata scritta da un ingegnere che ha scritto lo strumento e ne sa tutto, piuttosto che uno scrittore tecnico.

Nota : se si dispone di feedback o correzioni, i commenti sono apprezzati. Se hai una domanda basata su questo, per favore inizia la tua domanda.

Cos'è l'EC2 Scheduler

Questo strumento è una funzione Lambda che funziona con Cloudwatch Events e DynamoDB. Viene distribuito utilizzando un modello Cloudformation, che imposta anche i ruoli e le politiche IAM necessari. Puoi leggere l'architettura qui .

AWS EC2 Scheduler Architecture

Distribuzione

Inizia andando su questa pagina e facendo clic su "avvia soluzione". In questo momento il link diretto è qui , ma potrebbe cambiare.

Seleziona la regione in cui desideri distribuire le risorse nella parte superiore della console. Lo script controlla le istanze EC2 in qualsiasi regione, ma viene eseguito in una regione.

Tagging delle istanze EC2

Questo è trattato nella documentazione qui , ma non è così semplice come potrebbe essere.

Puoi controllare quali istanze vengono avviate e arrestate tagtendole.

Il caso più semplice richiede di taggare ogni istanza EC2 che si desidera avviare e arrestare in base alla pianificazione. Per fare questo trova la tua istanza EC2 nella console, fai clic sui tag e crea questo tag

Contrassegno dell'istanza EC2 per Scheduler

Per abilitare copia e incolla:

  • Chiave: scheduler: ec2-starttop
  • Valore: vero

Se si desidera avviare e arrestare un'istanza specifica con una pianificazione diversa, aggiungere ulteriori informazioni alla chiave tag e al valore. Ad esempio, se si desidera che un'istanza inizi a 1500 UTC e si fermi a 2400 UTC martedì, giovedì e venerdì, immettere quanto segue.

Chiave: scheduler: ec2-starttop: late Valore: 1500; 2400; utc; mar, gio, ven

Nota che la parola "late" può essere qualsiasi stringa, "late" non ha alcun significato speciale.

È possibile convertire UTC all'ora locale utilizzando questo strumento .

È possibile utilizzare l' editor di tag per le istanze di tag di massa. Ciò potrebbe consentire più facilmente di impostare la codifica in blocco, il che potrebbe essere utile per avere impostazioni diverse per sviluppo, test e produzione. Dubito che lo useresti in produzione però.

Parametri di CloudFormation

Quando esegui il modello CloudFormation devi inserire molti parametri. La maggior parte puoi lasciare di default. Ecco alcuni dei parametri più importanti

  • Stack Name: chiamalo come preferisci. È proprio come si chiama in CloudFormation.
  • Nome tag personalizzato: questa è la "chiave" del tag inserito nell'istanza EC2. Lascialo sul valore predefinito a meno che tu non abbia una buona ragione o non necessiti di più installazioni.
  • Ora di inizio / fine predefinita: ora UTC predefinita per l'avvio e l'arresto delle istanze
  • DynamoDB: le impostazioni sono memorizzate in DynamoDB. È possibile modificare il nome della tabella e così via. Poiché il livello gratuito di DynamoDB non scade, è improbabile che venga addebitata la maggior parte delle persone.
  • (seconda schermata) Autorizzazioni: si tratta di un'aringa rossa, vedere la sezione seguente. Lascialo come predefinito ed eseguilo come amministratore quando tenti di configurare l'utilità di pianificazione EC2.
  • Opzioni di notifica: ho trovato utile impostare le notifiche SNS in modo da poter confermare che funzionava. Non ho speso il tempo per capire come disabilitarli, l'ho appena cancellato, ho eseguito nuovamente il modello Cloudformation per reinstallarlo.

Autorizzazioni, criteri e ruoli

La sezione Ruoli Autorizzazioni / IAM del modello CloudFormation è un'aringa rossa, ovvero è in gran parte irrilevante. Specifica solo il ruolo utilizzato per eseguire lo script CloudFormation, non fa alcuna differenza per le risorse create o il ruolo utilizzato quando viene eseguita la funzione lambda. In retrospettiva questo è ovvio, ma non era ovvio per me quando ho iniziato.

Qualunque ruolo tu esegua questo script come lo stesso ruolo e le autorizzazioni in linea vengono create all'interno di IAM. La funzione Lambda viene eseguita utilizzando un "ruolo scheduler ec2" creato dallo script.

Ho incluso le mie politiche di seguito nel caso in cui siano utili per chiunque.

Eventi e metriche di CloudWatch

Se vuoi vedere i log della tua funzione Lambda vai su Cloudwatch Events. La registrazione è abbastanza buona. Ci sono anche metriche, quindi puoi vedere quando corre, il tempo di esecuzione, ecc.

addizionale

Il codice per la funzione lambda è disponibile su Github .

Politiche

Questi non sono generalmente necessari, ma potrebbero essere per qualcuno, quindi li includerò.

Politica per il ruolo 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"
            ]
        }
    ]
}

Politica di fiducia per il ruolo IAM

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

Da allora Amazon ha cambiato le cose: "EC2 Scheduler è stato sostituito da AWS Instance Scheduler"
Max Barraclough,

Grazie Max, ho aggiornato la risposta per includere un link. Viene fornito con una guida all'implementazione completa, quindi non credo di dover fornire istruzioni complete.
Tim

1
È incredibile come a loro piaccia complicare le cose ...
Mehdi

10

Se vuoi solo avviare e arrestare le istanze, ecco un'altra interpretazione di questo che utilizza anche il servizio Lambda. Si presume che si desideri controllare un ID istanza specifico. Puoi controllare più istanze aggiungendo più ID separati da una virgola. (ad esempio: "i-3453453", "i-45656745"). Puoi trovare l'id della tua istanza nella sezione Istanze della console AWS.

Nella console Lambda

  1. Apri la console AWS Lambda e scegli Crea funzione.
  2. Scegli l'autore da zero.
  3. Inserisci un nome per la tua funzione, ad esempio "StopEC2Instances".
  4. Per Runtime, selezionare Python 2.7
  5. Espandi il menu a discesa Ruolo e scegli Crea un ruolo personalizzato. Questo apre una nuova scheda o finestra nel tuo browser.
  6. Nel menu a discesa Ruolo IAM, seleziona Crea un nuovo ruolo IAM e inserisci un Nome ruolo, ad esempio "lambda_start_stop_ec2".
  7. Scegliere Visualizza documento politico, Modifica, quindi scegliere OK quando viene richiesto di leggere la documentazione. Sostituisci tutto il testo nella politica con questo:

Codice sotto

{
  "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. Scegli Consenti per terminare la creazione del ruolo e tornare alla console AWS Lambda.
  2. Per interrompere le istanze, sostituire tutto il testo nell'editor del codice funzione con il seguente:

Codice sotto

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)

Ricorda di sostituire i valori di regione e istanza con i tuoi.

  1. Dal menu a discesa Runtime, selezionare Python2.7.
  2. In Impostazioni di base, immettere 10 secondi per la funzione Timeout.
  3. Scegli Salva.
  4. Ripeti tutti i passaggi per creare un'altra funzione che avvierà le tue istanze, ma poi usa questo script Python per avviarlo tutto:

Codice sotto

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)

Pianifica le funzioni

Qui creerai un evento CloudWatch che attiverà la tua funzione Lambda di notte

  1. Apri la console Amazon CloudWatch.
  2. Scegli Eventi, quindi scegli Crea regola.
  3. Scegli Pianifica in Origine evento.
  4. Immettere un intervallo di tempo o un'espressione cron che indica a Lambda quando interrompere le istanze. Per ulteriori informazioni sulla sintassi corretta, vedere Pianifica la sintassi delle espressioni per le regole.

Nota: le espressioni Cron vengono valutate in UTC. Assicurati di regolare l'espressione per il tuo fuso orario preferito. Ecco un esempio che eseguirà la funzione ogni giorno alle 08:00 GMT / UTC):

0 08 * * ? *
  1. Scegli Aggiungi target, quindi scegli la funzione Lambda.
  2. Per Funzione, scegli la funzione Lambda che arresta le tue istanze.
  3. Scegli Configura dettagli.
  4. Immettere le seguenti informazioni nei campi forniti: Per Nome, immettere un nome significativo, ad esempio "StopEC2Instances". Per Descrizione, aggiungi una descrizione significativa, ad esempio "arresta le istanze EC2 ogni giorno di notte". Per Stato, seleziona Abilitato.
  5. Scegli Crea regola.

Per riavviare le istanze al mattino, ripetere questi passaggi e utilizzare l'ora di inizio preferita. Se si desidera inviare un messaggio di posta ogni volta che le funzioni falliscono, è possibile impostare un argomento SNS e configurare l'invio di quel messaggio in Debug nella finestra di creazione della funzione Lmbda.

La fonte di tutto ciò può essere trovata qui: documentazione AWS


Come diavolo puoi far apparire bene il codice Python nell'editor, come è apparso proprio ora?
Netfed

Fai clic sull'aiuto "?" e troverai ulteriori informazioni sull'uso della formattazione markdown. serverfault.com/editing-help
jscott

1
È un bug nel codice di formattazione. Devi inserire un testo semplice tra diverse formattazioni, in questo caso un blocco di codice e un blocco numerato. Ecco perché ho inserito "code below" in - non ha senso, in tutti i posti, ma funziona.
Tim

@Tim Grazie per il chiarimento. Non lo sapevo. Risolve anche la formattazione dell'espressione cron. Grazie ancora.
Netfed
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.