阿裡雲函數計算平台
阿裡雲函數計算(FC),旨在幫助使用者采用彈性伸縮、動态配置設定資源的方式,來執行業務邏輯.讓使用者無需購買部署伺服器,無需考慮業務負載,就能快速搭建可處理高并發的背景服務.
基于WSGI标準的項目能夠很友善的遷移至函數計算平台. 本文介紹如何将一個通用的django web項目,通過FC提供的fun指令行工具快速部署到FC平台。
1. django web項目預覽
示例項目是一個簡單的值班oncall系統,按照人員清單已一周為周期排班,并支援釘釘群發消息推送.
django項目目錄結構:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2gDOyU2NwUmY1UzNlZTO4IWZ3EjZidDNzcjNjNWNxEGZzYTMkVDZl9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
2. 部署到函數計算平台
-
2.1 在項目目錄安裝依賴庫(很重要)
FC平台上函數的運作環境對不同語言都有部分預設支援的三方庫可直接使用,請參考:
函數計算python運作環境文檔
對于其他的依賴庫,使用者需自行安裝在項目目錄,釋出時fun工具會将這些庫以及使用者代碼一并打包上傳到FC平台. 示例中需要安裝django以及資料庫工具pymsql
- 安裝django
pip install -t . django
- 安裝pymysql
django中python2.7使用pymysql, 必須先修改下安裝為MySQLdb:pip install -t . pymysql
安裝完成後項目目錄結構:django web項目部署到阿裡雲函數計算平台 django web項目部署到阿裡雲函數計算平台
-
2.2 設定靜态資源路徑
為了讓系統在FC上運作時,能找到對應的靜态資源檔案(js/css),必須先修改配置下靜态資源路徑
- 修改settings.py
django web項目部署到阿裡雲函數計算平台 STATIC_URL = '/static/' # STATICFILES_DIRS = [ # os.path.join(BASE_DIR, "static"), # ] STATIC_FC_URL = STATIC_URL STATIC_ROOT = os.path.join(BASE_DIR, 'static')
-
修改urls.py
為上面配置的資源路徑,設定url映射.
from django.conf.urls import url from django.conf import settings from django.conf.urls.static import static urlpatterns += static(settings.STATIC_FC_URL, document_root=settings.STATIC_ROOT)
- 修改靜态頁面中引用方式:
django web項目部署到阿裡雲函數計算平台 django web項目部署到阿裡雲函數計算平台
- 2.3 建立入口檔案main.py
# coding=utf-8 import sys import os # load local django sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "OnCallSys(改成你的工程目錄)")) import django from django.conf import settings print (django.__version__) import urlparse from OnCallSys.wsgi import application base_path = None def handler(environ, start_response): request_uri = environ['fc.request_uri'] parsed_tuple = urlparse.urlparse(request_uri) li = parsed_tuple.path.split('/') global base_path if not base_path: base_path = "/".join(li[0:5]) settings.STATIC_URL = base_path + settings.STATIC_FC_URL context = environ['fc.context'] environ['HTTP_HOST'] = '{}.{}.fc.aliyuncs.com'.format(context.account_id, context.region) environ['SCRIPT_NAME'] = base_path + '/' return application(environ, start_response)
- 2.4 建立檔案tick.py定時調用Oncall系統的/tick接口(非必要,隻是OnCall系統的示例所需)
# -*- coding: utf-8 -*- import logging import os import hashlib from OnCallSys.views.Util import Util def handler(event, context): print 'tick ...' url = os.environ['TICK_URL'] name = os.environ['ADMIN_NAME'] pwd = os.environ['ADMIN_PWD'] pwd_md5 = hashlib.md5(pwd).hexdigest() url += '?username=' + name + '&pwd=' + pwd_md5 print Util.http_get(url)
- 2.5 編寫FC fun工具的部署配置檔案(儲存到工程根目錄)
- .env檔案
DEFAULT_REGION=cn-hangzhou ACCOUNT_ID= ENDPOINT= ACCESS_KEY_ID= ACCESS_KEY_SECRET=
- templates.yml
PS: yml檔案對indent有嚴格要求,請注意各行代碼的indentROSTemplateFormatVersion: '2015-09-01' # 無需修改 Transform: 'Aliyun::Serverless-2018-04-03' # 無需修改 Resources: oncall-log: # 建立logproject和logstore(需事先在阿裡雲平台開通日志服務) Type: 'Aliyun::Serverless::Log' Properties: Description: 'oncall system log' oncall-logstore: Type: 'Aliyun::Serverless::Log::Logstore' Properties: TTL: 362 ShardCount: 1 oncall-service: # 1. 建立service, 名字随意取(可以了解為存放代碼的包) Type: 'Aliyun::Serverless::Service' Properties: Description: 'oncall system' Policies: # 設定權限 - AliyunOSSFullAccess # OSS[對象存儲服務]權限(需事先在阿裡雲平台開通) - AliyunLogFullAccess # log權限 LogConfig: # 配置項目的輸出日志 Project: oncall-log # 上面建立的logproject Logstore: oncall-logstore # 上面建立的logstore InternetAccess: true # 設定項目代碼是否能通路公網 oncall: # 2. 建立function, oncall函數對應本地的main.py檔案 Type: 'Aliyun::Serverless::Function' Properties: Handler: main.handler # 入口函數main.py的handler函數 CodeUri: './' Description: 'oncall system function' Runtime: python2.7 Timeout: 60 MemorySize: 512 EnvironmentVariables: # 函數oncall的環境變量, 可在本函數中讀取, 并能夠在控制台修改 'CUSTOM_DB_NAME': '' 'CUSTOM_DB_USER': 'CUSTOM_DB_PWD': 'CUSTOM_DB_HOST': 'CUSTOM_DB_PORT': '3306' 'WEB_HOOK_URL': 'ONCALL_SYS_URL': 'ADMIN_NAME': 'ADMIN_PWD': 'TOKEN_EXPIRE': Events: # 函數oncall的事件觸發器, 這裡web服務用的是http觸發器 http-trigger: # trigger name Type: HTTP # trigger type Properties: AuthType: ANONYMOUS # 匿名通路 Methods: ['GET', 'POST'] tick: # 建立function,tick函數(類似上面的oncall函數, 不需要可以不建立,隻是示例所需) Type: 'Aliyun::Serverless::Function' Properties: Handler: tick.handler CodeUri: './' Description: 'oncall system tick function' Runtime: python2.7 Timeout: 60 MemorySize: 512 EnvironmentVariables: 'TICK_URL': 'ADMIN_NAME': 'ADMIN_PWD': Events: tick-trigger: # trigger name Type: Timer # 定時觸發器, 會根據以下cron表達式的規則定時觸發目前函數 Properties: CronExpression: '0 0 1 ? * MON-FRI' # utc+8, 9:00 am, 周一到周五 Enable: true
- 2.6 部署到FC函數計算
- 在django工程根目錄下執行
fun deploy
部署成功!django web項目部署到阿裡雲函數計算平台
- 在阿裡雲FC控制台檢視
django web項目部署到阿裡雲函數計算平台
- 使用測試
django web項目部署到阿裡雲函數計算平台
在浏覽器中輸入複制的連結位址即可通路django項目中對應的web資源(頁面或API)
到此,恭喜遷移成功!
問題解答
Q: 代碼中怎麼使用template.yml中配置的環境變量
A: 通過os.environ字典讀取
Q: 本地測試時怎麼設定環境變量
A: 可在settings.py中添加測試代碼(部署時注釋掉)
相關連結:
如果您有任何回報或疑問,歡迎通過
阿裡雲聆聽、
官方論壇和
雲栖社群聯系我們。您也可以加入釘釘使用者群(釘釘群号:11721331)與函數計算工程師即時溝通。