web-dev-qa-db-ja.com

PythonからAWS Lambda環境変数にアクセスする方法

新しい AWS Lambdaでの環境変数のサポート を使用して、関数のwebuiを介してenv変数を追加しました。

Pythonからこれにアクセスするにはどうすればよいですか?私は試した:

import os

MY_ENV_VAR = os.environ['MY_ENV_VAR']

しかし、私の関数は動作を停止しました(MY_ENV_VARに関連する値をハードコーディングした場合、正常に動作します)。

40
keybits

AWS Lambda環境変数は、AWSコンソール、CLI、またはSDKを使用して定義できます。これは、AWS CLIを使用してLD_LIBRARY_PATH環境変数を使用するAWS Lambdaを定義する方法です。

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

作成された環境変数は、環境にアクセスするために言語が提供するサポートを使用して読み取ることができます。 Node.jsにprocess.envを使用します。 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()メソッドを使用して、(a)fileまたは作業ディレクトリの使用を開始する場所を推測することにより、.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にあり、Lambdaを実行しているときは.envはproject/component/.envにあるため、2回ロードしようとします。

43
SkyWalker

このコードを使用しました。ハンドラーから変数を設定する場合と、ハンドラーの外部から変数を設定する場合の両方が含まれます。

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

これが役立つことを願っています!

9
Daniel Cortés