À l'aide de la nouvelle version prise en charge de la variable d'environnement dans AWS Lambda , j'ai ajouté une variable env via le webui pour ma fonction.
Comment puis-je accéder à cela depuis 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 pertinente pour MY_ENV_VAR
ça fonctionne bien).
Les variables d'environnement AWS Lambda peuvent être définies à l'aide de la console AWS, de la CLI ou des SDK. Voici comment définir un AWS Lambda qui utilise une variable d'environnement LD_LIBRARY_PATH à l'aide de l'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éées, les variables d’environnement peuvent être lues à l’aide du support fourni par votre langue pour accéder à l’environnement, par exemple. en utilisant process.env pour Node.js. Lorsque vous utilisez Python, vous devez importer la bibliothèque os, comme dans l'exemple suivant:
...
import os
...
print("environment variable: " + os.environ['variable'])
AWS Lambda prend maintenant en charge les variables d'environnement
En supposant que vous ayez créé le fichier .env avec votre module de paramètres.
.
├── .env
└── settings.py
Ajoutez le code suivant à votre fichier 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)
Sinon, vous pouvez utiliser la méthode find_dotenv () qui cherchera un fichier .env en (a) devinant par où commencer à utiliser le fichier ou le répertoire de travail - permettre à cette option de fonctionner dans des contextes autres que des fichiers tels que les cahiers IPython et le REPL, puis (b) parcourir l'arbre de répertoires à la recherche du 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 à partir d'une variable d'environnement système ou chargées à partir d'un fichier .env.
https://github.com/theskumar/python-dotenv
gepoggio a répondu à cet article: 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 le charger deux fois car lorsqu'il est exécuté localement, il se trouve dans project/.env et lorsqu'il exécute un Lambda, le fichier .env se trouve dans le projet/composant/.env.
J'ai utilisé ce code; il inclut les deux cas, définissant la variable à partir du gestionnaire et la définissant à 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é ceci avec un fichier de configuration démo qui a ceci:
[BigQuery]
env = prod
Et le réglage sur lambda était le suivant:
J'espère que cela peut aider!