[肥用云計算] Serverless 多環境配置

前言

在 Serverless 應用開發中,多環境配置是一個繞不開的話題。從開發、測試到生產,每個環境都有其特定的配置需求。阿里云 Serverless Devs 雖然提供了官方的 env 命令來管理多環境,但在實際使用中,我發現官方方案存在一些局限性。

本文將通過四個實際案例,展示 Serverless FC 多環境配置的演進過程,從基礎驗證到最終的最佳實踐方案。通過對比分析,幫助開發者選擇最適合的多環境配置策略。

技術背景

多環境配置的核心挑戰

在 Serverless 架構中,多環境配置面臨以下挑戰:

  • 配置復用:避免在不同環境中重復相同的配置
  • 環境隔離:確保不同環境的配置相互獨立
  • 靈活配置:支持動態配置和敏感信息管理
  • 維護成本:降低配置管理的復雜度

Serverless Devs 多環境支持現狀

Serverless Devs 提供了兩種多環境配置方式:

  1. 官方 env 命令:通過 env.yaml 集中管理所有環境配置
  2. 自定義方案:通過模板繼承、環境變量等方式實現

項目架構設計

代碼地址:practice_serverlsess/p07

項目整體結構

我們的測試項目包含四個不同的多環境配置方案:

p07/
├── a/                    # 方案一:模板元數據
│   ├── s.yaml
│   └── code/
├── b/                    # 方案二:環境變量配置
│   ├── s.yaml
│   └── code/
├── c/                    # 方案三:模板繼承
│   ├── s.yaml
│   ├── s-dev.yaml
│   ├── s-prod.yaml
│   └── code/
├── d/                    # 方案四:綜合方案(推薦)
│   ├── s.yaml
│   ├── s-dev.yaml
│   ├── s-prod.yaml
│   └── code/
└── readme.md

方案驗證:從基礎到高級

方案一:模板元數據驗證

驗證目的:理解 template 字段的配置復用能力

# a/s.yaml
edition: 3.0.**0**
name: fc3-example
access: default
vars:projectName: practice-07
template:# 模板信息t1:# 模板名稱region: cn-shenzhentimeout: 60diskSize: 512internetAccess: trueruntime: python3.10cpu: 0.35memorySize: 512
resources:index:component: fc3extend:name: t1props:handler: index.handlerfunctionName: ${vars.projectName}-${this.name}code: ./code

運行結果

$ s preview
edition:   3.0.0
name:      fc3-example
access:    default
vars: projectName: practice-07
template: t1: region:         cn-shenzhentimeout:        60diskSize:       512internetAccess: trueruntime:        python3.10cpu:            0.35memorySize:     512
resources: index: component: fc3extend: name: t1props: region:         cn-shenzhentimeout:        60diskSize:       512internetAccess: trueruntime:        python3.10cpu:            0.35memorySize:     512handler:        index.handlerfunctionName:   practice-07-indexcode:           ./code

驗證結論

  • ? 解決了配置重復問題
  • ? 缺乏環境差異化能力
  • ? 所有環境使用相同配置

方案二:環境變量驗證

驗證目的:理解環境變量的動態配置能力

# b/s.yaml
edition: 3.0.0
name: fc3-example
access: default
vars:projectName: practice-07
resources:index:component: fc3props:handler: index.handlerfunctionName: ${vars.projectName}-${this.name}-${env('DEV_ENV')}code: ./coderegion: cn-shenzhenruntime: python3.10environmentVariables:env: ${env('DEV_ENV')}tags:env: ${env('DEV_ENV')}

運行結果

$ DEV_ENV='abc' s preview
edition:   3.0.0
name:      fc3-example
access:    default
vars: projectName: practice-07
resources: index: component: fc3props: handler:              index.handlerfunctionName:         practice-07-index-abccode:                 ./coderegion:               cn-shenzhenruntime:              python3.10environmentVariables: env: abctags: env: abc

驗證結論

  • ? 提供了靈活性
  • ? 支持動態配置
  • ? 配置管理復雜
  • ? 需要手動管理環境變量

💡 對于非常簡單的項目,配置是有規律,也是可以使用這種方式進行配置。

方案三:模板繼承驗證

驗證目的:理解 extend 字段的環境隔離能力

# c/s.yaml - 基礎配置
edition: 3.0.0
name: fc3-example
access: default
vars:projectName: practice-07
resources:index:component: fc3props:handler: index.handlerfunctionName: ${vars.projectName}-${this.name}code: ./coderegion: cn-shenzheninternetAccess: trueruntime: python3.10
# c/s-prod.yaml - 生產環境配置
extend: s.yaml
resources:index:props:handler: ${this.name}.handlerfunctionName: ${vars.projectName}-${this.name}-prodcode: ./codeenvironmentVariables:DEV_ENV: env-prodtags:TAG1: tag-prod

