Risposte:
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 .
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
Per abilitare copia e incolla:
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
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"
}
]
}
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.
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": "*"
}
]
}
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)
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)
Qui creerai un evento CloudWatch che attiverà la tua funzione Lambda di notte
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 * * ? *
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