跳转到主要内容

无服务器Django With AWS Lambda + API Gateway

项目描述

<p align="center">
<img src="http://i.imgur.com/oePnHJn.jpg" alt="Zappa Rocks!"/>
</p>

## django-zappa - 无服务器Django

[![Django-CC](https://img.shields.io/badge/Django-CC-ee66dd.svg)](https://github.com/codingjoe/django-cc)
[![Build Status](https://travis-ci.org/Miserlou/django-zappa.svg)](https://travis-ci.org/Miserlou/django-zappa)
[![Coverage](https://img.shields.io/coveralls/Miserlou/django-zappa.svg)](https://coveralls.io/github/Miserlou/django-zappa)
[![Requirements Status](https://requires.io/github/Miserlou/django-zappa/requirements.svg?branch=master)](https://requires.io/github/Miserlou/django-zappa/requirements/?branch=master)
[![Slack](https://img.shields.io/badge/chat-slack-ff69b4.svg)](https://slackautoinviter.herokuapp.com/)

**django-zappa**使得在AWS Lambda + API Gateway上部署Django应用程序变得非常容易。将其视为“无服务器”网络托管服务,适用于您的Django应用程序。

这意味着

* **不再**需要进行繁琐的Web服务器配置!
* **不再**需要支付24/7的服务器运行时间费用!
* **不再**需要担心负载均衡/可扩展性!
* **不再**需要担心保持服务器在线!
* **不再**需要担心安全漏洞和补丁!

**django-zappa**负责

* 将项目打包成Lambda准备好的zip文件并将其上传到S3
* 正确设置IAM角色和权限
* 自动配置API Gateway路由、方法和集成响应
将 API 网关请求转换为有效的 WSGI,并返回与 API 网关兼容的 HTTP 响应
将您的应用程序部署到准备阶段(开发、预发布、生产)

__太棒了!__

(在这里查看操作演示![https://zappa.gun.io/](https://zappa.gun.io/) 您还可以观看关于如何使用 django-zappa 的 **[屏幕录制视频](https://www.youtube.com/watch?v=plUrbPN0xc8&feature=youtu.be)**。)

本项目是针对 Django 特定集成。如果您想了解其底层如何工作,应该查看 **[Zappa 核心库](https://github.com/Miserlou/Zappa)**,它可以被任何 WSGI 兼容的 Web 框架使用。

## 安装

在开始之前,请确保您有一个有效的 AWS 账户,并且您的 [AWS 凭据文件](https://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs)已正确安装。

**django-zappa** 可以通过 pip 轻松安装,如下所示

$ pip install django-zappa

在您的 Django 设置中,您需要将 `django_zappa` 添加到已安装的应用程序中,以便将 Zappa 命令添加到您的管理脚本中。

```python
INSTALLED_APPS = [
...
'django_zappa',
]
```

最后,在您的本地设置文件中定义一个 ZAPPA_SETTINGS 设置,将命名的部署环境映射到部署设置和 S3 桶(必须已经创建)。这些可以命名为您喜欢的任何名称,但您可能希望有分开的 _dev_、_staging_ 和 _production_ 环境,以便分离您的数据。

```python
ZAPPA_SETTINGS = {
'production': {
's3_bucket': 'production-bucket',
'settings_file': '~/Projects/MyApp/settings/production_settings.py',
},
'staging': {
's3_bucket': 'staging-bucket',
'settings_file': '~/Projects/MyApp/settings/staging_settings.py',
},
}
```

注意,每个环境都定义了一个设置文件的路径。该文件将用作您的 _服务器端_ 设置文件。具体来说,您将想要定义一个新的 [SECRET_KEY](https://gist.github.com/Miserlou/a9cbe22d06cbabc07f21),以及您的部署 DATABASES 信息。Zappa 现在通过 [lambda-packages](https://github.com/Miserlou/lambda-packages) 支持 _MySQL-Python_ 和 _pyscopg2_。

## 基本用法

#### 初始部署

一旦您的设置配置完成,您可以使用单个命令打包并部署您的 Django 应用程序到名为 'production' 的环境

$ python manage.py deploy production
正在部署...
您的应用程序现在已上线:https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production

现在您的应用程序已 **上线**!这有多么酷啊?!

#### 更新

如果您的应用程序已经部署,并且您只需上传新的 Python 代码,而不修改底层路由,您可以直接

$ python manage.py update production
正在更新...
您的应用程序现在已上线:https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production

#### 回滚

您也可以通过指定要返回的修订次数来回滚已部署的代码到先前的版本。例如,要回滚到 3 个版本之前部署的版本

$ python manage.py rollback production 3

正在回滚...

#### 管理

如果您想在远程 Zappa 实例上调用 Django 管理命令,只需在本地调用 'invoke' 管理命令即可
$ python manage.py invoke production check

系统检查未发现任何问题(0 被抑制)。

#### 跟踪日志

您可以通过调用 'tail' 管理命令来查看部署的日志。

$ python manage.py tail production

## 高级用法
您可以在 ZAPPA_SETTINGS 中定义其他设置,以更改 Zappa 的行为。请在使用时自行承担风险!

```python
ZAPPA_SETTINGS = {
'dev': {
'aws_region': 'us-east-1', # AWS 区域(默认 US East),
'domain': 'yourapp.yourdomain.com', # 如果您正在使用域名,则为必需项
'http_methods': ['GET', 'POST'], # 要路由的 HTTP 方法
'integration_response_codes': [200, 301, 404, 500], # 要路由的集成响应状态码
'memory_size': 512, # Lambda 函数内存大小(以 MB 为单位)
'timeout': 30, # Lambda 函数超时时间(以秒为单位)
'method_response_codes': [200, 301, 404, 500], # 要路由的方法响应状态码
'parameter_depth': 10, # 要路由的 URL 深度大小。默认为 8。
'role_name': "MyLambdaRole", # Lambda 执行角色
's3_bucket': 'dev-bucket', # Zappa zip 桶,
'settings_file': '~/Projects/MyApp/settings/dev_settings.py', # 服务器端设置文件位置
'touch': False, # 初始部署时获取生产 URL(默认为 True)
'use_precompiled_packages': True, # 如可能,使用为 AWS Lambda 预编译的 C 扩展包
'vpc_config': { # Lambda 函数的可选 VPC 配置
'SubnetIds': [ 'subnet-12345678' ], # 注意:并非所有可用区都支持 Lambda!
'SecurityGroupIds': [ 'sg-12345678' ]
}
}
}
```

#### 保持服务器运行

Lambda 有一个限制,即不常调用的函数启动时间较长——有时长达十秒。然而,经常被调用的函数会被缓存并快速启动,通常在 50ms 以下。为确保您的服务器处于缓存状态,您可以[手动配置](http://stackoverflow.com/a/27382253) Zappa 函数的定时任务,每 5 分钟调用一次以保持服务器缓存。目前无法通过 API 进行配置,因此您需要手动设置。当此功能可通过 API 使用时,django-zappa 将自动配置。通过此机制添加对 Let's Encrypt 的支持也会很棒。

#### 启用 CORS

要为您的应用程序启用跨源资源共享(CORS),请遵循 AWS '如何启用 CORS' 指南(https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html)通过 API 网关控制台启用 CORS。别忘了在更改后重新部署您的 API!

## TODO

此项目非常年轻,因此还有很多工作要做。欢迎贡献!请在提交补丁之前提交问题,并将您的补丁提交到 'dev' 分支。

目前需要工作的内容

* 测试!
* 反馈!
* 真实的文档/网站!

## [贡献](CONTRIBUTING.md)

## [许可证](LICENSE)

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django-zappa-0.13.1.tar.gz (12.1 kB 查看哈希)

上传时间

构建分发

django_zappa-0.13.1-py2-none-any.whl (20.4 kB 查看哈希)

上传时间 Python 2

支持