Pubblicato il 09/03/2024 da alnao nella categoria AWS

Una necessità frequente in caso di utilizzo di istanze EC2 è la gestione di comandi e schedulare operazioni all’interno delle istanze, la possibilità più semplice è usare gli schedulatori nativi del sistema operativo come Cron per le istanze GNU Linux o lo schedulatore nativo di Microsoft Windows, tuttavia questi necessitano una attività manuale di configurazione e il monitoraggio necessità l’utilizzo di software specifici o di accessi diretti alle istanze e diventa molto complesso da gestire nelle architettura con molte istanze con le stesse schedulazioni come nel caso di architetture studiate per lavorare con la scalabilità. L’uso di System Manager permette l’esecuzione di comandi in istanze senza la necessità di collegamento SSH/Telnet o via desktop remoto ma permette di eseguire comandi in semplicità da un browser o da un qualsiasi computer grazie ai comandi della CLI.

AWS mette a disposizione un sistema gestito e serverless per la gestione degli eventi combinando le funzionalità dei vari sotto-servizi AWS:

  • IAM: gestione dei permessi rendendo sicura e robusta la infrastruttura
  • System Manager: gestione dei comandi con i Document “RunShellScript” e “RunPowerShellScript” sarà possibile avviare un comando in una istanza
  • SSM agent: agente che esegue i comandi nelle istanze e ne gestisce il ritorno
  • EventBridge: per le impostazioni di esecuzioni infatti con questo servizio è possibile legare le schedulazioni ad eventi specifici o regole a frequenza fissa.

Ogni uno di questi componenti deve essere gestito e ben configurato, questo articolo vuole essere un riassunto della documentazione ufficiale e del tutorial ufficiale che si invita a leggere attentamente. Le cose più importanti da tenere a mente sono:

  1. Deve essere presente una regola IAM che permetta alle istanze EC2 di collegarsi ad SSM con la policy chiamata AmazonEC2RoleforSSM:
  2. La regola IAM con la policy permissiva deve essere associata alla istanze EC2
  3. L’agente deve essere installato nella istanza, nelle EC2 con AMI di tipo Linux-Amazon questo è installato di default, negli altri tipi di AMI deve essere installato manualmente, si rimanda alla documentazione ufficiale per questo passo .
  4. Verificare che l’agente è collegato correttamente, nel servizio SSM è disponibile la lista degli agenti collegati in “Fleet manager”

    Il comando base per la verificare lo stato dell’agente in ambiente di GNU Linux è

    sudo systemctl status amazon-ssm-agent
  5. E’ possibile eseguire i comandi dalla shell con la funzionalità specifica prevista dalla console

Tramite console è possibile monitorare le istanze collegate al servizio tramite l’agente nella funzione “Fleet Manager” del AWS Systems Manager.


La CLI mette a disposizione un comando specifico per questo tipo di che si chiama

ssm send-command

la cui documentazione ufficiale descrive il funzionamento e l’elenco di tutti i parametri mentre è presente anche una utile guida. I principali comandi di System Manager per eseguire comandi nelle istanze EC2 sono:

  • elenco di tutte le istanze con l’agente in esecuzione correttamente configurato
    aws ssm describe-instance-information --output text --query "InstanceInformationList[*]"
  • avviare un comando in una istanza specifica di tipo GNU Linux con il tipo RunShellScript:
    aws ssm send-command --document-name "AWS-RunShellScript"
    --targets '[{"Key":"InstanceIds","Values":["i-094d7505c54b0e029"]}]'
    --parameters '{"commands":["sh prova.sh"],"workingDirectory": ["/home/ec2-user"]}'
  • eseguire un comando e recuperare l’output con il comando “list-command-invocations”
    sh_command_id=$(aws ssm send-command --instance-ids "i-094d7505c54b0e029" --document-name "AWS-RunShellScript" --parameters '{"commands":["ifconfig"]}' --output text --query "Command.CommandId")
    aws ssm list-command-invocations --command-id "$sh_command_id" --details --query "CommandInvocations[].CommandPlugins[].{Status:Status,Output:Output}"

Da notare che esiste anche il comando corrispettivo per lanciare comandi su istanza con il sistema operativo MS Windows con il tipo specifico, per maggiori dettagli si rimanda alla documentazione ufficiale.


Con EventBridge è possibile schedulare l’esecuzione di questo tipo di comandi creando regole specifiche indicando come target il tipo AWS-RunShellScript di tipo Systems Manager Run Command impostando come input al processo il tipo Constant con le informazioni del comando in un json:

{
  "executionTimeout": ["3600"],
  "commands": ["sh prova.sh"],
  "workingDirectory": ["/home/ec2-user"]
}

Inoltre bisogna ricordarsi che la regola EventBridge deve essere “abilitata” ad eseguire il comando con nella singola istanza con una policy specifica, per esempio:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Action": "ssm:SendCommand",
    "Effect": "Allow",
    "Resource": [
      "arn:aws:ec2:eu-west-1:xxxxxxx:instance/i-xxxxxxxxxxxxxxxxx",
      "arn:aws:ssm:eu-west-1:*:document/AWS-RunShellScript"
    ]
  }]
}

Nel sito ufficiale è descritto anche un processo diverso per l’esecuzione di comandi nelle istanze per eseguire il comando di avvio e spegnimento, possibilità non permessa dal send-command di ssm, la soluzione proposta dal sito ufficiale descrive la creazione di alcune Lambda avviate da EventBridge per la gestione dello stato delle istanze.

La soluzione proposta prevede un template CloudFormation per la gestione di tutte le risorse, si rimanda al sito ufficiale per tutti i dettagli. Bisogna ricordare che con CloudFormation non è possibile definire dei tipi di risorsa “comando” ma esistono dei tipi “document” che permettono di definire la logica, anche in questo caso si rimanda sempre alla documentazione ufficiale per tutti i dettagli.

MENU