2016-03-26 22 views
20

Sto scrivendo un'applicazione che voglio eseguire come funzione AWS Lambda ma anche rispettare le linee guida dell'app Twelve-Factor. In particolare Part III. Config che richiede l'uso di variabili ambientali per la configurazione.Come posso utilizzare le variabili ambientali su AWS Lambda?

Tuttavia, non riesco a trovare un modo per impostare le variabili ambientali per le istanze AWS Lambda. Qualcuno può indicarmi la giusta direzione?

Se non è possibile utilizzare le variabili ambientali, si consiglia di utilizzare un metodo per utilizzare le variabili ambientali per lo sviluppo locale e convertirle in un sistema di configurazione valido a cui è possibile accedere utilizzando il codice dell'applicazione in AWS.

Grazie.

+0

Lambda non è come altre funzioni, ci sono molte restrizioni. Che cosa stai cercando di configurare esattamente? – helloV

+0

Credenziali AWS, dettagli del database e simili. Potrei includere un file config.json o qualcosa di simile, ma preferirei attenermi a variabili di env in stile a dodici fattori. Rendono meno probabile che espongano un segreto al mondo tramite il controllo del codice sorgente. – DanTonyBrown

risposta

4

Non esiste alcun modo per configurare le variabili di env per l'esecuzione lambda poiché ogni chiamata è disgiunta e nessuna informazione di stato è memorizzata. Tuttavia ci sono modi per ottenere ciò che vuoi.

AWS credentials - è possibile evitare di memorizzarlo in variabili env. Concedi invece i privilegi al tuo ruolo LambdaExec. Di fatto, AWS consiglia di utilizzare ruoli anziché credenziali AWS.

Database details: un suggerimento è di memorizzarlo in un file ben noto in un bucket privato. Lambda può scaricare quel file quando viene richiamato, leggere i contenuti che possono contenere dettagli del database e altre informazioni. Poiché il bucket è privato, altri non possono accedere al file. Il ruolo LambdaExec richiede i privilegi IAM per accedere al bucket privato.

+0

KMS è una soluzione migliore (e consigliata?) IMHO, c'è [un esempio qui] (http://stackoverflow.com/questions/29372278/aws-lambda-how-to-store-secret-to-external-api) – Hang

+1

@Hang, sì ho dimenticato di menzionare KMS. È una buona soluzione, ma hai a che fare con chiavi e segreti AWS che eviterei. È necessario mantenere il file. I ruoli IAM sono facili da revocare rispetto alle credenziali archiviate in un file. – helloV

+1

Il file su S3 non è crittografato, questa è la mia preoccupazione. Potrei essere paranoico, ma essere grigliato da infosec, lo sai. – Hang

5

Forse caratteristica del nodo-lambda le 'variabili d'ambiente su misura' permetterebbe di affrontare le vostre preoccupazioni:

https://www.npmjs.com/package/node-lambda
https://github.com/motdotla/node-lambda

"AWS Lambda non consente di impostare le variabili d'ambiente per la vostra funzione, ma in in molti casi è necessario configurare la funzione con valori sicuri che non si desidera controllare nel controllo della versione, ad esempio una stringa di connessione DB o una chiave di crittografia. Utilizzare il file deploy.env di esempio in combinazione con il flag --configFile imposta i valori che verranno anteposti alla funzione Lambda compilata come process.env environmentme variabili nt prima che vengano caricate su S3. "

1

Abbiamo anche questo requisito per la nostra funzione Lambda e abbiamo "risolto" questo generando un file ENV sulla nostra piattaforma CI (nel nostro caso questo è CircleCI). Questo file viene incluso nell'archivio che viene distribuito a Lambda. Ora nel tuo codice puoi includere questo file e usare le variabili.

Lo script che uso per generare un file JSON dalle variabili d'ambiente CircleCI è:

cat >dist/env.json <<EOL 
{ 
"CLIENT_ID": "$CLIENT_ID", 
"CLIENT_SECRET": "$CLIENT_SECRET", 
"SLACK_VERIFICATION_TOKEN": "$SLACK_VERIFICATION_TOKEN", 
"BRANCH": "$CIRCLE_BRANCH" 
} 
EOL 

Mi piace questo approccio, perché in questo modo non c'è bisogno di includere variabili specifiche di ambiente nel repository.

+1

Faccio qualcosa di simile a questo eccetto che ho il mio CI che crea un file JavaScript wrapper che popola 'process.env' con le variabili d'ambiente note all'elemento della configurazione. Esporta una funzione di handler "pass through" che chiama semplicemente 'require ('./'). Handler (event, context, done)' per invocare il gestore reale. Quindi scrivo quel file nella directory zip di primo livello come "$ {COMMIT_SHA} .js" e aggiorno la mia funzione lambda per impostare la proprietà "gestore" su "$ {COMMIT_SHA} .handler". – idbehold

+0

@ idea incredibile idée! –

14

A partire dal 18 novembre 2016, AWS Lambda supports variabili di ambiente.

Le variabili di ambiente possono essere specified entrambe utilizzando la console AWS e la CLI di AWS.Questo è come si dovrebbe creare una lambda con una variabile d'ambiente LD_LIBRARY_PATH utilizzando AWS CLI:

aws lambda create-function \ 
    --region us-east-1 
    --function-name myTestFunction 
    --zip-file fileb://path/package.zip 
    --role role-arn 
    --environment Variables={LD_LIBRARY_PATH=/usr/bin/test/lib64} 
    --handler index.handler 
    --runtime nodejs4.3 
    --profile default 
1

AWS appena aggiunto il supporto per la configurazione delle funzioni lambda tramite parametri ambientali. Dai uno sguardo here

Problemi correlati