運行結果

$ s preview -t s-prod.yaml
edition:   3.0.0
name:      fc3-example
access:    default
vars: projectName: practice-07
resources: index: component: fc3props: handler:              index.handlerfunctionName:         practice-07-index-prodcode:                 ./coderegion:               cn-shenzheninternetAccess:       trueruntime:              python3.10environmentVariables: DEV_ENV: env-prodtags: TAG1: tag-prod

驗證結論

  • ? 實現了環境隔離
  • ? 配置文件結構清晰
  • ? 仍有配置冗余,當 resources 越來越多的時候,s.yaml 就會越來越繁瑣
  • ? 有一定的動態配置能力

💡 對于簡單的項目,多環境的配置方法,已經是足夠了。

最佳實踐:方案四深度解析

設計理念

方案四完美結合了前三個方案的優點:

  • 模板元數據:解決配置復用問題
  • 模板繼承:實現環境隔離
  • 環境變量:提供靈活配置

代碼架構分析

基礎配置d/s.yaml

edition: 3.0.0
name: fc3-example
access: default
vars:projectName: practice-07
template:# 模板信息t1:# 模板名稱region: cn-shenzheninternetAccess: trueruntime: python3.10tags:project: ${vars.projectName}
resources:index:component: fc3extend:name: t1props:handler: index.handlerfunctionName: ${vars.projectName}-${this.name}code: ./code

開發環境配置d/s-dev.yaml

extend: s.yaml
resources:index:props:environmentVariables:DEV_ENV: env-devtags:TAG1: tag-dev

生產環境配置d/s-prod.yaml

extend: s.yaml
resources:index:props:environmentVariables:DEV_ENV: ${env('DEV_ENV')}tags:TAG1: ${env('TAG1')}

運行結果分析

$ TAG1='tag-prod' DEV_ENV='prod' s preview -t s-prod.yaml
edition:   3.0.0
name:      fc3-example
access:    default
vars: projectName: practice-07
template: t1: region:         cn-shenzheninternetAccess: trueruntime:        python3.10tags: project: practice-07
resources: index: component: fc3extend: name: t1props: region:               cn-shenzheninternetAccess:       trueruntime:              python3.10tags: project: practice-07TAG1:    tag-prodhandler:              index.handlerfunctionName:         practice-07-indexcode:                 ./codeenvironmentVariables: DEV_ENV: prod

核心優勢

  • ? 配置復用:通過模板元數據避免重復
  • ? 環境隔離:通過文件分離實現清晰隔離
  • ? 靈活配置:通過環境變量處理敏感信息
  • ? 易于維護:配置文件結構清晰

官方 env 命令的局限性分析

為什么不使用官方的 env 命令呢?

官方方案介紹

Serverless Devs 提供了 env 命令來管理多環境:

# 初始化環境
s env init --name dev# 設置默認環境
s env default --name dev# 使用環境部署
s deploy --env dev

核心缺陷

1. 配置集中化問題
所有環境配置都集中在 env.yaml 中,隨著環境增多,配置文件變得臃腫難維護。

2. 插入環境變量不夠靈活
有些環境的變量是在文件中保存中保存的,有些是從環境變量中來的。

🤬🤬🤬 吐槽一波官方的 yaml 格式,繼承和覆蓋 過于強綁定,不夠靈活,無法沿用之前的 yaml 理解。

方案四的實際應用

開發環境部署

# 開發環境部署,配置都是寫死的
s deploy -t s-dev.yaml

生產環境部署

# 生產環境部署,部分的敏感信息可以在環境變量從傳入的
TAG1='prod' DEV_ENV='production' s deploy -t s-prod.yaml

環境切換策略

# 快速切換環境
alias deploy-dev="TAG1='dev' DEV_ENV='development' s deploy -t s-dev.yaml"
alias deploy-prod="TAG1='prod' DEV_ENV='production' s deploy -t s-prod.yaml"

高級配置技巧

敏感信息處理

通過環境變量管理密鑰、數據庫連接等敏感信息:

# s-prod.yaml
extend: s.yaml
resources:index:props:environmentVariables:DATABASE_URL: ${env('DATABASE_URL')}API_KEY: ${env('API_KEY')}SECRET_TOKEN: ${env('SECRET_TOKEN')}

配置驗證

使用 s preview 驗證配置正確性:

# 驗證開發環境配置
s preview -t s-dev.yaml# 驗證生產環境配置
TAG1='prod' DEV_ENV='production' s preview -t s-prod.yaml

最佳實踐總結

推薦方案

方案四作為生產環境標準配置,完美解決了多環境配置的核心問題。

