打印到文件 Beanstalk Worker层(Python)

1 投票
2 回答
1262 浏览
提问于 2025-04-18 11:04

我之前问过类似的问题,但没有得到任何有用的回复。所以,我决定尽量简化一下,看看能不能更清楚地表达我的问题:

我开发了一个用Python写的Flask应用,并把它部署到了Beanstalk的工作环境里。现在的问题是,我不知道怎么在任何地方打印、记录或者写入信息。我需要调试这个应用,而我知道的唯一方法就是通过打印到控制台或者日志文件,来查看到底发生了什么。当我在本地运行这个应用时,我可以毫无问题地打印到控制台、写入文件和记录信息,但一旦部署到Beanstalk环境,就什么都没有发生。我已经通过SSH连接到了我部署应用的EC2实例,几乎检查了所有文件,发现我的Python脚本根本没有在任何地方写入内容。

这个问题可能听起来很傻,但能不能请大家给我一个在Beanstalk工作环境中运行的Python Flask应用的例子,要求是能把“Hello World”打印到某个我能在EC2实例上找到的文件里?请告诉我requirements.txt文件里应该写什么,以及.ebextensions文件夹中的任何*.config文件内容。

谢谢!

2 个回答

1

在AWS的应用管理博客上,有一个关于使用Python和Flask的Elastic Beanstalk示例:

http://blogs.aws.amazon.com/application-management/post/Tx1Y8QSQRL1KQZC/Elastic-Beanstalk-Video-Tutorial-Worker-Tier

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/)中。可以查看这些目录下的其他文件作为示例。

1

这里有一个简单的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

撰写回答