llaves
usando el nuevo compatibilidad con variables de entorno en AWS Lambdahe agregado un env var a través de webui para mi función.
¿Cómo accedo a esto desde Python? Lo intenté:
import os
MY_ENV_VAR = os.environ['MY_ENV_VAR']
pero mi función dejó de funcionar (si codifico el valor relevante para MY_ENV_VAR
funciona bien).
Andante del cielo
Las variables de entorno de AWS Lambda se pueden definir mediante la consola, la CLI o los SDK de AWS. Así es como definiría un AWS Lambda que usa una variable de entorno LD_LIBRARY_PATH usando 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
Una vez creadas, las variables de entorno se pueden leer usando el soporte que proporciona su idioma para acceder al entorno, por ejemplo, usando process.env para Node.js. Al usar Python, deberá importar la biblioteca del sistema operativo, como en el siguiente ejemplo:
...
import os
...
print("environment variable: " + os.environ['variable'])
Enlace de recursos:
AWS Lambda ahora admite variables de entorno
Suponiendo que haya creado el archivo .env junto con su módulo de configuración.
.
├── .env
└── settings.py
Agregue el siguiente código a su configuración.py
# settings.py
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
Alternativamente, puede usar el método find_dotenv() que intentará encontrar un archivo .env al (a) adivinar dónde comenzar a usar expediente o el directorio de trabajo, lo que permite que esto funcione en contextos sin archivos, como cuadernos IPython y REPL, y luego (b) subir por el árbol de directorios en busca del archivo especificado, llamado .env de forma predeterminada.
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())
Ahora, puede acceder a las variables desde la variable de entorno del sistema o cargadas desde el archivo .env.
Enlace de recursos:
https://github.com/theskumar/python-dotenv
gepoggio respondió en esta publicación: https://github.com/sinservidor/sinservidor/issues/577#issuecomment-192781002
Una solución es usar python-dotenv:
https://github.com/theskumar/python-dotenvimport os import dotenv dotenv.load_dotenv(os.path.join(here, "../.env")) dotenv.load_dotenv(os.path.join(here, "../../.env"))
Intenta cargarlo dos veces porque cuando se ejecuta localmente está en proyecto/.env y cuando se ejecuta en Lambda, el .env se encuentra en proyecto/componente/.env
-
El objetivo de usar variables de entorno aquí suele ser separar la información confidencial, como las credenciales para el acceso al servicio remoto, del código que se almacena en el control de revisión para que cualquiera pueda verlo. También permite la composición en tiempo de ejecución de estos valores para que prod pueda tener diferentes configuraciones para probar, por ejemplo. Rellenarlos en un archivo junto con el código es solo un poco más útil que la codificación dura.
– Dave
26 de noviembre de 2019 a las 1:30
Ambas cosas
import os
os.getenv('MY_ENV_VAR')
Y
os.environ['MY_ENV_VAR']
son soluciones factibles, solo asegúrese de que en la GUI de lambda las variables ENV estén realmente allí.
Usé este código; incluye ambos casos, establecer la variable desde el controlador y establecerla desde fuera del controlador.
#!/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
Intenté esto con un archivo de configuración de demostración que tiene esto:
[BigQuery]
env = prod
Y la configuración en lambda fue la siguiente:
¡Espero que esto pueda ayudar!
os.environ["variable_name"]
En la sección de configuración de AWS lambda, asegúrese de declarar la variable con el mismo nombre a la que intenta acceder aquí. Para este ejemplo, debe ser variable_name
¿Está seguro de que su env var está realmente configurado en el proceso que ejecuta el script y no solo en otro proceso en el que tiene una terminal abierta?
– Charles D Pantoga
2 de diciembre de 2016 a las 18:01
¿Puedes darnos más información? Lo probé con un pequeño script como este: import os def lambda_handler(evento, contexto): my_env_var = os.environ[‘MY_ENV_VAR’] print my_env_var print str(type(my_env_var)) y funciona bien devolviendo una variable de tipo cadena. Si me cuentas un poco más tal vez te pueda ayudar.
– Daniel Cortés
23 de enero de 2017 a las 17:51
@DanielCortés Gracias por el comentario. no estoy configurando
MY_ENV_VAR = os.environ['MY_ENV_VAR']
desde dentro de lalambda_handler
función. ¿Puede ser ese el problema? ¿Puedes intentar configurarMY_ENV_VAR
en el nivel del módulo y ver si eso funciona?– llaves
28 de enero de 2017 a las 10:53
@keybits Acabo de probar eso y todavía funcionó. Escribiré una respuesta para incluir mi código y capturas de pantalla de la configuración lambda, tal vez algo allí pueda ayudarlo.
– Daniel Cortés
31 de enero de 2017 a las 15:04
¿Alguna respuesta resolvió el problema?
– Efrén
5 de julio de 2018 a las 7:41