64 votes

Comment accéder à une variable d'environnement AWS Lambda à partir de Python

En utilisant la nouvelle prise en charge des variables d'environnement dans AWS Lambda , j'ai ajouté une variable env via le webui pour ma fonction.

Comment puis-je y accéder à partir de Python? J'ai essayé:

 import os

MY_ENV_VAR = os.environ['MY_ENV_VAR']
 

mais ma fonction a cessé de fonctionner (si je code en dur la valeur appropriée pour MY_ENV_VAR cela fonctionne bien).

67voto

SkyWalker Points 7044

AWS Lambda variables d'environnement peuvent être définies à l'aide de la Console AWS, CLI, ou des Kits de développement logiciel. Voici comment vous pouvez définir une AWS Lambda qui utilise une variable d'environnement LD_LIBRARY_PATH à l'aide d'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

Une fois créés, les variables d'environnement peuvent être lues à l'aide du support de la langue de votre offre pour accéder à l'environnement, par exemple à l'aide de processus.env pour Node.js. Lors de l'utilisation de Python, vous devez importer les os de la bibliothèque, comme dans l'exemple suivant:

...
import os
...
print("environment variable: " + os.environ['variable'])

Ressources Lien:

AWS Lambda prend Désormais en charge les Variables d'Environnement



En supposant que vous avez créé .fichier env côtés de vos paramètres de module.

.
├── .env
└── settings.py

Ajoutez le code suivant à votre settings.py

# settings.py
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

Alternativement, vous pouvez utiliser find_dotenv() méthode qui va essayer de trouver un .fichier de configuration par (a) de deviner par où commencer utilisation du fichier ou le répertoire de travail -- qui permet de travailler en non-fichier des contextes tels que IPython portable et le REPL, puis (b) à pied jusqu'à l'arborescence de répertoires à la recherche pour le fichier spécifié -- appelé .env par défaut.

from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())

Maintenant, vous pouvez accéder aux variables, soit à partir d'une variable d'environnement système ou de chargé de .fichier env.

Ressources Lien:

https://github.com/theskumar/python-dotenv



gepoggio répondu dans ce post: https://github.com/serverless/serverless/issues/577#issuecomment-192781002

Une solution de contournement consiste à utiliser python-dotenv: https://github.com/theskumar/python-dotenv

import os
import dotenv

dotenv.load_dotenv(os.path.join(here, "../.env"))
dotenv.load_dotenv(os.path.join(here, "../../.env"))

Il essaie de charger deux fois parce que quand couru localement il est dans projet/.env et lors de l'exécution de l'onu Lambda la .env est situé dans projet/composant/.env

12voto

Daniel Cortés Points 359

J'ai utilisé ce code; il inclut les deux cas, en définissant la variable à partir du gestionnaire et en la définissant de l'extérieur du gestionnaire.

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Trying new lambda stuff"""
import os
import configparser

class BqEnv(object):
    """Env and self variables settings"""
    def __init__(self, service_account, configfile=None):
        config = self.parseconfig(configfile)
        self.env = config
        self.service_account = service_account

    @staticmethod
    def parseconfig(configfile):
        """Connection and conf parser"""
        config = configparser.ConfigParser()
        config.read(configfile)
        env = config.get('BigQuery', 'env')
        return env

    def variable_tests(self):
        """Trying conf as a lambda variable"""
        my_env_var = os.environ['MY_ENV_VAR']
        print my_env_var
        print self.env
        return True

def lambda_handler(event, context):
    """Trying env variables."""
    print event
    configfile = os.environ['CONFIG_FILE']
    print configfile
    print type(str(configfile))
    bqm = BqEnv('some-json.json', configfile)
    bqm.variable_tests()
    return True
 

J'ai essayé cela avec un fichier de configuration de démonstration qui a ceci:

 [BigQuery]
env = prod
 

Et le réglage sur lambda était le suivant: variables env

J'espère que cela peut vous aider!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X