通过与S3交互的Elastic Beanstalk部署Flask应用程序

时间:2015-11-04 02:15:38

标签: python amazon-web-services flask

我有一个看起来像这样的Flask应用程序:

from flask import Flask
import boto3

application = Flask(__name__)

@application.route("/")
def home():
    return "Server successfully loaded"

@application.route("/app")
def frontend_from_aws():
    s3 = boto3.resource("s3")
    frontend = s3.Object(bucket_name = "my_bucket", key = "frontend.html")
    return frontend.get()["Body"].read()

if __name__ == "__main__":
    application.debug = True
    application.run()

当我在本地测试时,一切都很完美,但当我将应用程序部署到Elastic Beanstalk时,第二个端点会出现内部服务器错误:

  

服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序出错。

我没有在日志中看到任何令人担忧的事情,但我不完全确定我知道在哪里看。有什么想法吗?

更新:作为测试,我将frontend.html移动到另一个存储桶并相应地修改了“/ app”端点,并且神秘地工作正常。显然,这与原始存储桶的设置有关。有人知道什么是正确的设置吗?

2 个答案:

答案 0 :(得分:0)

您是否在Elastc Beanstalk实例上设置了AWS凭据,因为它们位于本地计算机上(即〜/ .aws /凭证中)?

答案 1 :(得分:0)

我找到了一个快速而又脏的解决方案:IAM策略(AWS控制台 - >身份和访问管理 - >策略)。有一个名为AmazonS3FullAccess的现有策略,在我将aws-elasticbeanstalk-ec2-role附加到其后,我的应用程序能够随意读取和写入S3。我猜测通过创建自定义角色和策略可以实现更微妙的访问管理,但这对我的目的来说已经足够了。