打印到文件 Beanstalk Worker层(Python)
我之前问过类似的问题,但没有得到任何有用的回复。所以,我决定尽量简化一下,看看能不能更清楚地表达我的问题:
我开发了一个用Python写的Flask应用,并把它部署到了Beanstalk的工作环境里。现在的问题是,我不知道怎么在任何地方打印、记录或者写入信息。我需要调试这个应用,而我知道的唯一方法就是通过打印到控制台或者日志文件,来查看到底发生了什么。当我在本地运行这个应用时,我可以毫无问题地打印到控制台、写入文件和记录信息,但一旦部署到Beanstalk环境,就什么都没有发生。我已经通过SSH连接到了我部署应用的EC2实例,几乎检查了所有文件,发现我的Python脚本根本没有在任何地方写入内容。
这个问题可能听起来很傻,但能不能请大家给我一个在Beanstalk工作环境中运行的Python Flask应用的例子,要求是能把“Hello World”打印到某个我能在EC2实例上找到的文件里?请告诉我requirements.txt文件里应该写什么,以及.ebextensions文件夹中的任何*.config文件内容。
谢谢!
2 个回答
在AWS的应用管理博客上,有一个关于使用Python和Flask的Elastic Beanstalk示例:
http://blogs.aws.amazon.com/application-management/post/Tx36JL4GPZR4G98/A-Sample-App-For-Startups
关于日志问题,我建议:
查看你的
/var/log/eb-cfn-init.log
(以及这个目录下的其他日志文件),如果有 .config 命令失败,你可以看到具体是哪个命令失败以及原因。在你的 .config 命令中,将输出信息写入一个不同的日志文件,这样你就能清楚地看到你的启动过程在哪一步失败了。
把你的应用日志文件添加到EB日志快照(/
opt/elasticbeanstalk/tasks/taillogs.d/
)和EB S3日志轮换(/opt/elasticbeanstalk/tasks/publishlogs.d/
)中。可以查看这些目录下的其他文件作为示例。
这里有一个简单的Python应用程序,你可以试试。博客里提到的那个也可以用,但这个例子展示了一个最基本的应用,它会把从SQS收到的消息打印到EC2实例上的一个文件里。
你的应用源文件夹应该包含以下文件:
application.py
import os
import time
import flask
import json
application = flask.Flask(__name__)
start_time = time.time()
counter_file = '/tmp/worker_role.tmp'
@application.route('/', methods=['GET', 'POST'])
def hello_world():
if flask.request.method == 'POST':
with open(counter_file, 'a') as f:
f.write(flask.request.data + "\n")
return flask.Response(status=200)
if __name__ == '__main__':
application.run(host='0.0.0.0', debug=True)
requirements.txt
Flask==0.9
Werkzeug==0.8.3
.ebextensions/01-login.config
option_settings:
- namespace: aws:autoscaling:launchconfiguration
option_name: EC2KeyName
value: your-key-name
启动一个worker tier 1.1的环境,使用Python 2.7的解决方案栈。我测试的是(64位的Amazon Linux 2014.03 v1.0.4,运行Python 2.7)。
等环境变成绿色后,点击控制台中显示的队列URL。这会带你到SQS控制台页面。右键点击队列,然后选择“发送消息”。接着输入以下消息:{"hello" : "world"}
。
通过SSH连接到EC2实例,打开文件/tmp/worker_role.tmp
。你应该能在这个文件里看到你的消息。
确保你已经正确配置了IAM策略,以便使用Worker Role环境。有关IAM策略的更多信息,可以参考这个回答:https://stackoverflow.com/a/23942498/161628