2017-07-14 112 views
2

我正在使用Flask和Zappa部署到AWS Lambda,但我的一个需要超过300秒的时间来执行,因此lambda关闭。如何使用Python和Zappa获得AWS Lambda剩余时间?

我想在恰好完成工作之前调用另一个lambda,是否可以使用Zappa获得剩余时间?

+0

你有权访问Python Lambda代码中的上下文对象? – stdunbar

+0

这就是问题所在,我不知道如何访问上下文对象@stdunbar –

回答

2

下面是一个简单的应用程序,我建

from flask import Flask, jsonify, request 
import time 
import traceback 

app = Flask(__name__) 

@app.route("/") 
def index(): 
    return jsonify(traceback.format_stack()) 

if __name__ == "__main__": 
    app.run() 

这给了我回溯

[ 
" File "/var/runtime/awslambda/bootstrap.py", line 534, in <module> main() ", 
" File "/var/runtime/awslambda/bootstrap.py", line 529, in main handle_event_request(request_handler, invokeid, event_body, context_objs, invoked_function_arn) ", 
" File "/var/runtime/awslambda/bootstrap.py", line 249, in handle_event_request result = request_handler(json_input, context) ", 
" File "/var/task/handler.py", line 511, in lambda_handler return LambdaHandler.lambda_handler(event, context) ", 
" File "/var/task/handler.py", line 242, in lambda_handler return handler.handler(event, context) ", 
" File "/var/task/handler.py", line 454, in handler response = Response.from_app(self.wsgi_app, environ) ", 
" File "/var/task/werkzeug/wrappers.py", line 903, in from_app return cls(*_run_wsgi_app(app, environ, buffered)) ", 
" File "/var/task/werkzeug/test.py", line 884, in run_wsgi_app app_rv = app(environ, start_response) ", 
" File "/var/task/zappa/middleware.py", line 70, in __call__ response = self.application(environ, encode_response) ", 
" File "/var/task/flask/app.py", line 1997, in __call__ return self.wsgi_app(environ, start_response) ", 
" File "/var/task/flask/app.py", line 1982, in wsgi_app response = self.full_dispatch_request() ", 
" File "/var/task/flask/app.py", line 1612, in full_dispatch_request rv = self.dispatch_request() ", 
" File "/var/task/flask/app.py", line 1598, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) ", 
" File "/var/task/myapp.py", line 8, in index return jsonify(traceback.format_stack()) " 
] 

回溯向我指出

https://github.com/Miserlou/Zappa/blob/f7a785351450fa9115864c7dfe223660f5a99ae6/zappa/handler.py#L454

只是它具有

# We are always on https on Lambda, so tell our wsgi app that. 
environ['HTTPS'] = 'on' 
environ['wsgi.url_scheme'] = 'https' 
environ['lambda.context'] = context 

这些填充在请求的WSGI应用程序环境中。这可以通过flask.request.environ.get访问。于是我改变了代码,以

from flask import Flask, jsonify, request 
import time 
import traceback 

app = Flask(__name__) 

@app.route("/") 
def index(): 
    context = request.environ.get('lambda.context', None) 
    if context is not None: 
     before = context.get_remaining_time_in_millis() 
     time.sleep(1) 
     after = context.get_remaining_time_in_millis() 
     return "Time Before={}\nTime After={}".format(before, after) 
    return jsonify(traceback.format_stack()) 

if __name__ == "__main__": 
    app.run() 

,反应也如预期

Time Before After

PS:详细的解决方案,让您了解如何找到解决这些问题