配置原則

  • 基礎配置模板化:通過 template 字段實現配置復用
  • 環境差異文件化:增加多個環境的 yaml 文件,通過 extend 字段實現環境隔離,同時每個文件都是獨立的
  • 敏感信息環境變量化:通過 env() 函數處理敏感配置

文件組織

project/
├── s.yaml          # 基礎配置 + 模板元數據
├── s-dev.yaml      # 開發環境差異配置
├── s-prod.yaml     # 生產環境差異配置
└── code/           # 業務代碼

部署命令標準化

# 開發環境
DEV_ENV='dev' s deploy -t s-dev.yaml# 生產環境
DEV_ENV='prod' s deploy -t s-prod.yaml

總結

方案回顧

通過四個方案的演進,我們看到了 Serverless 多環境配置的完整路徑:

  1. 方案一:驗證了模板元數據的配置復用能力
  2. 方案二:驗證了環境變量的動態配置能力
  3. 方案三:驗證了模板繼承的環境隔離能力
  4. 方案四:綜合前三者優點,形成最佳實踐

核心價值

方案四解決了多環境配置的關鍵問題:

  • 配置復用:避免重復配置
  • 環境隔離:確保環境獨立
  • 靈活配置:支持動態配置
  • 易于維護:結構清晰,便于管理

寄語

沒有方案是完美的,大家可以根據自己情況,挑選一個合適自己的方案。

參考資料

  • Serverless Devs 官方文檔 - 描述文件格式/規范
  • Serverless Devs 官方文檔 - Env 多環境配置
  • Serverless Devs 官方文檔 - 如何解決yaml配置重復冗余的問題
  • 項目代碼倉庫 - practice_serverlsess/p07
  • 阿里云函數計算官方文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97229.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode算法日記 - Day 25: 數組中的第K個最大元素、庫存管理III

目錄 1 數組中的第K個最大元素 1.1 題目解析 1.2 解法 1.3 代碼實現 2. 庫存管理III 2.1 題目解析 2.2 解法 2.3 代碼實現 1 數組中的第K個最大元素 215. 數組中的第K個最大元素 - 力扣(LeetCode) 給定整數數組 nums 和整數 k,請返…

10分鐘快速搭建 SkyWalking 服務

從 0 開始入門 SkyWalking,搭建 SkyWalking 服務,并接入 Java 項目中實現分布式鏈路追蹤。 Tags 目錄: 1. 概述2. 搭建 SkyWalking 單機環境3. 搭建 SkyWalking 集群環境4. 告警5. 注意事項6. Spring Boot 使用示例 1. 概述 1.1 概念 …

IDEA之GO語言開發

最近因為接到了需求,說是先把目前公司的JAVA服務慢慢替換成GO語言,于是去了解了一下。 但在開發之前,因為用習慣了IDEA,就想著能不能在IDEA上進行開發,結果真讓我找到了。 作為學習記錄一下 注意:基于IDEA…

rapid_table v3.0.0發布了

更新日志 rapid_table v3.0.0 主要更新是支持 batch 推理,模型并沒有升級哈! 因為版本號是根據語義化版本號來走的,這次更改了接口的返回值。因此從 v2.0.3 升級到了 v3.0.0。 返回值具體變化如下: # v2.0.3 class RapidTableO…

若依微服務一鍵部署(RuoYi-Cloud):Nacos/Redis/MySQL + Gateway + Robot 接入(踩坑與修復全記錄)

本文記錄我把 高仙(Gaussian)機器人對接項目 從“本機能跑”遷到 Docker 一鍵部署 的全過程: 包含 四個后端服務(gateway/auth/system/robot)、前端 Nginx、MySQL/Redis、Nacos 配置中心、Sentinel 控制臺 的改造要點、…

React 業務場景使用相關封裝(hooks 使用)

React 業務場景相關方法封裝(hooks 使用) React 中常用的三方 hooks 庫 庫名特點常見場景官方文檔ahooks(阿里出品)豐富實用的 Hooks,和 Ant Design 配合最佳useRequest(請求管理)、useDeboun…

[高并發系統設計] - 搭建高并發高可用的系統 - 學習與探究

1.應用場景 主要用于高并發系統設計的架構演進和架構思路。 2.學習/操作 1.文檔閱讀 搭建高并發、高可用的系統 | Laravel China 社區 高并發, 你真的理解透徹了嗎? - 知乎 PHP實戰經驗之系統如何支撐高并發-51CTO.COM PHP高并發和大流量解決方案整理 …

【小白筆記】Visual Studio 在 2025年7月更新的功能說明(英文單詞記憶)

