REL08-BP04 使用不可變的基礎設施部署 - AWS 建構良好的架構

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

REL08-BP04 使用不可變的基礎設施部署

不可變基礎設施是一種模式,要求在生產工作負載上不進行現場的更新、安全性修補或組態變更。需要進行變更時,會在新的基礎設施上建置架構並部署到生產環境。

請遵循不可變基礎設施的部署策略,以提高工作負載部署中的可靠性、一致性和可重複性。

預期成果:使用不可變基礎設施,不允許就地修改以執行工作負載內的基礎設施資源。相反地,在需要變更時,會以平行方式與現有資源一起部署新的、包含所有必要變更的更新後基礎設施資源集。此部署會自動進行驗證,如果成功,流量會逐漸轉移到新的資源集。

此部署策略適用於軟體更新、安全修補程式、基礎設施變更、組態更新和應用程式更新等。

常見的反模式:

  • 對執行中的基礎設施資源實作就地變更。

建立此最佳實務的優勢:

  • 提高跨環境的一致性:由於跨環境的基礎設施資源沒有差異,因此可以提高一致性並簡化測試。

  • 降低組態偏移:透過將基礎設施資源取代為已知且版本控制的組態,可將基礎設施設為已知、經過測試且可信狀態,以避免組態偏移。

  • 可靠的不可分割部署:部署可以順利完成,也可以保持不變,從而提高部署流程的一致性和可靠性。

  • 簡化部署:部署不需要支援升級,因此會得到簡化。升級只是新的部署。

  • 利用快速的回復及復原程序打造更安全的部署:前一個運作版本並未變更,因此部署變得更加安全。如果偵測到錯誤,您可以回復至該版本。

  • 增強型安全狀態:不允許變更基礎設施,即可停用遠端存取機制 (例如 SSH)。這可減少攻擊媒介,從而改善組織的安全狀態。

未建立此最佳實務時的曝險等級:

實作指引

自動化

定義不可變基礎設施部署策略時,建議盡可能使用自動化來提高可重複性並將人為錯誤的可能性降至最低。如需更多詳細資訊,請參閱 REL08-BP05 使用自動化和自動化安全的移手部署來部署變更https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/

使用基礎設施即程式碼 (IaC),基礎設施佈建、協同運作和部署步驟會以程式設計、描述性和宣告式的方式定義,並儲存在原始檔控制系統中。利用基礎設施即程式碼可讓您更輕鬆地自動部署基礎設施,並協助您實現基礎設施不可變性。

部署模式

需要變更工作負載時,不可變基礎設施的部署策略會要求您部署一組新的基礎設施資源,包括所有必要的變更。這組新資源必須遵循推出模式,以最大程度地降低使用者所受到的影響。此部署有兩個主要策略:

Canary 部署:將少量客戶導向至新版本的實務,通常會在單一服務執行個體 (Canary) 上執行。之後,您可以仔細檢查所產生的任何行為變更或錯誤。如果遇到嚴重問題,可以從 Canary 中刪除流量,然後將使用者傳送回以前的版本。如果部署成功,您可以繼續以所需的速度部署,同時監控變更是否有錯誤,直到您完全部署為止。 AWS CodeDeploy 可以使用允許 Canary 部署的部署組態進行設定。

藍/綠部署:與 Canary 部署類似,不同之處在於整個應用程式須並行部署。您可在兩個堆疊 (藍色和綠色) 之間交替部署。再次強調,您可以將流量傳送到新版本,且如果發現部署問題,則可以回復到舊版本。通常所有流量都會一次切換,但您也可以使用每個版本的流量部分,使用 Amazon Route 53 加權DNS路由功能來調用新版本的採用, AWS CodeDeploy 並且AWS Elastic Beanstalk可以使用允許藍/綠部署的部署組態進行設定。

顯示使用 AWS Elastic Beanstalk 和 Amazon Route 53 進行藍/綠部署的圖表

圖 8:使用 AWS Elastic Beanstalk 和 Amazon Route 53 進行藍/綠部署

漂移偵測

漂移被定義為導致基礎設施資源具有與預期不同的狀態或配置的任何變更。任何類型的未受管組態變更都違反了不可變基礎設施的概念,應加以偵測並修正,以便能成功實作不可變基礎設施。

實作步驟

  • 禁止就地修改執行中的基礎設施資源。

  • 自動部署基礎設施資源以提高可重複性,並最大限度地減少發生人為錯誤的可能性。

    • AWS 白皮書 DevOps 上的 簡介中所述,自動化是 AWS 服務的基石,且在所有 服務、功能和產品中都支援內部。

    • 預先封裝 Amazon Machine Image (AMI) 可以加快啟動的時間。EC2 Image Builder 是一項完全受管 AWS 的服務,可協助您自動建立、維護、 up-to-date驗證、共用和部署自訂、安全和 Linux 或 Windows 自訂 AMI。

    • 支援自動化的一些服務包括:

      • AWS Elastic Beanstalk 是一項服務,可在熟悉的伺服器上快速部署和擴展使用 Java、.NET、PHP、Node.js、Python、Ruby、Go 和 Docker 開發的 Web 應用程式,例如 Apache、NGINX、 Passenger 和 IIS。

      • AWS Proton 協助平台團隊連線和協調開發團隊在基礎設施佈建、程式碼部署、監控和更新所需的所有不同工具。 AWS Proton 啟用自動化基礎設施,作為無伺服器和容器型應用程式的程式碼佈建和部署。

    • 將基礎設施用作程式碼可讓您輕鬆自動化基礎設施部署,並協助實現基礎設施不可變性。 AWS 提供以程式設計、描述性且明確的方式啟用基礎設施建立、部署和維護的服務。

      • AWS CloudFormation 協助開發人員以有序且可預測的方式建立 AWS 資源。資源使用 JSON或 YAML 格式以文字檔案寫入。範本需要特定語法和結構,而這取決於所建立和管理的資源類型。您可以在 JSON中或YAML使用任何程式碼編輯器撰寫資源,例如 AWS Cloud9,檢查它是否進入版本控制系統,然後以安全、可重複的方式 CloudFormation 建置指定的服務。

      • AWS Serverless Application Model (AWS SAM) 是一種開放原始碼架構,可用來在 上建置無伺服器應用程式 AWS。與其他 AWS 服務 AWS SAM 整合,也是 的延伸 AWS CloudFormation。

      • AWS Cloud Development Kit (AWS CDK) 是一個開放原始碼軟體開發架構,可用來建模,並使用熟悉的程式設計語言來佈建您的雲端應用程式資源。您可以使用 AWS CDK 在背景 AWS CloudFormation 中使用 TypeScript、Python、Java 和 .NET. AWS CDK uses 來建立應用程式基礎設施的模型,以安全且可重複的方式佈建資源。

      • AWS Cloud Control API 推出一組常見的建立、讀取、更新、刪除和清單 (CRUDL)APIs,協助開發人員以簡單且一致的方式管理其雲端基礎設施。雲端控制API通用APIs可讓開發人員統一管理 AWS 和第三方服務的生命週期。

  • 實作可將使用者所受到的影響降到最低的部署模式。

  • 偵測組態或狀態的偏移。如需詳細資訊,請參閱 Detecting unmanaged configuration changes to stacks and resources

資源

相關的最佳實務:

相關文件:

相關影片: