Как получить доступ к переменной среды AWS Lambda из Python

Используя новую поддержку переменных окружения в AWS Lambda, я добавил env var через webui для моей функции.

Как мне получить доступ к этому из Python? Я пробовал:

import os

MY_ENV_VAR = os.environ['MY_ENV_VAR']

но моя функция перестала работать (если я жестко закодирую соответствующее значение для MY_ENV_VAR, он отлично работает).

Ответы

Ответ 1

Переменные среды AWS Lambda могут быть определены с помощью консоли AWS, CLI или SDK. Вот как вы бы определили ЛВЛС AWS, которая использует переменную среды LD_LIBRARY_PATH с помощью 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

После создания переменные среды могут быть прочитаны с использованием поддержки, которую ваш язык предоставляет для доступа к среде, например. используя process.env для Node.js. При использовании Python вам нужно будет импортировать библиотеку os, как в следующем примере:

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

Ссылка на ресурс:

AWS Lambda теперь поддерживает переменные среды



Предполагая, что вы создали файл .env вдоль вашего модуля настроек.

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

Добавьте следующий код в свой 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)

В качестве альтернативы вы можете использовать метод find_dotenv(), который попытается найти файл .env, выполнив (а) угадав, с чего начать использовать файл или рабочий каталог - файлов, таких как ноутбуки IPython и REPL, а затем (b) подойдя к дереву каталогов, ища указанный файл по имени .env по умолчанию.

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

Теперь вы можете получить доступ к переменным либо из переменной системной среды, либо загрузиться из файла .env.

Ссылка на ресурс:

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



gepoggio ответил в этом сообщении: https://github.com/serverless/serverless/issues/577#issuecomment-192781002

Обходным путем является использование 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"))

Он пытается загрузить его дважды, потому что при локальном запуске он project/.env и при запуске un Lambda.env находится в Проект/компонент/.env

Ответ 2

Я использовал этот код; он включает оба случая, устанавливая переменную из обработчика и устанавливая ее извне обработчика.

#!/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

Я попробовал это с демо-конфигурационным файлом, который имеет это:

[BigQuery]
env = prod

И настройка на лямбда была следующей: env variables

Надеюсь, это поможет!