這是NVIDIA軟件中關于數據收集(Usage Collection)的選項。術語解釋NVIDIA Nsight Visual Studio Edition:這是一款由NVIDIA開發的工具,專門用于在Visual Studio這個集成開發環境(IDE)中進行GPU調試和性能分…

THM Whats Your Name WP

信息收集[2025-08-28 21:41:30] [SUCCESS] 端口開放 10.10.208.188:80[2025-08-28 21:41:30] [SUCCESS] 端口開放 10.10.208.188:22[2025-08-28 21:41:31] [SUCCESS] 端口開放 10.10.208.188:8081[2025-08-28 21:41:31] [SUCCESS] 服務識別 10.10.208.188:22 > [ssh] 版本:8…

MySQL底層數據結構與算法淺析

1、概述 MySQL中,當我們發現某個sql的執行時間很長時,最先想到的就是給表加索引,加了索引之后,查詢性能就會有顯著的提升。 為了知其所以然,那么只有去了解MySQL的底層儲存結構和索引的查詢算法,只有這樣才…

VisualStudio 將xlsx文件嵌入到資源中訪問時變String?

如題,就是這么詭異,時至如今已經是visual studio 2022了,你通過界面導入xlsx文件到資源中,它的類型就是String而且沒法修改! 即使將文件壓縮成zip再導入,依然是String! 三哥的騷操作問你服不服! 然而&#…

【視頻講解】R語言海七鰓鰻性別比分析:JAGS貝葉斯分層邏輯回歸MCMC采樣模型應用

全文鏈接:https://tecdat.cn/?p43774 原文出處:拓端抖音號拓端tecdat 分析師:Yifei Liu 【視頻講解】R語言海七鰓鰻性別比分析:JAGS貝葉斯分層邏輯回歸引言:生態人都懂的痛——樣本少、結果被質疑,咋辦&am…

Android14 USB子系統的啟動以及動態切換相關的init.usb.rc詳解

init.usb.rc的作用是在Android系統啟動和運行時,通過監聽屬性(sys.usb.config和sys.usb.configfs, sys.usb.typec.mode)變化動態,通過寫入內核接口 /sys/class/android_usb/ 來配置USB模式。1 USB子系統的啟動1.1 on init階段的配…

宜春城區SDH網圖分析

一、SDH網圖展示 圖片來源: 本地網傳輸網組SDH網圖(2014年12月) - 百度文庫 SDH就是Synchronous Digital Hierarchy,同步數字體系的意思。 從分布圖可以看出,城區網和工業網一樣,是環狀結構,保障數據傳輸的穩定。我的…

lwIP MQTT 心跳 Bug 分析與修復

一、背景在使用 lwIP 內置 MQTT 客戶端時,如果你用的是 2.2.0 之前的版本,很可能會遇到一個惱人的問題:客戶端和服務器正常連接,但一段時間后 會話被 broker 踢掉。比如常見的現象:Mosquitto / EMQX 日志顯示客戶端超時…

Golang 面試題「中級」

以下是 100 道 Golang 中級面試題及答案,涵蓋并發編程、內存管理、接口實現、標準庫深入應用等核心知識點: 一、并發編程基礎與進階問題:Golang 的 GPM 調度模型中,G、P、M 分別代表什么?它們的協作關系是怎樣的&#…

沃爾瑪AI系統Wally深度拆解:零售業庫存周轉提速18%,動態定價爭議與員工轉型成熱議點

最近去沃爾瑪購物,發現以前總斷貨的那款早餐麥片居然常年擺在最顯眼的貨架上,而且價格每周末都會微調——這可不是巧合,背后藏著零售業最硬核的AI操作。沃爾瑪去年推出的智能系統Wally,正悄悄改變著我們買東西的體驗和商家的運營邏…

AutoDL算力云上傳文件太慢了如何解決?

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章,有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn,這里還有很多有關計算機的知識,歡迎進行留言或…

【智慧城市】2025年中國地質大學(武漢)暑期實訓優秀作品(2):智慧城市西安與一帶一路

PART 01 項目背景01政策與時代背景近年來,隨著科技的飛速發展和政策的積極推動,我國新型智慧城市建設取得了顯著成效。在“十四五”國家信息化規劃中,明確提出要打造智慧高效的城市治理體系,推動城市管理精細化、服務智能化。同時…

MySQL數據庫精研之旅第十四期:索引的 “潛規則”(上)

專欄:MySQL數據庫成長記 個人主頁:手握風云 目錄 一、索引簡介 1.1. 索引是什么 1.2. 為什么需要索引 二、索引應該選擇哪種數據結構 2.1. Hash 2.2. 二叉搜索樹 2.3. N叉樹 2.4. B樹 三、MySQL中的頁 3.1. 為什么要使用頁 3.2. 頁文件頭和頁…