利用 Zappa 部署应用及相关配置优化
1. 使用 Zappa 部署 Flask 应用
Zappa 是一个用 Python 开发的工具,能轻松构建和部署无服务器 Python 应用。以下是使用 Zappa 部署 Flask 应用的详细步骤:
-
安装 Zappa
:在项目开发使用的虚拟环境中,运行
pipenv install zappa
命令进行安装。
-
配置 Zappa
:
1. 确保拥有有效的 AWS 账户,且 AWS 凭证文件已就位。
2. 运行
zappa init
命令开始配置。过程中会有一系列询问:
- 询问环境名称,默认按回车键选择
dev
。
- 询问 AWS S3 存储桶名称,可指定现有存储桶或创建新的。
- Zappa 会自动检测要部署的应用,通常可按回车键使用默认值。
- 询问是否全局部署应用,开发环境选
n
即可。
3. 配置完成后,会在应用根目录生成
zappa_settings.json
文件,示例内容如下:
{
"dev": {
"app_function": "notify-service.app",
"aws_region": "eu-west-2",
"project_name": "notifier",
"runtime": "python3.6",
"s3_bucket": "zappa-43ivixfl0"
}
}
-
部署应用
:在终端运行
zappa deploy dev命令,部署完成后会显示应用部署的 URL。例如:https://rpa5v43ey1.execute-api.eu-west-2.amazonaws.com/dev。 -
查看部署信息
:使用
zappa status命令可查看更多部署信息。
2. 限制 API 端点访问
Flask 应用部署后,任何人都可向 AWS API Gateway 上配置的端点发出请求。为限制只有包含访问密钥的请求才能访问,可按以下步骤操作:
1. 登录 AWS 控制台,在服务菜单中搜索并选择 Amazon API Gateway。
2. 定义使用计划:
- 点击
Usage Plans
,再点击
Create
按钮,创建新的使用计划。
- 输入名称
up-blueprints
,取消勾选
Enable throttling
和
Enable Quota
复选框,点击
Next
。
3. 关联 API 阶段:
- 点击
Add API Stage
按钮,在下拉列表中选择
notifier-dev
和阶段
dev
。
- 确保点击下拉菜单同一行的复选框,否则
Next
按钮无法启用。
4. 添加 API 密钥:
- 点击
Create API Key and add to Usage Plan
按钮,创建新的 API 密钥。
- 输入名称
notifiers-devs
并保存。
5. 修改 API 方法请求:
- 在左侧菜单中选择
APIs -> notifier-dev -> Resources
,在
Resources
选项卡中选择根路由
/
。
- 点击
ANY
,再点击
Method Request
。
- 点击
API Key Required
旁边的笔图标,在下拉菜单中选择
true
。
6. 获取 API 密钥:点击
API Keys
中的
notifier-keys
,在右侧面板点击
show
链接,复制显示的 API 密钥。
3. 修改订单服务
为使订单微服务能利用通知应用,在新订单到达和订单状态变为已发货时发送通知,需进行以下修改:
1.
添加配置信息
:在
order
目录的
settings.py
文件末尾添加以下内容:
NOTIFIER_BASEURL = 'https://rpa5v43ey1.execute-api.eu-west-2.amazonaws.com/dev'
NOTIFIER_API_KEY = 'WQk********P7JR2******kI1K*****r'
若没有
NOTIFIER_BASEURL
的值,可运行
zappa status
命令获取。
2.
创建
notification_type.py
文件
:在
order/main
目录创建该文件,定义通知类型枚举:
from enum import Enum, auto
class NotificationType(Enum):
ORDER_RECEIVED = auto()
ORDER_SHIPPED = auto()
-
创建
notifier.py文件 :在order/main目录创建该文件,定义调用通知服务的辅助函数:
import requests
import json
from order import settings
from .notification_type import NotificationType
def notify(order, notification_type):
endpoint = ('notify/order-received/'
if notification_type is NotificationType.ORDER_RECEIVED
else 'notify/order-shipped/')
header = {
'X-API-Key': settings.NOTIFIER_API_KEY
}
response = requests.post(
f'{settings.NOTIFIER_BASEURL}/{endpoint}',
json.dumps(order.data),
headers=header
)
return response
-
修改
view.py文件 :在order/main目录的view.py文件中添加以下导入语句:
from .notifier import notify
from .notification_type import NotificationType
在
CreateOrderView
类的
post
方法中,在返回 201 响应之前添加以下代码:
notify(OrderSerializer(order),
NotificationType.ORDER_RECEIVED)
-
修改
admin.py文件 :在order/main目录的admin.py文件中添加以下导入语句:
from .notifier import notify
from .notification_type import NotificationType
from .serializers import OrderSerializer
from .status import Status
添加
OrderAdmin
类:
class OrderAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
order_current_status = Status(obj.status)
status_changed = 'status' in form.changed_data
if (status_changed and order_current_status is
Status.Shipping):
notify(OrderSerializer(obj),
NotificationType.ORDER_SHIPPED)
super(OrderAdmin, self).save_model(request, obj, form,
change)
将
admin.site.register(Order)
替换为
admin.site.register(Order, OrderAdmin)
。
4. 测试所有组件
完成上述操作后,可按以下步骤测试所有应用是否协同工作:
1. 启动 Django 开发服务器:打开终端,切换到在线游戏商店项目目录,运行
python manage.py runserver
命令,服务器将在默认端口 8000 运行。
2. 启动订单微服务:打开另一个终端窗口,切换到订单微服务项目目录,运行
python manage.py runserver 127.0.0.1:8001
命令。
3. 测试订单发送:
- 浏览到
http://127.0.0.1:8000
,登录应用并添加商品到购物车。
- 点击
SEND ORDER
按钮,页面应显示订单已发送的通知。
- 检查用户邮箱,确认是否收到订单确认邮件。
4. 测试订单发货通知:
- 浏览到
http://localhost:8001/admin/
,使用管理员凭据登录。
- 点击
Orders
,选择刚提交的订单,将
Status
改为
Shipping
并点击
SAVE
按钮。
- 再次检查用户邮箱,确认是否收到订单已发货的确认邮件。
通过以上步骤,我们成功使用 Zappa 部署了 Flask 应用,限制了 API 端点访问,修改了订单服务以集成通知功能,并进行了全面测试,确保各组件协同工作。
利用 Zappa 部署应用及相关配置优化
5. 总结与拓展
在整个过程中,我们完成了多个关键步骤,下面通过表格来总结这些步骤及其作用:
|步骤|描述|作用|
| ---- | ---- | ---- |
|使用 Zappa 部署 Flask 应用|安装 Zappa、配置并部署应用|将 Flask 应用轻松部署到 AWS Lambda 上,实现无服务器架构|
|限制 API 端点访问|定义使用计划、关联 API 阶段、添加 API 密钥等|确保只有包含访问密钥的请求才能访问 API 端点,增强安全性|
|修改订单服务|添加配置信息、创建相关文件、修改视图和管理文件|使订单微服务能与通知应用集成,在订单不同状态时发送通知|
|测试所有组件|启动服务器、测试订单发送和发货通知|验证各个组件是否能协同工作,确保系统正常运行|
为了更清晰地展示各个步骤之间的关系,下面是一个 mermaid 格式的流程图:
graph LR
A[使用 Zappa 部署 Flask 应用] --> B[限制 API 端点访问]
B --> C[修改订单服务]
C --> D[测试所有组件]
6. 其他相关拓展
除了上述操作,我们还可以进一步拓展和优化系统。例如,可以考虑对使用计划进行更细致的配置,设置不同的限流和配额规则,以满足不同用户的需求。另外,对于通知服务,可以添加更多的通知类型,如订单取消通知、退款通知等。
在代码方面,我们可以对
notifier.py
文件中的
notify
函数进行优化,添加错误处理机制,以提高系统的健壮性。以下是优化后的代码:
import requests
import json
from order import settings
from .notification_type import NotificationType
def notify(order, notification_type):
try:
endpoint = ('notify/order-received/'
if notification_type is NotificationType.ORDER_RECEIVED
else 'notify/order-shipped/')
header = {
'X-API-Key': settings.NOTIFIER_API_KEY
}
response = requests.post(
f'{settings.NOTIFIER_BASEURL}/{endpoint}',
json.dumps(order.data),
headers=header
)
response.raise_for_status() # 检查响应状态码
return response
except requests.exceptions.RequestException as e:
print(f"通知发送失败: {e}")
return None
7. 总结
通过一系列的操作,我们成功地将 Flask 应用部署到 AWS Lambda 上,实现了无服务器架构。同时,我们限制了 API 端点的访问,增强了系统的安全性。通过修改订单服务,使订单微服务与通知应用集成,实现了订单状态变化时的通知功能。最后,通过测试确保了各个组件能够协同工作,保证了系统的正常运行。
在实际应用中,我们可以根据具体需求对系统进行进一步的拓展和优化,如添加更多的通知类型、优化使用计划配置等。同时,要注意代码的健壮性,添加错误处理机制,以提高系统的稳定性。希望这些内容能帮助你更好地构建和部署自己的应用。
利用 Zappa 部署 Flask 应用及配置优化
超级会员免费看
47

被折叠的 条评论
为什么被折叠?



