使用aws提供动态网页?

时间:2017-06-01 02:06:48

标签: python amazon-web-services flask aws-lambda aws-api-gateway

我是AWS的新手,想了解如何使用AWS部署动态网站。我来自一个自我托管的角度(digitalocean + flask应用程序),所以我对AWS的过程究竟是什么感到困惑。

使用自托管解决方案,过程类似于:

  • 用户向我的服务器发出请求(nginx)
  • nginx然后将请求定向到我的烧瓶应用程序
  • flask app处理特定路线(即GET /用户)
  • flask执行db操作,然后使用jinja2和db操作的结果构建一个html页面
  • 将html返回给用户,用户的浏览器呈现页面。

使用 AWS ,我了解以下内容:

  • 用户向亚马逊的API网关(即GET /用户)发出请求
  • API Gateway可以调用AWS Lambda函数
  • AWS Lambda函数执行db函数或其他任何操作,返回一些数据
  • API Gateway将结果返回为JSON(假设我将content-type设置为JSON)

令人困惑的部分是如何为用户生成网页,而不仅仅是返回JSON数据?我看到两个选择:

1)以某种方式让AWS Lambda使用Jinja2模块,并在查询db for data之后使用它来构建HTML页面。 API网关将只返回完成的HTML文本。缺点是这将不再是纯粹的api,因此我失去了灵活性。

2)将Flask应用程序部署到Amazon Beanstalk。 Flask处理应用程序代码,例如会话处理,路由,HTML模板生成,并调用Amazon的API网关以获取页面的任何必要数据。

我认为(2)是做事的“正确”方式;我得到了使用Beanstalk扩展烧瓶应用程序的好处,并且我可以灵活地使用API​​网关调用API。

我错过了什么吗?我是否误解了(2)服务网页的内容?是否存在另一种方式来托管动态网站而不使用像Flask通过AWS这样的Web框架,这是我不知道的?

2 个答案:

答案 0 :(得分:1)

使用lambda和不使用EC2托管服务器的推荐方法是:

  • 在S3(html,css,js)上托管您的前端静态文件。
  • 将S3存储桶配置为静态Web服务器
  • 配置lambda以进行动态处理,并使用API​​-gateway
  • 将其打开到外部
  • 你的JS通过API网关调用lambda,所以不要忘记激活CORS(在S3存储桶和API网关上)。
  • 配置route53以将其与您的存储桶相关联(您的route53配置必须与您的存储桶同名),这样您就可以使用自己的DNS名称,而不是通用的S3-webserver网址

答案 1 :(得分:1)

您必须权衡通过API GW和Lambda为动态网站提供服务的优缺点。

优点:

  • 低音量可能更便宜
  • 不必担心缩放
  • Lambda函数比beanstalk更容易管理。

缺点:

  • 会有一些延迟开销
  • 在某些方面不太灵活,虽然Python得到很好的支持,你应该能够导入jinja2模块。

您提出的两种解决方案都能很好地运作,这取决于您如何看待利弊。