web-dev-qa-db-fra.com

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

À 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).

40
keybits

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'])

Lien de ressource:

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.

Lien de ressource:

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.

43
SkyWalker

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: env variables

J'espère que cela peut aider!

9
Daniel Cortés