2017-04-16 16 views
0

awsラムダ関数からハッシュを返すにはどうすればよいですか?awsラムダの戻り変数

boto3モジュールを使用しています。

は、ここに私のコードは

def lambda_handler(event, context): 
    global cnt 
    any = [] 

    for node in ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]): 

     inst= node.instance_type 
     any.append(inst) 
    cnt=collections.Counter(any) 
    return cnt 


for key, val in cnt.items(): 
    print key 
    print val 

正確なコードはPythonのIDEで動作チョキです。私の目標は、AWSラムダ関数から変数を返し、同じラムダ関数で他の関数で使用することです。ラムダログの

エラー

module initialization error: global name 'cnt' is not defined 

答えて

2

編集:あなたは、エラーメッセージを追加した後、問題は単にトップスコープでグローバルに宣言したされていないようです。 this answerを参照してください。それに応じてサンプルを修正します。

AWSは必要に応じてコンテナにコードをロードし、次にLambda Function Handlerプロパティで指定されたメソッドを呼び出します。この関数はエラーを発生させたり、AWSが呼び出し元に返すデータを返したりすることができます(API Gatewayメソッドなど)。

だから、あなたはできる例えば:

cnt = [] 

def lambda_handler(event, context): 
    global cnt 
    cnt = [{'id': 1, 'label': 'One'}, {'id': 2, 'label': 'Two'}] 
    print "cnt: {0!s}".format(cnt) 
    other_method() 
    return cnt 

def other_method(): 
    global cnt 
    print "cnt length is: {0!s}.format(len(cnt)) 
    return 

(私はまだAWSでのテストにこれを行って、その可能性のあるエラーの気をつけていなかった) しかし、間違いなく、あなたにもlambda_handlerを持っているかもしれませんメソッドは、引数としてcnt変数をother_methodに渡します。 または、クラスを作成してその上で何らかのメソッドを呼び出し、そのクラスにcnt変数をそれ自身のデータとして管理させます(例:保護された変数を介して)。

グローバルは、任意のラムダへの連続コールの間に存続することもあれば、存続しないこともあります。 Understanding Container Reuse in AWS Lambdaを参照してください。

はHTH

+1

ありがとう、lamda関数での呼び出し関数が含まれています。出来た – Chucks

1

AWSは、定義したラムダエントリポイントを呼び出します、そしてそれを返すと、ラムダ・プロセスは終了します。それらの関数があなたのエントリーポイントによって呼び出されない限り、他の関数でグローバルを使用する機会はありません。エントリポイントによって他の関数が呼び出されている場合は、cntをパラメータとして渡すことができます。グローバルは必要ありません。あなたのエントリーポイントで他の関数が呼び出されていない場合、それらはまったく実行されません。グローバルは必要ありません。