Skip to content

Come avviare e arrestare un'istanza AWS EC2 in base a una pianificazione temporale

Dopo la nostra lunga ricerca di dati, abbiamo trovato la soluzione a questa incognita che alcuni lettori potrebbero avere. Ti forniamo la risposta e speriamo di esserti di grande aiuto.

Soluzione:

Soluzione 1:

Aggiornamento

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

La guida qui sotto funzionerà ancora, ma probabilmente è meglio consultare lo scheduler di istanze per le nuove installazioni.

Messaggio originale

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

Lo strumento consente di definire orari di avvio e arresto predefiniti quando si imposta lo strumento, che possono essere modificati in seguito. È possibile scegliere quali istanze vengono controllate e specificare diversi orari di avvio e arresto per ciascuna istanza utilizzando dei tag.

Pur essendo 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 sa tutto su di esso, piuttosto che da uno scrittore tecnico.

Nota Se avete feedback o correzioni, i commenti sono graditi. Se avete una domanda basata su questo, per favore iniziate la vostra domanda.

Che cos'è lo Scheduler EC2

Questo strumento è una Lambda Function che funziona con Cloudwatch Events e DynamoDB. Viene distribuito utilizzando un modello Cloudformation, che imposta anche i ruoli e i criteri IAM necessari. È possibile leggere l'architettura qui.

AWS EC2 Scheduler Architecture

Distribuzione

Iniziate andando a questa pagina e facendo clic su "launch solution". Al momento il link diretto è qui, ma potrebbe cambiare.

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

Taggare le istanze EC2

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

È possibile controllare quali istanze vengono avviate e interrotte etichettando le istanze.

Il caso più semplice richiede di etichettare ogni istanza EC2 che si desidera venga avviata e arrestata in base alla pianificazione. Per fare ciò, trovare l'istanza EC2 nella console, fare clic su tag e creare questo tag

Etichetta dell'istanza EC2 per Scheduler

Per abilitare il copia e incolla:

  • Chiave: scheduler:ec2-startstop
  • Valore: true

Se si desidera che un'istanza specifica venga avviata e arrestata in base a un orario diverso, si aggiungono informazioni aggiuntive al tag key e value. Ad esempio, se si desidera che un'istanza si avvii alle 1500 UTC e si arresti alle 2400 UTC il martedì, il giovedì e il venerdì, si inserisce quanto segue.

Chiave: scheduler:ec2-startstop:late
Valore: 1500;2400;utc;martedì, giovedì, venerdì

Si noti che la parola "late" può essere una stringa qualsiasi, "late" non ha un significato speciale.

È possibile convertire l'ora UTC in quella locale utilizzando questo strumento.

È possibile utilizzare l'editor di tag per aggiungere in blocco le istanze. Questo potrebbe permettere di impostare più facilmente la marcatura in blocco, il che potrebbe essere utile per avere impostazioni diverse per dev, test e produzione. Dubito però che si possa usare in produzione.

Parametri di CloudFormation

Quando si esegue il modello CloudFormation si devono inserire molti parametri. La maggior parte può essere lasciata come predefinita. Ecco alcuni dei parametri più importanti

  • Nome dello stack: chiamatelo come volete. È solo quello che viene chiamato in CloudFormation.
  • Custom Tag Name: è la "chiave" del tag che si mette contro l'istanza EC2. Lasciare il valore predefinito, a meno che non si abbia una buona ragione o si abbia bisogno di installazioni multiple.
  • Ora di avvio/arresto 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 simili. Poiché il livello gratuito di DynamoDB non ha scadenza, è improbabile che venga addebitato a qualcuno.
  • (seconda schermata) Permessi: si tratta di un problema, si veda la sezione seguente. Lasciatela come predefinita, e fate in modo di essere amministratori quando cercate di configurare EC2 Scheduler.
  • Opzioni di notifica: Ho trovato utile impostare le notifiche SNS in modo da poterne verificare il funzionamento. Non ho speso tempo per capire come disabilitarle, ho semplicemente cancellato il template Cloudformation per reinstallarlo.

Permessi, politiche e ruoli

La sezione Permessi/ruoli IAM del modello CloudFormation è un depistaggio, cioè è in gran parte irrilevante. Specifica solo il ruolo usato per eseguire lo script CloudFormation, non fa alcuna differenza per le risorse create o il ruolo usato quando viene eseguita la funzione lambda. In retrospettiva questo è ovvio, ma non lo era per me quando ho iniziato.

