

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

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

**預期成果：**讓人員遠離資料是在 AWS 雲端 中安全建置的重要原則。這項原則包括軟體的部署方式。

 不仰賴人員的軟體部署具備更高的可信度，因為測試結果就是部署結果，而且每次部署都會一致。軟體應該不需要變更就能在不同環境中運作。使用十二因素應用程式開發的原則時，特別是指組態外部化，可以將相同的程式碼部署到多個環境，而不需要任何變更。密碼編譯型簽署的軟體套件是用來確認環境之間未發生任何變更的好方法。這個方法的最終成果是降低變更程序中的風險，並且改善軟體發佈一致性。 

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

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

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

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

 建置 AWS 帳戶 結構，以便排除環境的持續人員存取，並使用 CI/CD 工具來執行部署。建立應用程式的架構，使其能從外部來源取得環境特定組態資料，例如 [AWS Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。簽署通過測試的套件，並在部署期間驗證這些簽章。設定 CI/CD 管道，以便推送應用程式程式碼，並可使用Canary 來確認部署成功。使用像是 [AWS CloudFormation](https://aws.amazon.com/cloudformation/) 或 [AWS CDK](https://aws.amazon.com/cdk/) 等工具來定義基礎架構，接著使用 [AWS CodeBuild](https://aws.amazon.com/codebuild/) 和 [AWS CodePipeline](https://aws.amazon.com/codepipeline/) 來執行 CI/CD 操作。 

### 實作步驟
<a name="implementation-steps"></a>
+  建置定義明確的 CI/CD 管道，以便簡化部署程序。 
+  使用 [AWS CodeBuild](https://aws.amazon.com/codebuild/) 和 [AWS 程式碼管道](https://aws.amazon.com/codepipeline/)提供 CI/CD 功能時，可以讓您輕鬆地將安全測試整合至管道中。 
+  遵循[使用多個帳戶整理您的 AWS 環境](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html)白皮書中的環境區隔相關指引。 
+  確認已在執行生產工作負載的環境中無持續人員存取。 
+  建立應用程式的架構，使其支援組態資料的外部化。 
+  考慮使用藍/綠部署模型進行部署。 
+  實作 Canary 來驗證軟體部署成功。 
+  使用像是 [AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 或 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) 等密碼編譯工具來簽署與驗證將要部署的軟體套件。 

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

 **相關的最佳實務：** 
+  [SEC11-BP02 自動化在整個開發和發佈生命週期的測試](sec_appsec_automate_testing_throughout_lifecycle.md) 

 **相關文件：** 
+  [AWS CI/CD 研討會](https://catalog.us-east-1.prod.workshops.aws/workshops/ef1c179d-8097-4f34-8dc3-0e9eb381b6eb/en-US/) 
+  [配合有效管控，加速在 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) 