2016-05-10 8 views
0

これは単純なものでなければならない。PythonのAWS関数がLambdaを介してELBデータを返さない - コンソールで動作する

私は、次の基本的なPythonスクリプトを持っている:私は、コマンドライン上のPythonスクリプトを経由して、これを実行すると

import boto3 
elb = boto3.client('elb') 
print(elb.describe_load_balancers()) 

それは、すべてのロードバランサのためのすべての情報を返す、完璧に動作します。

CLIコマンドは、コマンドラインからも完璧に動作します:

aws elb describe-load-balancers 

をしかし、私はそれが失敗したAWSのラムダ関数にスクリプトを追加するとき。 このスクリプトは、AWSのラムダにどのように見えるかです:すべてのロードバランサのデータを返す他の人のように動作するはず

import boto3 

def lambda_handler(event, context): 
    elb = boto3.client('elb') 
    return elb.describe_load_balancers() 

は、しかし、それはこのエラーを返します。

{ 
    "stackTrace": [ 
    [ 
     "/usr/lib64/python2.7/json/__init__.py", 
     250, 
     "dumps", 
     "sort_keys=sort_keys, **kw).encode(obj)" 
    ], 
    [ 
     "/usr/lib64/python2.7/json/encoder.py", 
     207, 
     "encode", 
     "chunks = self.iterencode(o, _one_shot=True)" 
    ], 
    [ 
     "/usr/lib64/python2.7/json/encoder.py", 
     270, 
     "iterencode", 
     "return _iterencode(o, 0)" 
    ], 
    [ 
     "/var/runtime/awslambda/bootstrap.py", 
     41, 
     "decimal_serializer", 
     "raise TypeError(repr(o) + \" is not JSON serializable\")" 
    ] 
    ], 
    "errorType": "TypeError", 
    "errorMessage": "datetime.datetime(2013, 7, 26, 15, 35, 57, 690000, tzinfo=tzlocal()) is not JSON serializable" 
} 

私は私の髪を引っ張ってきましたこれまでこれで一日中アウトして何が間違っているのかは分からないので、どんな助けもありがたいです。私は、あなたが上記のコマンドに気づくかもしれ通り

import boto3 

def lambda_handler(event, context): 
    elb = boto3.client('elb') 
    return elb.describe_tags(LoadBalancerNames=[event['loadBalancer']]) 

は、私が代わりにそれらのすべてのロードバランサをspecifedています

は、余分な注意点として、私はうまくAWSラムダで働いて、この機能を取得することができました他の機能でもこれを試しましたが運がありません。

+0

戻り値をJSONにシリアル化できないようです。 LambdaのようにJSONに最終的な応答を変換していないので、ローカルで正常に動作します。レスポンスをJSON(それはdatetime値で失敗しているように見える)としてシリアル化できるものに変換するコードを追加する必要があります。 –

答えて

3

私はJim.Pで同じ参照を掘り下げ、自分のアカウントで試していました。 this answerは正しい実装で正しい結果を得ました:

import boto3 
import json 
import datetime 
from time import mktime 

class MyEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, datetime.datetime): 
      return int(mktime(obj.timetuple())) 
     return json.JSONEncoder.default(self, obj) 

def lambda_handler(event, context): 
    elb = boto3.client('elb') 
    return json.dumps(elb.describe_load_balancers(), cls = MyEncoder) 
+0

nice!余分なマイルを行く方法! ;-) –

+0

ありがとう、これは本当に私を助けてくれました。私が今すぐ見ることができる良いものの負荷:D – Zanmato

2

これは "python"固有のようで、あなたのローカルマシンでおそらく動作する理由は、あなたのラムダ関数に含まれていないPythonライブラリを持っているということです。あなたのエラーを説明する

いくつかの記事:ラムダPython用の展開パッケージの作成に関する

StackOverflow - 455580

StackOverflow - 11875770

とドキュメント:

Creating a Deployment Package (Python)

関連する問題