

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

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

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

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

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

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

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

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

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

 **自動化** 

 在定義不可變基礎設施的部署策略時，建議您盡可能使用[自動化](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 中刪除流量，然後將使用者傳送回以前的版本。如果部署成功，則您可以繼續以期望的速度進行部署，同時監控變更是否有錯誤，直到完全部署為止。您可以使用允許進行金絲雀部署的[部署組態](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)：與金絲雀部署類似，不同之處在於整個應用程式須並行部署。您可在兩個堆疊 (藍色和綠色) 之間交替部署。再次強調，您可以將流量傳送到新版本，且如果發現部署問題，則可以回復到舊版本。通常會一次切換所有流量，但您也可以將一小部分的流量用於每個版本，以使用 Amazon Route 53 的加權 DNS 路由功能，提高新版本的採用率。您可以使用允許進行藍/綠部署的部署組態來設定 AWS CodeDeploy 及 [AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2020-05-18-ts-deploy.html)。 

![Diagram showing blue/green deployment with AWS Elastic Beanstalk and Amazon Route 53](http://docs.aws.amazon.com/zh_tw/wellarchitected/2023-10-03/framework/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 格式以文字檔撰寫。範本需要特定語法和結構，而這取決於所建立和管理的資源類型。您可以使用任何程式碼編輯器 (例如 AWS Cloud9) 以 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 和第三方服務的生命週期。 
+  實作可將使用者所受到的影響降到最低的部署模式。 
  +  金絲雀部署： 
    + [ 設定 API Gateway 金絲雀版本部署 ](https://docs.aws.amazon.com/apigateway/latest/developerguide/canary-release.html)
    + [ 使用 AWS App Mesh 為 Amazon ECS 建立具有金絲雀部署的管道 ](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)。 
+  偵測組態或狀態的偏移。如需詳細資訊，請參閱[偵測堆疊和資源的未受管組態變更](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)