

# SEC11-BP06 以程式設計方式部署軟體
<a name="sec_appsec_deploy_software_programmatically"></a>

盡可能以程式設計方式進行軟體部署。此方法可減少部署失敗或因人為疏失而發生非預期問題的機率。

 **預期結果：**您測試的工作負載版本是您部署的版本，且每次都會一致地執行部署。您可以將工作負載的組態外部化，如此有助於在無變動的情況下部署到不同的環境。您可以使用軟體套件的加密簽章來驗證環境之間沒有任何變化。

**常見的反模式：**
+  手動部署軟體至生產環境。
+  手動執行因應不同環境需求的軟體變更。

**建立此最佳實務的優勢：**
+  提高軟體發佈程序的可信度。
+  降低變更失敗影響到業務功能的風險。
+  因變更風險降低而增加發佈規律。
+  部署其間意外事件的自動回復能力。
+  可以密碼編譯方式證明所測試的軟體就是實際部署的軟體。

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

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

 要維護強大且可靠的應用程式基礎設施，請實作安全且自動化的部署實務。此實務與從生產環境移除持續的人工存取、使用 CI/CD 工具進行部署，以及將環境特定的組態資料外化相關。遵循此方法可以增強安全性、降低人為錯誤的風險，並可簡化部署程序。

 您可以建置您的 AWS 帳戶 結構，以從生產環境中移除持續的人力存取。此做法可將未經授權的變更或意外修改的風險降至最低，進而改善生產系統的完整性。您可以使用 [AWS CodeBuild](https://aws.amazon.com/codebuild/) 和 [AWS CodePipeline](https://aws.amazon.com/codepipeline/) 等 CI/CD 工具來執行部署，而不是直接以人力存取。您可以使用這些服務來自動化建置、測試和部署處理程序，進而減少手動介入並提高一致性。

 若要進一步增強安全性和可追蹤性，您可以在測試後簽署應用程式套件，並在部署期間驗證這些簽署。若要這麼做，請使用密碼編譯工具，例如 [AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 或 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/)。您可以透過簽署和驗證套件，確保僅將已授權和已驗證的程式碼部署到您的環境。

 此外，您的團隊可以建立工作負載架構，以從外部來源取得環境特定的組態資料，例如 [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。此做法會將應用程式的程式碼與組態資料分開，這樣就能協助您獨立管理和更新組態，而無需修改應用程式的程式碼本身。

 若要簡化基礎設施佈建和管理，請考慮使用基礎設施即程式碼 (IaC) 工具，例如 [AWS CloudFormation](https://aws.amazon.com/cloudformation/) 或 [AWS CDK](https://aws.amazon.com/cdk/)。您可以使用這些工具將基礎設施定義為程式碼，以提高跨不同環境部署的一致性和可重複性。

 考慮採用 Canary 部署，驗證軟體是否已成功部署。Canary 部署需要在部署至整個生產環境之前，對執行個體或使用者子集進行變更。然後，您可以監控變更造成的影響，並視需要復原，將常發生的問題風險降至最低。

 請遵循[使用多個帳戶組織您的 AWS 環境](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html)白皮書中概述的建議。此白皮書提供有關將環境 (例如開發、預備和生產) 分隔為不同 AWS 帳戶 的指引，進一步增強安全性和隔離性。

### 實作步驟
<a name="implementation-steps"></a>

1.  **設定 AWS 帳戶 結構**：
   +  遵循[使用多個帳戶組織您的 AWS 環境](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html)白皮書中的指引，針對不同的環境 (例如開發、預備和生產) 建立不同的 AWS 帳戶。
   +  為每個帳戶設定適當的存取控制和許可權限，以限制人力對生產環境的直接存取。

1.  **實作 CI/CD 管道**：
   +  使用 [AWS CodeBuild](https://aws.amazon.com/codebuild/) 和 [AWS CodePipeline](https://aws.amazon.com/codepipeline/) 等服務來設定 CI/CD 管道。
   +  設定管道以自動建置、測試和部署應用程式的程式碼至個別環境中。
   +  將程式碼儲存庫與 CI/CD 管道整合，以便於進行版本控制和程式碼管理。

1.  **簽署和驗證應用程式套件**：
   +  測試和驗證應用程式套件後，使用 [AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 或 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) 簽署應用程式套件。
   +  設定部署程序，以在將應用程式套件部署到目標環境之前驗證其簽章。

1.  **外部化組態資料**：
   +  在 [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) 中儲存環境特定的組態資料。
   +  修改應用程式的程式碼，以便在部署或執行時期從參數存放區擷取組態資料。

1.  **基礎設施即程式碼 (IaC)**：
   +  使用 [AWS CloudFormation](https://aws.amazon.com/cloudformation/) 或 [AWS CDK](https://aws.amazon.com/cdk/) 等 IaC 工具，以定義基礎設施即程式碼，並加以管理。
   +  建立 CloudFormation 範本或 CDK 指令碼，以佈建和設定應用程式的必要 AWS 資源。
   +  將 IaC 與您的 CI/CD 管道整合，以自動部署基礎設施變更，以及應用程式的程式碼變更。

1.  **實作 Canary 部署**：
   +  將部署程序設定為支援 Canary 部署，其會在您將變更部署到整個生產環境之前，先推廣到執行個體或使用者子集。
   +  使用 [AWS CodeDeploy](https://aws.amazon.com/codedeploy/) 或 [AWS ECS](https://aws.amazon.com/ecs/) 等服務管理 Canary 部署，並監控變更造成的影響。
   +  如果在 Canary 部署期間偵測到問題，請實作復原機制以還原至先前的穩定版本。

1.  **監控和稽核**：
   +  設定監控和記錄機制，以追蹤部署、應用程式效能和基礎設施變更。
   +  使用 [Amazon CloudWatch](https://aws.amazon.com/cloudwatch/) 和 [AWS CloudTrail](https://aws.amazon.com/cloudtrail/) 等服務來收集和分析日誌和指標。
   +  實作稽核與合規檢查，確認是否遵循安全性最佳實務及法規要求。

1.  **持續改善：**
   +  定期審查和更新您的部署實務，並納入對於先前部署的意見回饋，和從中學到的經驗。
   +  盡可能自動化部署程序，以減少手動介入和潛在的人為錯誤。
   +  與跨部門團隊合作 (例如，維運或資安)，以協調並持續改善部署實務。

 遵循這些步驟，您可以在AWS您的環境中實作安全且自動化的部署實務，藉此增強安全性、降低人為錯誤的風險，並簡化部署程序。

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

 **相關的最佳實務：**
+  [SEC11-BP02 自動化在整個開發和發布生命週期的測試](sec_appsec_automate_testing_throughout_lifecycle.md) 
+  [DL.CI.2 觸發程序會在原始碼修改後自動建置](https://docs.aws.amazon.com/wellarchitected/latest/devops-guidance/dl.ci.2-trigger-builds-automatically-upon-source-code-modifications.html) 

 **相關文件：**
+  [配合有效管控，加速在 AWS 的部署](https://aws.amazon.com/blogs/architecture/accelerate-deployments-on-aws-with-effective-governance/) 
+  [自動化安全、無人為介入的部署](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/) 
+  [使用 AWS Certificate Manager Private CA 和 AWS Key Management Service 非對稱金鑰的程式碼簽署](https://aws.amazon.com/blogs/security/code-signing-aws-certificate-manager-private-ca-aws-key-management-service-asymmetric-keys/) 
+  [程式碼簽署，AWS Lambda 的信任和完整性控制](https://aws.amazon.com/blogs/aws/new-code-signing-a-trust-and-integrity-control-for-aws-lambda/) 

 **相關影片：**
+  [無人為介入：Amazon 的自動化持續交付管道](https://www.youtube.com/watch?v=ngnMj1zbMPY) 

 **相關範例：**
+  [使用 AWS Fargate 的藍/綠部署](https://catalog.us-east-1.prod.workshops.aws/workshops/954a35ee-c878-4c22-93ce-b30b25918d89/en-US) 