簡體   English   中英

如何將無服務器代碼與本地服務器代碼分開

[英]How to separate serverless code from local server code

我目前有一個靜態Web應用程序,托管在AWS S3存儲桶托管中。 后端API在Lambda / API網關上運行。 我有一個連續的開發管道,該管道可以自動從GitHub存儲庫構建(使用CodeBuild)並將代碼部署(使用CodeDeploy)到S3。

我現在遇到的問題是,無服務器部署的代碼與我需要在本地環境上運行的代碼不同。

例如,我希望我的本地環境從本地主機調用API,但是我希望生產環境從類似api.example.com的站點調用API。 另外,還有一些不同的代碼可以部署到Lambda,而這些代碼不會在不還原更改的情況下在本地運行。

另一個示例:本地API在Express服務器上運行,但是在AWS上,代碼需要包裝在exports.handler = async (event, context, callback) => {...}以便在Lambda上無服務器運行。

我的問題是,我該如何處理Git存儲庫中本地和無服務器之間的這些差異?

有兩種方法可以處理此問題。 其中之一是在構建步驟中設置正確的數據。 例如,您可以擁有一個配置文件,該文件是在構建步驟中使用環境中的設置構建的,如果未設置,則將這些選項默認為開發選項。 即使在構建步驟中,也要從環境中讀取設置,這是實現配置更改的一種常用方法。

另一種方法是擁有兩個配置文件(開發和生產),並在構建期間使用正確的配置文件。 您的CD管道可以知道您正在為生產而構建,並使用配置中的正確值。

通常,為此使用Git分支不是一個好選擇,因為它可能會引起很多沖突,並且不必要地將設置從一個復制到另一個,這可能是您不希望的。

在我看來,為此使用Codepipeline,CodeBuild和Cloudformation可能是一個不錯的選擇。 您沒有指定您已經在使用的內容,因此我以它為例。

它將需要一些升級工具才能工作。 首先,您可以看一下CodeStar,它可以讓您在幾分鍾內完成一個示例(您可以根據自己的需要進行編輯)。 它可以輪詢github存儲庫以獲取特定分支上的更改以啟動構建。

在管道中,您可以說4個階段:源代碼(從git中拉出源代碼),構建(通過CodeBuild創建構建構件),開發/測試環境以及最終生產。

您可以將git repo中的非敏感配置保留在每個不同的開發和生產配置的不同參數文件中(對於cloudformation應用程序堆棧)。 作為部署階段的一部分,您將用於開發和生產的其他(json)參數文件(例如,來自github存儲庫)注入到cloudformation堆棧中。 您還可以通過參數覆蓋注入其中的一些(方便使用的地方,例如您要使用“構建標簽”,例如commit id或其他名稱)。

考慮使用Secrets Manager來處理用戶名/密碼對等敏感位(或可能是所有配置-這也是一個選擇)。 在每個環境中使用Secrets Manager密鑰。 將Secrets Manager密鑰(dev或prod)作為輸入參數(cloudformation)發送到給定的應用程序堆棧。 從應用程序代碼中提取Secrets Manager密鑰/值(使用IAM角色將Lambda的特權授予特定的Secrets Manager密鑰)並使用密鑰緩存

此外,順便說一句-如果尚未使用AWS SAM(本地),請考慮使用。

目的是:

  • 將配置與代碼分開
  • 自動化您的構建和部署
  • 最小化人為錯誤的范圍
  • 幫助減少或完全消除部署期間的停機時間
  • 回滾的簡單方法(例如,git revert)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM