0

私のラムダスクリプトで環境変数を設定または変更したいと思います。 私のスクリプトの次の呼び出しの値を保存する必要があります。 例としては、aws lambdaコンソールで環境変数を作成し、値を設定しないでください。その後、私はこれを試してみる:AWSラムダ環境変数をPythonで設定または変更するboto3

import boto3 
import os 

if os.environ['ENV_VAR']: 
    print(os.environ['ENV_VAR']) 
os.environ['ENV_VAR'] = "new value" 

この場合、私の価値は決して印刷されません。 私は試しました:

os.putenv() 

でも同じ結果です。 この環境変数が設定されていない理由が分かりますか?

ありがとうございました!

答えて

1

私のスクリプトの次の呼び出しの値を保存する必要があります。

これは、環境変数がどのように動作するか、ラムダの動作方法ではありません。環境変数は、親の子プロセスに設定することはできません。プロセスは、独自のプロセス環境と子プロセス環境でしか環境変数を設定できません。

これは、シェルで環境変数を設定すると混乱するかもしれませんが、その場合、シェルは長時間実行されているプロセス設定であり、環境変数を取得するプログラムではありません。

は、この例を考えてみましょう:

from os import environ 
print environ['A'] 
environ['A'] = "Set from python" 
print environ['A'] 

これは自分自身のためにENV Aのみを設定します。何回か実行すると、Aの初期値は常にシェルの値になります。決してpythonが設定する値ではありません。

$ export A="set from bash" 
$ python t.py 
set from bash 
Set from python 
$ python t.py 
set from bash 
Set from python 

さらに、そうでない場合でも、aws lambdaでは確実に動作しません。 Lambdaは、その時点で利用可能な計算リソースがあれば、あなたのコードを実行します。通常は頻繁に実行される関数のランタイムをキャッシュするため、データを保存するためにファイルシステムにデータを書き込むことができます。しかし、そのランタイムで次の呼び出しが実行されなかった場合、データは失われます。

お客様のニーズに合わせて、の外側には、ラムダを保存します。明らかなオプションは、s3への書き込み、ダイナモへの書き込み、またはsqへの書き込みです。次の呼び出しはその場所から読み取り、望ましい結果を達成します。

0

AWSラムダは与えられた入力セットでコードを実行するだけです。実行されると、出力を返し、それだけです。次のコールのために出力を保持したい場合は、ダンが言ったようにDBまたはQueueに格納する必要があります。私は個人的にSNSと組み合わせてSQSを使用し、現在の状態に関する通知を私に送信します。成功または失敗のような最終結果をSQSに保存することもできます.SQSは、次のトリガーに使用できます。ここにオプションを投げれば、すべてあなたの必要条件に依存します。

1

boto3 lambdaコマンドupdate_function_configurationを使用して環境変数を更新することを検討してください。

response = client.update_function_configuration(
      FunctionName='test-env-var', 
      Environment={ 
       'Variables': { 
        'env_var': 'hello' 
       } 
      } 
     ) 
関連する問題