

# REL08-BP04 使用不可變基礎設施進行部署
<a name="rel_tracking_change_management_immutable_infrastructure"></a>

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

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

 **預期成果：**使用不可變基礎設施，不允許[就地修改](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/deployment-strategies.html#in-place-deployments)以執行工作負載內的基礎設施資源。相反地，在需要變更時，會以平行方式與現有資源一起部署新的、包含所有必要變更的更新後基礎設施資源集。此部署會自動進行驗證，如果成功，流量會逐漸轉移到新的資源集。

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

 **常見的反模式：**
+  對執行中的基礎設施資源實作就地變更。

 **建立此最佳實務的優勢：**
+  **提高跨環境的一致性：**由於跨環境的基礎設施資源沒有差異，因此可以提高一致性並簡化測試。
+  **降低組態偏移：**透過將基礎設施資源取代為已知且版本控制的組態，可將基礎設施設為已知、經過測試且可信狀態，以避免組態偏移。
+  **可靠的不可分割部署：**部署可以順利完成，也可以保持不變，從而提高部署流程的一致性和可靠性。
+  **簡化部署：**部署不需要支援升級，因此會得到簡化。升級只是新的部署。
+  **利用快速的回復及復原程序打造更安全的部署：**前一個運作版本並未變更，因此部署變得更加安全。如果偵測到錯誤，您可以回復至該版本。
+  **增強的安全狀態：**透過不允許變更基礎設施，可以停用遠端存取機制 (例如 SSH)。這可減少攻擊媒介，從而改善組織的安全狀態。

 **未建立此最佳實務時的曝險等級：**中 

## 實作指引
<a name="implementation-guidance"></a>

 ** Automation** 

 定義不可變基礎設施部署策略時，建議盡可能使用[自動化](https://aws.amazon.com/iam/)來提高可重複性並將人為錯誤的可能性降至最低。如需詳細資訊，請參閱 [REL08-BP05 透過自動化部署變更](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_tracking_change_management_automated_changemgmt.html)和[安全且無需人為干預的自動化部署](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/)。

 使用[基礎設施即程式碼 (IaC)](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html) 時，基礎設施佈建、協同運作和部署步驟會以程式設計、描述性和宣告式的方式定義，並儲存在原始檔控制系統中。利用基礎設施即程式碼可讓您更輕鬆地自動部署基礎設施，並協助您實現基礎設施不可變性。

 **部署模式** 

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

 [https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/canary-deployments.html](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/canary-deployments.html)：將少量客戶導向至新版本的實務，通常會在單一服務執行個體 (Canary) 上執行。之後，您可以仔細檢查所產生的任何行為變更或錯誤。如果遇到嚴重問題，可以從 Canary 中刪除流量，然後將使用者傳送回以前的版本。如果部署成功，則您可以繼續以期望的速度進行部署，同時監控變更是否有錯誤，直到完全部署為止。可以使用允許 Canary 部署的[部署組態](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)來設定 AWS CodeDeploy。

 [https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html)：與 Canary 部署類似，不同之處在於整個應用程式須並行部署。您可在兩個堆疊 (藍色和綠色) 之間交替部署。再次強調，您可以將流量傳送到新版本，且如果發現部署問題，則可以回復到舊版本。通常，會一次切換所有流量，但您也可以將一小部分的流量用於每個版本，以使用 Amazon Route 53 的加權 DNS 路由功能，提高新版本的採用率。可以使用允許藍/綠部署的部署組態來設定 AWS CodeDeploy 和 [AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2020-05-18-ts-deploy.html)。

![\[顯示使用 AWS Elastic Beanstalk 和 Amazon Route 53 進行藍/綠部署的圖表\]](http://docs.aws.amazon.com/zh_tw/wellarchitected/latest/reliability-pillar/images/blue-green-deployment.png)


 **漂移偵測** 

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

### 實作步驟
<a name="implementation-steps"></a>
+  禁止就地修改執行中的基礎設施資源。
  +  您可以使用 [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/) 指定誰或哪些服務可以存取 AWS 中的服務和資源、集中管理精細權限，以及分析存取以完善 AWS 中的權限。
+  自動部署基礎設施資源以提高可重複性，並最大限度地減少發生人為錯誤的可能性。
  +  如 [DevOps on AWS 簡介](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/automation.html)中所述，自動化是 AWS 服務的基石，並在所有服務、功能和產品中獲得內部支援。
  +  *[預製](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/prebaking-vs.-bootstrapping-amis.html)*您的 Amazon Machine Image (AMI) 可以加快啟動它們的時間。[EC2 Image Builder](https://aws.amazon.com/image-builder/) 是一項全受管 AWS 服務，可協助您自動建立、維護、驗證、共用和部署自訂、安全且最新的 Linux 或 Windows 自訂 AMI。
  +  支援自動化的一些服務包括：
    +  [AWS Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/) 是一項服務，可在熟悉的伺服器 (例如 Apache、Nginx、Passenger 和 IIS) 上部署和擴展以 Java、.NET、PHP、Node.js、Python、Ruby、Go 和 Docker 開發的 Web 應用程式。
    +  [AWS Proton](https://aws.amazon.com/proton/) 協助平台團隊連接並協調開發團隊在基礎設施佈建、程式碼部署、監控和更新方面所需的所有不同工具。AWS Proton 可啟用無伺服器和容器型應用程式的自動化基礎設施即程式碼佈建和部署。
  +  利用基礎設施即程式碼可讓您輕鬆地自動部署基礎設施，並協助實現基礎設施的不可變性。AWS 會提供能以程式化、描述性和宣告式的方式建立、部署和維護基礎設施的服務。
    +  [AWS CloudFormation](https://aws.amazon.com/cloudformation/) 幫助開發人員以有序和可預測的方式建立 AWS 資源。資源會使用 JSON 或 YAML 格式以文字檔撰寫。範本需要特定語法和結構，而這取決於所建立和管理的資源類型。您可以使用任何程式碼編輯器以 JSON 或 YAML 撰寫資源、將其簽入版本控制系統，然後 CloudFormation 便會以安全、可重複的方式建置指定的服務。
    +  [AWS Serverless Application Model (AWS SAM)](https://aws.amazon.com/serverless/sam/) 是可用來在 AWS 上建置無伺服器應用程式的開放原始碼架構。AWS SAM 與其他 AWS 服務整合，是 CloudFormation 的擴展功能。
    +  [AWS Cloud Development Kit (AWS CDK)](https://aws.amazon.com/cdk/) 是一個開放原始碼軟體開發架構，可用來建模，並使用熟悉的程式設計語言來佈建您的雲端應用程式資源。您可以使用 AWS CDK 透過 TypeScript、Python、Java 和 .NET 來建模應用程式基礎設施。AWS CDK 會在背景中使用 CloudFormation 以透過安全、可重複的方式佈建資源。
    +  [AWS 雲端控制 API](https://aws.amazon.com/cloudcontrolapi/) 引入一組通用的「建立」、「讀取」、「更新」、「刪除」和「清單」(CRUDL) API，協助開發人員以簡單且一致的方式管理雲端基礎設施。Cloud Control API 通用 API 可讓開發人員統一管理 AWS 和第三方服務的生命週期。
+  實作可將使用者所受到的影響降到最低的部署模式。
  +  Canary 部署：
    + [設定 API Gateway Canary 發行部署](https://docs.aws.amazon.com/apigateway/latest/developerguide/canary-release.html)
    + [使用 AWS App Mesh 為 Amazon ECS 建立具有 Canary 部署的管道](https://aws.amazon.com/blogs/containers/create-a-pipeline-with-canary-deployments-for-amazon-ecs-using-aws-app-mesh/)
  +  藍/綠部署：[《AWS 上的藍/綠部署》白皮書](https://docs.aws.amazon.com/whitepapers/latest/blue-green-deployments/welcome.html)說明了實作藍/綠部署策略的[範例技術](https://docs.aws.amazon.com/whitepapers/latest/blue-green-deployments/implementation-techniques.html)。
+  偵測組態或狀態的偏移。如需詳細資訊，請參閱 [Detecting unmanaged configuration changes to stacks and resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)。

## 資源
<a name="resources"></a>

 **相關的最佳實務：**
+ [ REL08-BP05 使用自動化部署變更](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_tracking_change_management_automated_changemgmt.html)

 **相關文件：**
+ [自動化安全、無人為介入的部署](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/)
+ [利用 AWS CloudFormation 在 Nubank 建立不可變基礎設施](https://aws.amazon.com/blogs/mt/leveraging-immutable-infrastructure-nubank/)
+ [基礎設施即程式碼](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)
+ [實作警示以自動檢測 AWS CloudFormation 堆疊中的漂移](https://docs.aws.amazon.com/blogs/mt/implementing-an-alarm-to-automatically-detect-drift-in-aws-cloudformation-stacks/)

 **相關影片：**
+ [AWS re:Invent 2020：透過不變性實現可靠性、一致性和信心](https://www.youtube.com/watch?v=jUSYnRztttY)