天天看點

django web項目部署到阿裡雲函數計算平台

阿裡雲函數計算平台

  阿裡雲函數計算(FC),旨在幫助使用者采用彈性伸縮、動态配置設定資源的方式,來執行業務邏輯.讓使用者無需購買部署伺服器,無需考慮業務負載,就能快速搭建可處理高并發的背景服務.

  基于WSGI标準的項目能夠很友善的遷移至函數計算平台. 本文介紹如何将一個通用的django web項目,通過FC提供的fun指令行工具快速部署到FC平台。

1. django web項目預覽

  示例項目是一個簡單的值班oncall系統,按照人員清單已一周為周期排班,并支援釘釘群發消息推送.

django項目目錄結構:

  

django web項目部署到阿裡雲函數計算平台

2. 部署到函數計算平台

  • 2.1 在項目目錄安裝依賴庫(很重要)

      FC平台上函數的運作環境對不同語言都有部分預設支援的三方庫可直接使用,請參考:

    函數計算python運作環境文檔

  對于其他的依賴庫,使用者需自行安裝在項目目錄,釋出時fun工具會将這些庫以及使用者代碼一并打包上傳到FC平台. 示例中需要安裝django以及資料庫工具pymsql

  • 安裝django
    pip install -t . django           
  • 安裝pymysql
    pip install -t . pymysql           
    django中python2.7使用pymysql, 必須先修改下安裝為MySQLdb:
    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
    ROSTemplateFormatVersion: '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           
    PS: yml檔案對indent有嚴格要求,請注意各行代碼的indent
  •  2.6 部署到FC函數計算
  • 在django工程根目錄下執行
    fun deploy           
    django web項目部署到阿裡雲函數計算平台
    部署成功!
  • 在阿裡雲FC控制台檢視
    django web項目部署到阿裡雲函數計算平台
django web項目部署到阿裡雲函數計算平台
  • 使用測試
    django web項目部署到阿裡雲函數計算平台

在浏覽器中輸入複制的連結位址即可通路django項目中對應的web資源(頁面或API)

django web項目部署到阿裡雲函數計算平台

到此,恭喜遷移成功!

問題解答

Q: 代碼中怎麼使用template.yml中配置的環境變量

A: 通過os.environ字典讀取

django web項目部署到阿裡雲函數計算平台

Q: 本地測試時怎麼設定環境變量

A: 可在settings.py中添加測試代碼(部署時注釋掉)

django web項目部署到阿裡雲函數計算平台

相關連結:

  1. 阿裡雲函數計算使用文檔
  2. FC fun工具安裝
  3. FC fun工具使用部署文檔

如果您有任何回報或疑問,歡迎通過

阿裡雲聆聽

官方論壇

雲栖社群

聯系我們。您也可以加入釘釘使用者群(釘釘群号:11721331)與函數計算工程師即時溝通。

django web項目部署到阿裡雲函數計算平台