Qualunque sia il ruolo con cui si esegue lo script, vengono creati lo stesso ruolo e gli stessi permessi in linea in IAM. La funzione Lambda viene eseguita utilizzando un "ruolo ec2 scheduler" creato dallo script.

Ho incluso le mie politiche qui di seguito, nel caso in cui possano essere utili a qualcuno.

Eventi e metriche di CloudWatch

Se volete vedere i log della vostra Lambda Function, andate in Cloudwatch Events. La registrazione è abbastanza buona. Ci sono anche le metriche, per cui si può vedere quando viene eseguita, per quanto tempo viene eseguita, ecc.

Ulteriori

Il codice della funzione lambda è disponibile su Github.

Politiche

Queste non sono generalmente necessarie, ma potrebbero esserlo per qualcuno, quindi le includerò.

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

Soluzione 2:

Se si desidera solo avviare e arrestare le istanze, ecco un'altra soluzione che fa uso del servizio Lambda. Si presuppone che si voglia controllare un id di istanza specifico. È possibile controllare più istanze aggiungendo più id separati da una virgola. (ex: 'i-3453453','i-45656745'). L'id dell'istanza si trova nella sezione Istanze della console AWS.

Nella console Lambda

  1. Aprire la console AWS Lambda e scegliere Crea funzione.
  2. Scegliere Autore da zero.
  3. Inserire un nome per la funzione, ad esempio "StopEC2Instances".
  4. Per il tempo di esecuzione, selezionare Python 2.7.
  5. Espandere il menu a discesa Ruolo e scegliere Crea un ruolo personalizzato. Si apre una nuova scheda o finestra del browser.
  6. Nel menu a discesa Ruolo IAM, selezionare Crea un nuovo ruolo IAM e inserire un nome di ruolo, ad esempio "lambda_start_stop_ec2".
  7. Scegliere Visualizza documento criterio, Modifica e scegliere Ok quando viene richiesto di leggere la documentazione. Sostituire tutto il testo del criterio 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. Scegliere Consenti per terminare la creazione del ruolo e tornare alla console AWS Lambda.
  2. Per arrestare le istanze, sostituire tutto il testo nell'editor di codice della funzione con il seguente:

Codice qui 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)

Ricordarsi di sostituire i valori delle regioni e delle istanze con i propri.

  1. Dal menu a discesa Runtime, scegliere Python2.7.
  2. In Impostazioni di base, inserire 10 secondi per la funzione Timeout.
  3. Scegliere Salva.
  4. Ripetete tutti i passaggi per creare un'altra funzione che avvii le istanze, ma poi usate questo script python per avviarle tutte:

Codice qui 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)

Programmare le funzioni

Qui si creerà un evento CloudWatch che attiverà la funzione Lambda durante la notte

  1. Aprire la console di Amazon CloudWatch.
  2. Scegliere Eventi, quindi scegliere Crea regola.
  3. Scegliere Pianifica in Origine evento.
  4. Inserire un intervallo di tempo o un'espressione cron che indichi a Lambda quando fermare le istanze. Per ulteriori informazioni sulla sintassi corretta, vedere Sintassi delle espressioni di pianificazione per le regole.

Nota: Le espressioni cron sono valutate in UTC. Assicurarsi di regolare l'espressione per il fuso orario preferito. Ecco un esempio che esegue la funzione ogni giorno alle 08:00 GMT/UTC):

0 08 * * ? *
  1. Scegliere Aggiungi destinazione, quindi scegliere la funzione Lambda.
  2. Per Function, scegliere la funzione Lambda che interrompe le istanze.
  3. Scegliere Configura dettagli.
  4. Inserite le seguenti informazioni nei campi previsti:
    Per Nome, inserire un nome significativo, ad esempio "StopEC2Instances".
    Per Descrizione, aggiungere una descrizione significativa, ad esempio "arresta le istanze EC2 ogni giorno di notte".
    Per Stato, selezionare Abilitato.
  5. Scegliere Crea regola.

Per riavviare le istanze al mattino, ripetere questi passaggi e utilizzare l'orario di avvio preferito.
Se si desidera inviare un messaggio di posta elettronica ogni volta che le funzioni falliscono, è possibile impostare un argomento SNS e configurare l'invio di tale messaggio in Debug nella finestra di creazione delle funzioni Lmbda.

La fonte di tutto questo si trova qui: Documentazione AWS

Se ti viene richiesto, sentiti libero di lasciare una dichiarazione su cosa aggiungeresti a questo post.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.