Sto usando l'API Java AWS RunInstance() per avviare una nuova istanza EC2 dalla mia immagine AMI personalizzata. Come posso passare le variabili di ambiente al nuovo EC2 INSTANCE come l'url del database, le credenziali AWS, ecc.?Come passare le variabili di ambiente quando si avvia a livello di codice un nuovo Amazon EC2 dall'immagine?
risposta
http://alestic.com/2009/06/ec2-user-data-scripts spiega come farlo con i dati utente. per ottenere informazioni sull'uso di Java, vedere AmazonEC2 launch with userdata.
nota che ho visto menzionare che questo non funziona con Windows, solo Unix.
[update] più dati su come impostare le variabili d'ambiente qui: https://forums.aws.amazon.com/message.jspa?messageID=139744
[dopo molte prove] per me, riecheggiando le variabili di ambiente in/etc/environment funziona meglio, in questo modo:
reservation = connection.run_instances(image_id = image_id,
key_name = keypair,
instance_type = 'm1.small',
security_groups = ['default'],
user_data = '''#!/bin/sh\necho export foozle=barzle >> /etc/environment\n''')
poi al momento del login:
[email protected]:~$ echo $foozle
barzle
È anche possibile utilizzare il recupero di metadati esempio come spiegato al http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
Dal documento di cui sopra, la seguente richiesta GET sarebbe recuperare i dati degli utenti per un'istanza se si esegue dall'interno dell'istanza:
GET http://169.254.169.254/latest/user-data
In questo modo, i dati degli utenti possono essere recuperati in modo dinamico anche dopo che l'istanza è già avviato e in esecuzione.
DISCLAIMER: Io non sono un amministratore di sistema!
Uso un bucket S3 sicuro che indica un bucket a cui solo l'istanza che si sta avviando ha accesso. È possibile impostare un ruolo IAM che assomiglia:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "arn:aws:s3:::some-secure-bucket/*"
}
]
}
Quindi è possibile caricare il file .env
in quel secchio (conservarlo criptato). Poi per accedervi sul istanza EC2, è possibile utilizzare gli strumenti CLI AWS:
sudo apt-get install -y python-pip (for aws s3 CLI library)
sudo pip install awscli
aws s3 cp --region us-east-1 s3://some-secure-bucket/.some-dot-env-file output_file_path
Si può tirare questo file verso il basso quando il codice viene eseguito o opzionalmente farlo accadere al boot mettendo il suddetto comando cp
in un init script situato da qualche parte come /etc/init.d/download_credentials.sh
Penso che questa sia una buona opzione per scaricare cose che ogni istanza che utilizza un AMI ha bisogno di credenziali. Tuttavia, se si desidera specificare i metadati per istanza, ho implementato semplicemente tag che ritengo siano validi. Per fare questo, alterare il ruolo IAM di cui sopra con qualcosa di più simile:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "arn:aws:s3:::some-secure-bucket/*"
},
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeTags"
],
"Resource": "*"
}
]
}
Poi installare ec2-api-tools
sudo sed -i.dist 's,universe$,universe multiverse,' /etc/apt/sources.list
sudo apt-get update
sudo apt-get install -y ec2-api-tools
E ora si dovrebbe essere in grado di ottenere per ogni istanza dei metadati attraverso i tag, come ad esempio il "Nome "dell'istanza:
ec2-describe-tags --filter resource-id="$(ec2metadata --instance-id)" --filter "key=Name" | cut -f5
Nota: faccio schifo a bash così sto spogliando il nome in ruby, ma si potrebbe usare tr
per rimuovere il ritorno a capo, se siete in esso!
Ottima soluzione, Tony. Ho finito per fare qualcosa di simile, ma ho inserito il mio intero script 'Instance-Init.sh' in un bucket crittografato e l'ho inserito in istanza. Il mio attuale script User-Data sta semplicemente installando Python, pip, was-cli e quindi scaricando ed eseguendo lo script 'reale' 'Instance-Init.sh'. Puoi vedere la mia domanda simile qui: http://stackoverflow.com/questions/29932355/is-it-secure-to-store-ec2-user-data-shell-scripts-in-a-private-s3-bucket. Ma la grande domanda è, è davvero sicuro? – AJB
Ottima domanda @AJB. Se avessi questa domanda, parlerei direttamente con il supporto AWS e chattare con loro su "quanto sicuro" perché questa è davvero la domanda. So che è "abbastanza sicuro" per il mio caso d'uso. Una persona operatrice potrebbe probabilmente approfondire i dettagli. Inoltre, su una nota non correlata, sto attualmente utilizzando l'istanza "user data" dei tag poiché ho trovato che i tag sono un enorme problema da gestire da una prospettiva del ciclo di vita dell'istanza – Tony