程序员

[上手] 利用AWS ElasticBeanstalk 部署 F

2020-11-07  本文已影响0人  数科每日

本文基于 AWS 官方教程。 官方文档可能有些没有及时更新, 我在在此基础上,根据一些AWS实际变化, 添加了部分内容。

1. 本地创建虚拟开发环境

这部分具体步骤可以参考原文

#创建工作环境
>mkdir myeb
>cd myeb

# 安装  virtualenv
> sudo apt install virtualenv

#  创建虚拟Python环境,名字 :virt
> virtualenv virt

#  使用虚拟Python环境
> source virt/bin/activate

# 安装flask 
> pip install flask==1.0.2

> pip freeze
click==7.1.2
Flask==1.0.2
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
pkg-resources==0.0.0
Werkzeug==1.0.1

# 记录依赖包, requirements.txt 这个文件之后会被部署到 
> pip freeze > requirements.txt

注意:
上面展示 pip freeze 的内容是我服务器打印出来的内容, 和AWS 官方文档上面的不一样。
官方文档是:

click==6.7
Flask==1.0.2
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
Werkzeug==0.14.1

读者自己实践的时候, 也会有自己的版本。 在部署 Beanstalk 的时候,可能会遇到关于 requirements.txt 的报错。 如果自己解决不了, 可以直接使用官方文档中的内容, 自己生成一个requirements.txt 。 文件内容直接拷贝上面的内容就可以。

2. 创建 Flask 应用程序

把下面代码, 直接拷贝到一个 application.py 文件中就好。 application.py 需要自己新建,注意, 如果不知道如何配置, 不要修改文件名。 application.py 这个文件名已经被配置在配置文件中, 是一个默认值。

from flask import Flask

# print a nice greeting.
def say_hello(username = "World"):
    return '<p>Hello %s!</p>\n' % username

# some bits of text for the page.
header_text = '''
    <html>\n<head> <title>EB Flask Test</title> </head>\n<body>'''
instructions = '''
    <p><em>Hint</em>: This is a RESTful web service! Append a username
    to the URL (for example: <code>/Thelonious</code>) to say hello to
    someone specific.</p>\n'''
home_link = '<p><a href="/">Back</a></p>\n'
footer_text = '</body>\n</html>'

# EB looks for an 'application' callable by default.
application = Flask(__name__)

# add a rule for the index page.
application.add_url_rule('/', 'index', (lambda: header_text +
    say_hello() + instructions + footer_text))

# add a rule when the page is accessed with a name appended to the site
# URL.
application.add_url_rule('/<username>', 'hello', (lambda username:
    header_text + say_hello(username) + home_link + footer_text))

# run the app.
if __name__ == "__main__":
    # Setting debug to True enables debug output. This line should be
    # removed before deploying a production app.
    application.debug = True
    application.run()

创建完程序以后, 可以自己尝试在VM 上跑一下。

> python application.py
 * Serving Flask app "application" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 313-155-123

但是注意,如果是云虚拟机的话

  1. 代开VM 所在 Security Group 的 5000 端口(Flask 默认端口)

  2. 把上述代码中 application.run 那一行, 加上一个参数, 改动后代码如下:

    application.run(host='0.0.0.0')

3. 部署 Flask App 到 ElasticBeanstalk

首先需要先在 VM 上安装 EB CLI, 这部分请参考 Install the EB CLI 。EB CLI 安装好以后, 就可以在VM 中使用 eb 命令了。

这里演示的是如何创建一个新的 ElasticBeanstalk 环境, 并且部署 Flask App。

创建 .ebignore 文件,并在里面加上:

virt

是的,这个文件就包含这一个单词。 目的是避免 ElasticBeanstalk 打包程序把这个虚拟环境也打包了, 这个是本地的环境, 不需要部署到 ElasticBeanstalk。

创建ElasticBeanstalk 环境,并部署

初始化本地目录, 这一步会生成一个 .elasticbeanstalk 的隐藏文件夹( ls -all 命令可以看到)。

> eb init -p python-3.6 flask-tutorial --region us-east-2
Application flask-tutorial has been created.

配置 ElasticBeanstalk 的登录, 你VM 如果有 AWS Access Token 文件(比如选项1), 直接选1就好, 否则选2新建一个。

> eb init
Do you want to set up SSH for your instances?
(y/n): y
Select a keypair.
1) my-keypair
2) [ Create new KeyPair ]

生成配置文件

eb config

注意 1
执行完以后, 会进入Nano 的编辑界面,给你看一下要生成的配置文件, 不熟悉的小伙伴, 直接按 ctrl + x 退出即可。 这里示例程序不许修改任何配置。

image.png

注意 2
这一步, 官方文档里面没有说,但是我按照官方文档操作完以后, ElasticBeanstalk 会报错:

image.png

在参考了一篇帖子后,我才利用这个命令修复了问题。 我观察到的是, 这个命令会生成 .elasticbeanstalk/config.yml 文件

在云上创建环境

eb create flask-env

这一步会执行 3~5 分钟,会输出一些log。
成功后, 会输出如下 log

Successfully launched environment: flask-env

启动 App

eb open

4. 查看 AWS ElasticBeanstalk 控制台, 并打开页面

部署成功的话, 会看到如下界面, 画圈处可以点击, 跳转到 Flask App 链接

image.png

示例文档页面如下

image.png

自此, 例子就算跑通了。

5. 重新部署

如果上面某些步骤出错, 或者读者希望修改应用后重新部署, 大家可以在修改后, 使用下面的命令重新部署应用。

> eb  deploy
上一篇 下一篇

猜你喜欢

热点阅读